<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Enus+Linden</id>
	<title>Second Life Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Enus+Linden"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Enus_Linden"/>
	<updated>2026-05-26T00:40:01Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=How_to_add_unit_tests_to_C%2B%2B_code&amp;diff=1016482</id>
		<title>How to add unit tests to C++ code</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=How_to_add_unit_tests_to_C%2B%2B_code&amp;diff=1016482"/>
		<updated>2010-08-25T05:26:52Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The indra C++ codebase is fraught with much peril. To reduce the amount of risk associated with refactoring legacy code, use unit tests. Here&#039;s how to use the new LL_ADD_PROJECT_UNIT_TESTS cmake macro and the existing tut test infrastructure to add a test to the build.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
Tests for a file in a project go into the tests/ subdirectory of that project with the specific naming convention &amp;lt;code&amp;gt;&#039;&#039;code_filename&#039;&#039;_test.cpp&amp;lt;/code&amp;gt;. The test code itself should use our basic tut template (which as of 2009-04 is somewhat in flux). Add a testing target to the bottom of the project using the cmake command LL_ADD_PROJECT_UNIT_TESTS(project sourcelist).&lt;br /&gt;
&lt;br /&gt;
DO NOT add test code that:&lt;br /&gt;
* talks to a database.&lt;br /&gt;
* communicates across a network.&lt;br /&gt;
* touches the file system.&lt;br /&gt;
* requires doing special things to the environment (such as editing configuration files) to run it.&lt;br /&gt;
* takes longer than about ~.1s to run on a modern computer.&lt;br /&gt;
&lt;br /&gt;
== The unit test template ==&lt;br /&gt;
Copy this to a file &amp;lt;code&amp;gt;indra/&#039;&#039;project_name&#039;&#039;/tests/&#039;&#039;code_filename&#039;&#039;_test.cpp&amp;lt;/code&amp;gt; and follow the next section to make sure the build runs with it before you begin writing your test.  (You should expect link errors to appear once you&#039;ve successfully started building the test.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;linden_common.h&amp;quot;&lt;br /&gt;
#include &amp;quot;lltut.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;llclassname.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
namespace tut&lt;br /&gt;
{&lt;br /&gt;
	// Main Setup&lt;br /&gt;
	struct LLClassNameFixture&lt;br /&gt;
	{&lt;br /&gt;
		LLClassNameFixture()&lt;br /&gt;
		{&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
	typedef test_group&amp;lt;LLClassNameFixture&amp;gt; factory;&lt;br /&gt;
	typedef factory::object object;&lt;br /&gt;
	factory tf(&amp;quot;LLClassName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	// Tests&lt;br /&gt;
	template&amp;lt;&amp;gt; template&amp;lt;&amp;gt;&lt;br /&gt;
	void object::test&amp;lt;1&amp;gt;()&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code to make the unit test build ==&lt;br /&gt;
There is a macro that takes care of adding the proper testing targets to the build, you merely need to supply source files and a project name.&lt;br /&gt;
&lt;br /&gt;
=== Basic example ===&lt;br /&gt;
This would go at the bottom of CMakeLists.txt for a project called &amp;quot;chewbacca&amp;quot;. The exact quoting is important! CMake is very particular about list variables.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
INCLUDE(LLAddBuildTest)&lt;br /&gt;
# NOTE: this is different from project_SOURCE_FILES because not all source has tests.&lt;br /&gt;
set(chewbacca_TESTED_SOURCE_FILES&lt;br /&gt;
  chewbacca.cpp&lt;br /&gt;
  person.cpp&lt;br /&gt;
  )&lt;br /&gt;
LL_ADD_PROJECT_UNIT_TESTS(chewbacca &amp;quot;${chewbacca_TESTED_SOURCE_FILES}&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Extended example ===&lt;br /&gt;
The &amp;quot;Chewbacca! What a Wookie!&amp;quot; project code is available on bitbucket ( http://bitbucket.org/poppy_linden/unit-testing-infrastructure-test/ ) and instructions for using it are available on the [[How to test unit test infrastructure changes]] page. Download and run that example, the code will demonstrate the bare basics if the newview code proves too dense to understand. Notably, there are no actual tests, just the scaffolding to get the unit test into the build.&lt;br /&gt;
&lt;br /&gt;
== How to unit test your indra code ==&lt;br /&gt;
We&#039;ve covered the basics of setup, but not the process of writing the tests themselves.&lt;br /&gt;
* [[C++ Unit Testing - How It Works]] - how the test framework generates and builds test projects.&lt;br /&gt;
* [[C++ Unit Testing - Case Study]] - a walkthrough of the whole process (from setup to fixing link errors to writing tests), by example.  Note that this predates Google Mock ([http://code.google.com/p/googlemock/wiki/ForDummies tutorial here]), which provides another way of fixing up link errors.&lt;br /&gt;
* [[C++ Unit Testing - FAQ]]&lt;br /&gt;
&lt;br /&gt;
The following is still relevant, but more focused on overall structure of code than what to write.&lt;br /&gt;
&lt;br /&gt;
== To add a new test ==&lt;br /&gt;
The framework uses template meta-programming to do automatic registration of test functions. Add a new function as a method of the local tut::test_group&amp;lt;local_data&amp;gt; class with a incremented number as the template parameter. In general, you should always append tests, and try to have a limited number of calls to any of the ensure* functions inside the test function.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
namespace tut&lt;br /&gt;
{&lt;br /&gt;
    ... Test group stuff&lt;br /&gt;
&lt;br /&gt;
    ... Other tests&lt;br /&gt;
&lt;br /&gt;
    template&amp;lt;&amp;gt; template&amp;lt;&amp;gt;&lt;br /&gt;
    void math_object::test&amp;lt;7&amp;gt;()&lt;br /&gt;
    {&lt;br /&gt;
        ...&lt;br /&gt;
        ensure(&amp;quot;new test&amp;quot;, (...));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== To add a new test group ==&lt;br /&gt;
Inside the namespace declaration, instantiate a test_group&amp;lt;test_data&amp;gt; object where test_data is a class which will have necessary information for most of the test calls, eg, an open file handle. The constructor for the test_data object will initialize (ala setUp()) and the destructor will free that data as necessary (ala tearDown()). You can provide an empty struct if you have no data. All instance members of the test_data will be available on the stack as newly generated objects in every call to test(). Each test group is limited to 50 actual test methods unless you make a special declaration. For example:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
namespace tut&lt;br /&gt;
{&lt;br /&gt;
    struct uuid_data&lt;br /&gt;
    {&lt;br /&gt;
        LLUUID id;&lt;br /&gt;
    };&lt;br /&gt;
    typedef test_group&amp;lt;uuid_data&amp;gt; uuid_test;&lt;br /&gt;
    typedef uuid_test::object uuid_object;&lt;br /&gt;
    tut::uuid_test tu(&amp;quot;uuid&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    template&amp;lt;&amp;gt; template&amp;lt;&amp;gt;&lt;br /&gt;
    void uuid_object::test&amp;lt;1&amp;gt;()&lt;br /&gt;
    {&lt;br /&gt;
        ensure(&amp;quot;uuid null&amp;quot;, id.isNull());&lt;br /&gt;
        id.generate();&lt;br /&gt;
        ensure(&amp;quot;generate not null&amp;quot;, id.notNull());&lt;br /&gt;
        id.setNull();&lt;br /&gt;
        ensure(&amp;quot;set null&amp;quot;, id.isNull());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== To add new test suites ==&lt;br /&gt;
You need to simply create a new file for the test suites and add a group and then tests. For example, math.cpp tests the llmath library and currently has 2 test groups, each with a few test() functions.&lt;br /&gt;
== Needed Improvements ==&lt;br /&gt;
* I added an ensure_not_equals() function in lltut.h since I felt that was necessary. More ensure functions should be written:&lt;br /&gt;
** ensure_approximately_equals()&lt;br /&gt;
** ensure_memory_matches()&lt;br /&gt;
** ensure_equals&amp;lt;A,B,Compare_fn&amp;gt; () { if(compare(a,b))...}&lt;br /&gt;
* More tests! I only wrote a few to make sure it worked and was fairly easy to use.&lt;br /&gt;
* The test runner needs to have a few more commands and options since it is possible to only run certain test groups. Eg, `./test --group=uuid` could be wired to run the uuid tests.&lt;br /&gt;
* The test runner needs more optional controls on the output. The output is generated through callbacks, so an enterprising programmer that loves GUIs could even write a progress bar output.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Automated Testing]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=947742</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=947742"/>
		<updated>2010-06-25T18:17:07Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* buildout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Repositories ==&lt;br /&gt;
&lt;br /&gt;
Stable trunk repositories:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Maintenance repositories:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps-maint/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base-maint/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client-maint/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout-maint/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x, 2.6.x (untested on 3.0)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Mac Specifics ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a updated install of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix Specifics ===&lt;br /&gt;
&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
=== easy_install ===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Easy Install is a python module (easy_install) bundled with setuptools that lets you automatically download, build, install, and manage Python packages.&amp;quot; I stole that from here: http://peak.telecommunity.com/DevCenter/EasyInstall.&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
  -or-&lt;br /&gt;
 curl -O http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
=== virtualenv ===&lt;br /&gt;
&lt;br /&gt;
Virtualenv builds isolated python environments. To learn more, read this: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, isolated from your system python install, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
== Install methods ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways... we&#039;re encouraging the virtualenv and setup.py method.&lt;br /&gt;
&lt;br /&gt;
=== buildout ===&lt;br /&gt;
&lt;br /&gt;
Buildout has a variety of uses, in PyOGP&#039;s case it is used as a development sandbox. Buildout will checkout all the necessary PyOGP repositories and their dependencies, and configure everything automatically (set up the right path members and install scripts). Once the sandbox is set up, you can make changes to the libs in the parts/ directory (they are actually local mercurial repositories), update the code referenced in buildout (re-run bin/buildout), and test your changes.&lt;br /&gt;
&lt;br /&gt;
It&#039;s really easy to work with...&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
 hg clone http://bitbucket.org/enus_linden/pyogp.buildout (or grab pyogp.buildout-maint to work with maintenance repos)&lt;br /&gt;
&lt;br /&gt;
2. Now turn this checkout into a virtual python environment, independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd pyogp.buildout&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter:&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp_interpreter, a python interpreter which contains all the installed packages and the pyogp libraries and dependencies referenced in the path.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following sample script or run the unittests:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  -or-&lt;br /&gt;
&lt;br /&gt;
  bin/unittests --where=parts/pyogp.lib.base (or pyogp.lib.client)&lt;br /&gt;
&lt;br /&gt;
Enter the avatar&#039;s password when prompted, and you&#039;re on your way to aditi, the Beta Grid.&lt;br /&gt;
&lt;br /&gt;
=== setup.py ===&lt;br /&gt;
&lt;br /&gt;
If you prefer to not use buildout, and to do things a bit more manually, well, you probably don&#039;t need much help here then do you? ;)&lt;br /&gt;
&lt;br /&gt;
Grab the source for each of the pyogp repos, and install them to a virtualenv instance (see above for installing virtualenv if you don&#039;t have it)..&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a simple setup that Enus likes:&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir sandbox&lt;br /&gt;
 cd sandbox&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir hg&lt;br /&gt;
 cd hg&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
 cd ~/hg/pyogp.lib.base&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.lib.client&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.apps&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 ......&lt;br /&gt;
 now, in ~/sandbox/bin/ you&#039;ll have all kinds of pyogp executables for testing stuff out (like region_connect, etc)&lt;br /&gt;
&lt;br /&gt;
You now have all the source, plus a sandbox, for tinkering with pyogp!&lt;br /&gt;
&lt;br /&gt;
To try an executable out, just run it in ~/sandbox/bin/. for example:&lt;br /&gt;
  ~/sandbox/bin/region_connect firstname lastname&lt;br /&gt;
This command will login in your agent to aditi, and will prompt you for a password.&lt;br /&gt;
&lt;br /&gt;
Pass any script the &amp;quot;-h&amp;quot; param to get it&#039;s usage.&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Package_Unittests]] for details...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=947732</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=947732"/>
		<updated>2010-06-25T18:16:52Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* buildout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Repositories ==&lt;br /&gt;
&lt;br /&gt;
Stable trunk repositories:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Maintenance repositories:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps-maint/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base-maint/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client-maint/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout-maint/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x, 2.6.x (untested on 3.0)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Mac Specifics ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a updated install of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix Specifics ===&lt;br /&gt;
&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
=== easy_install ===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Easy Install is a python module (easy_install) bundled with setuptools that lets you automatically download, build, install, and manage Python packages.&amp;quot; I stole that from here: http://peak.telecommunity.com/DevCenter/EasyInstall.&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
  -or-&lt;br /&gt;
 curl -O http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
=== virtualenv ===&lt;br /&gt;
&lt;br /&gt;
Virtualenv builds isolated python environments. To learn more, read this: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, isolated from your system python install, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
== Install methods ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways... we&#039;re encouraging the virtualenv and setup.py method.&lt;br /&gt;
&lt;br /&gt;
=== buildout ===&lt;br /&gt;
&lt;br /&gt;
Buildout has a variety of uses, in PyOGP&#039;s case it is used as a development sandbox. Buildout will checkout all the necessary PyOGP repositories and their dependencies, and configure everything automatically (set up the right path members and install scripts). Once the sandbox is set up, you can make changes to the libs in the parts/ directory (they are actually local mercurial repositories), update the code referenced in buildout (re-run bin/buildout), and test your changes.&lt;br /&gt;
&lt;br /&gt;
It&#039;s really easy to work with...&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
hg clone http://bitbucket.org/enus_linden/pyogp.buildout (or grab pyogp.buildout-maint to work with maintenance repos)&lt;br /&gt;
&lt;br /&gt;
2. Now turn this checkout into a virtual python environment, independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd pyogp.buildout&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter:&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp_interpreter, a python interpreter which contains all the installed packages and the pyogp libraries and dependencies referenced in the path.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following sample script or run the unittests:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  -or-&lt;br /&gt;
&lt;br /&gt;
  bin/unittests --where=parts/pyogp.lib.base (or pyogp.lib.client)&lt;br /&gt;
&lt;br /&gt;
Enter the avatar&#039;s password when prompted, and you&#039;re on your way to aditi, the Beta Grid.&lt;br /&gt;
&lt;br /&gt;
=== setup.py ===&lt;br /&gt;
&lt;br /&gt;
If you prefer to not use buildout, and to do things a bit more manually, well, you probably don&#039;t need much help here then do you? ;)&lt;br /&gt;
&lt;br /&gt;
Grab the source for each of the pyogp repos, and install them to a virtualenv instance (see above for installing virtualenv if you don&#039;t have it)..&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a simple setup that Enus likes:&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir sandbox&lt;br /&gt;
 cd sandbox&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir hg&lt;br /&gt;
 cd hg&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
 cd ~/hg/pyogp.lib.base&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.lib.client&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.apps&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 ......&lt;br /&gt;
 now, in ~/sandbox/bin/ you&#039;ll have all kinds of pyogp executables for testing stuff out (like region_connect, etc)&lt;br /&gt;
&lt;br /&gt;
You now have all the source, plus a sandbox, for tinkering with pyogp!&lt;br /&gt;
&lt;br /&gt;
To try an executable out, just run it in ~/sandbox/bin/. for example:&lt;br /&gt;
  ~/sandbox/bin/region_connect firstname lastname&lt;br /&gt;
This command will login in your agent to aditi, and will prompt you for a password.&lt;br /&gt;
&lt;br /&gt;
Pass any script the &amp;quot;-h&amp;quot; param to get it&#039;s usage.&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Package_Unittests]] for details...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pyogp/Roadmap&amp;diff=947712</id>
		<title>Pyogp/Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pyogp/Roadmap&amp;diff=947712"/>
		<updated>2010-06-25T18:14:34Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
&lt;br /&gt;
== Meta Issues ==&lt;br /&gt;
&lt;br /&gt;
# Update and maintain the published docs at:&lt;br /&gt;
## [http://wiki.secondlife.com/wiki/PyOGP_Client_Library pWiki Pyogp Tech Overview]&lt;br /&gt;
# we need to spend time improving unit test coverage very soon&lt;br /&gt;
# we need to use pylint to help clean up pyogp&lt;br /&gt;
# &amp;lt;s&amp;gt;we need to come up with pyogp specific coding guidelines&amp;lt;/s&amp;gt; (Done - PyOGP_Coding_Guidelines)&lt;br /&gt;
## &amp;lt;s&amp;gt;wiki page indicating style, naming conventions, docstring standards, and examples of adding code (in the lib context)&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Functional Changes ==&lt;br /&gt;
&lt;br /&gt;
# PyOGP Application support &lt;br /&gt;
## adding application level events throughout&lt;br /&gt;
## Raise an application event when disconnected&lt;br /&gt;
# Messaging changes&lt;br /&gt;
## add a MessagingManager, refactor UDPDispatcher and EventQueueClient to purely parse/pack data, and handle messaging concerns in this new class&lt;br /&gt;
### incorporate message.xml handling&lt;br /&gt;
## &amp;lt;s&amp;gt;remove packets.py and refactor accordingly&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
## &amp;lt;s&amp;gt;Merge UPDPacket and Message&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
## &amp;lt;s&amp;gt;merge packet_handler and event_queue_handler&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
## &amp;lt;s&amp;gt;fix http://jira.secondlife.com/browse/PYO-62 (kotler)&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
# &amp;lt;s&amp;gt;update the event handler&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
## &amp;lt;s&amp;gt;create a generic event message class with name and payload&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
## add convenience methods (e.g. to_llsd(), to_dict())&lt;br /&gt;
# Functional Additions&lt;br /&gt;
## teleport&lt;br /&gt;
##* &amp;lt;s&amp;gt;teleport to region/x/y/z&amp;lt;/s&amp;gt; (Done 2009-06-15)&lt;br /&gt;
##* &amp;lt;s&amp;gt;teleport to landmark&amp;lt;/s&amp;gt; (Done 2009-09-01)&lt;br /&gt;
##* receive teleport request&lt;br /&gt;
##* accept teleport request&lt;br /&gt;
##* accept god teleport request&lt;br /&gt;
##* &amp;lt;s&amp;gt;teleport status&amp;lt;/s&amp;gt; (Done 2009-06-15)&lt;br /&gt;
## L$&lt;br /&gt;
##* &amp;lt;s&amp;gt;Send money&amp;lt;/s&amp;gt; (Done 2009-06-17)&lt;br /&gt;
##* &amp;lt;s&amp;gt;money balance updates&amp;lt;/s&amp;gt; (Done 2009-06-17)&lt;br /&gt;
## Actions&lt;br /&gt;
##* &amp;lt;s&amp;gt;Sit on ground&amp;lt;/s&amp;gt; (Done 2009-07-07)&lt;br /&gt;
##* Sit on target&lt;br /&gt;
##* &amp;lt;s&amp;gt;Stand&amp;lt;/s&amp;gt; (Done 2009-07-07)&lt;br /&gt;
##* Gestures&lt;br /&gt;
## Friends&lt;br /&gt;
##* &amp;lt;s&amp;gt;List of friends&amp;lt;/s&amp;gt; (Done 2009-06-15)&lt;br /&gt;
##* &amp;lt;s&amp;gt;offline/online notifications&amp;lt;/s&amp;gt; (Done 2009-06-15)&lt;br /&gt;
##* send/accept friend invite&lt;br /&gt;
##* de-friending&lt;br /&gt;
## Parcels&lt;br /&gt;
##* parcel update events (media)&lt;br /&gt;
## Voice&lt;br /&gt;
##* &amp;lt;s&amp;gt;Voice URI (Can be done using caps; should we bother with it outside a sample?)&amp;lt;/s&amp;gt; (Sample added 2009-10-13)&lt;br /&gt;
##* &amp;lt;s&amp;gt;Voice credentials&amp;lt;/s&amp;gt; (Sample added 2009-10-13)&lt;br /&gt;
## Object Tracking&lt;br /&gt;
##* Avatars (name cache)&lt;br /&gt;
## Appearance management (e.g. avoid having to bake locally)&lt;br /&gt;
##* &amp;lt;s&amp;gt;Initialization of appearance manager and required messages&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
##* &amp;lt;s&amp;gt;Requesting cached Texture ids&amp;lt;/s&amp;gt;(Done)&lt;br /&gt;
##* &amp;lt;s&amp;gt;VisualParams classes&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
##* &amp;lt;s&amp;gt;AgentSetAppearance&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
##* &amp;lt;s&amp;gt;Fetch own avatar visualParams from wearables&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
##* Cases where sim does not have cached TextureEntry(ObjectUpdate) or TextureIDs (AgentCachedTextureResponse) &lt;br /&gt;
##* Attachments&lt;br /&gt;
##* Animations&lt;br /&gt;
## a thousand other things&lt;br /&gt;
&lt;br /&gt;
=== Apps to develop using pyogp ===&lt;br /&gt;
&lt;br /&gt;
# build a regression test suite using pyogp&lt;br /&gt;
# create a viewer proxy using pyogp&lt;br /&gt;
# create something akin to libomv&#039;s TestClient&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP/Roadmap&amp;diff=947702</id>
		<title>PyOGP/Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP/Roadmap&amp;diff=947702"/>
		<updated>2010-06-25T18:13:06Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: Redirected page to Pyogp/Roadmap&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Pyogp/Roadmap]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:PyOGP/navigation&amp;diff=947692</id>
		<title>Template:PyOGP/navigation</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:PyOGP/navigation&amp;diff=947692"/>
		<updated>2010-06-25T18:12:02Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;float:right; width:17em; padding-bottom:1em; padding-left:1em; margin-left: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;[[PyOGP]]&#039;&#039;&#039;&lt;br /&gt;
* [[PyOGP/Roadmap|Roadmap]]&lt;br /&gt;
* [[PyOGP Client Library]]:&lt;br /&gt;
** [[PyOGP Coding Guidelines|Coding Guidelines]]&lt;br /&gt;
** [[PyOGP Client Library Development|Package Development]]&lt;br /&gt;
** [[PyOGP Client Library Development Sandbox|Client Development Sandbox]]&lt;br /&gt;
** [[PyOGP Package Unittests|Package Unittests]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pyogp/Roadmap&amp;diff=947682</id>
		<title>Pyogp/Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pyogp/Roadmap&amp;diff=947682"/>
		<updated>2010-06-25T18:11:10Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* Meta Issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Meta Issues ==&lt;br /&gt;
&lt;br /&gt;
# Update and maintain the published docs at:&lt;br /&gt;
## [http://wiki.secondlife.com/wiki/PyOGP_Client_Library pWiki Pyogp Tech Overview]&lt;br /&gt;
# we need to spend time improving unit test coverage very soon&lt;br /&gt;
# we need to use pylint to help clean up pyogp&lt;br /&gt;
# &amp;lt;s&amp;gt;we need to come up with pyogp specific coding guidelines&amp;lt;/s&amp;gt; (Done - PyOGP_Coding_Guidelines)&lt;br /&gt;
## &amp;lt;s&amp;gt;wiki page indicating style, naming conventions, docstring standards, and examples of adding code (in the lib context)&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Functional Changes ==&lt;br /&gt;
&lt;br /&gt;
# PyOGP Application support &lt;br /&gt;
## adding application level events throughout&lt;br /&gt;
## Raise an application event when disconnected&lt;br /&gt;
# Messaging changes&lt;br /&gt;
## add a MessagingManager, refactor UDPDispatcher and EventQueueClient to purely parse/pack data, and handle messaging concerns in this new class&lt;br /&gt;
### incorporate message.xml handling&lt;br /&gt;
## &amp;lt;s&amp;gt;remove packets.py and refactor accordingly&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
## &amp;lt;s&amp;gt;Merge UPDPacket and Message&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
## &amp;lt;s&amp;gt;merge packet_handler and event_queue_handler&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
## &amp;lt;s&amp;gt;fix http://jira.secondlife.com/browse/PYO-62 (kotler)&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
# &amp;lt;s&amp;gt;update the event handler&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
## &amp;lt;s&amp;gt;create a generic event message class with name and payload&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
## add convenience methods (e.g. to_llsd(), to_dict())&lt;br /&gt;
# Functional Additions&lt;br /&gt;
## teleport&lt;br /&gt;
##* &amp;lt;s&amp;gt;teleport to region/x/y/z&amp;lt;/s&amp;gt; (Done 2009-06-15)&lt;br /&gt;
##* &amp;lt;s&amp;gt;teleport to landmark&amp;lt;/s&amp;gt; (Done 2009-09-01)&lt;br /&gt;
##* receive teleport request&lt;br /&gt;
##* accept teleport request&lt;br /&gt;
##* accept god teleport request&lt;br /&gt;
##* &amp;lt;s&amp;gt;teleport status&amp;lt;/s&amp;gt; (Done 2009-06-15)&lt;br /&gt;
## L$&lt;br /&gt;
##* &amp;lt;s&amp;gt;Send money&amp;lt;/s&amp;gt; (Done 2009-06-17)&lt;br /&gt;
##* &amp;lt;s&amp;gt;money balance updates&amp;lt;/s&amp;gt; (Done 2009-06-17)&lt;br /&gt;
## Actions&lt;br /&gt;
##* &amp;lt;s&amp;gt;Sit on ground&amp;lt;/s&amp;gt; (Done 2009-07-07)&lt;br /&gt;
##* Sit on target&lt;br /&gt;
##* &amp;lt;s&amp;gt;Stand&amp;lt;/s&amp;gt; (Done 2009-07-07)&lt;br /&gt;
##* Gestures&lt;br /&gt;
## Friends&lt;br /&gt;
##* &amp;lt;s&amp;gt;List of friends&amp;lt;/s&amp;gt; (Done 2009-06-15)&lt;br /&gt;
##* &amp;lt;s&amp;gt;offline/online notifications&amp;lt;/s&amp;gt; (Done 2009-06-15)&lt;br /&gt;
##* send/accept friend invite&lt;br /&gt;
##* de-friending&lt;br /&gt;
## Parcels&lt;br /&gt;
##* parcel update events (media)&lt;br /&gt;
## Voice&lt;br /&gt;
##* &amp;lt;s&amp;gt;Voice URI (Can be done using caps; should we bother with it outside a sample?)&amp;lt;/s&amp;gt; (Sample added 2009-10-13)&lt;br /&gt;
##* &amp;lt;s&amp;gt;Voice credentials&amp;lt;/s&amp;gt; (Sample added 2009-10-13)&lt;br /&gt;
## Object Tracking&lt;br /&gt;
##* Avatars (name cache)&lt;br /&gt;
## Appearance management (e.g. avoid having to bake locally)&lt;br /&gt;
##* &amp;lt;s&amp;gt;Initialization of appearance manager and required messages&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
##* &amp;lt;s&amp;gt;Requesting cached Texture ids&amp;lt;/s&amp;gt;(Done)&lt;br /&gt;
##* &amp;lt;s&amp;gt;VisualParams classes&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
##* &amp;lt;s&amp;gt;AgentSetAppearance&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
##* &amp;lt;s&amp;gt;Fetch own avatar visualParams from wearables&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
##* Cases where sim does not have cached TextureEntry(ObjectUpdate) or TextureIDs (AgentCachedTextureResponse) &lt;br /&gt;
##* Attachments&lt;br /&gt;
##* Animations&lt;br /&gt;
## a thousand other things&lt;br /&gt;
&lt;br /&gt;
=== Apps to develop using pyogp ===&lt;br /&gt;
&lt;br /&gt;
# build a regression test suite using pyogp&lt;br /&gt;
# create a viewer proxy using pyogp&lt;br /&gt;
# create something akin to libomv&#039;s TestClient&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pyogp/Roadmap&amp;diff=947672</id>
		<title>Pyogp/Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pyogp/Roadmap&amp;diff=947672"/>
		<updated>2010-06-25T18:10:44Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Meta Issues ==&lt;br /&gt;
&lt;br /&gt;
# Update and maintain the published docs at:&lt;br /&gt;
## [http://wiki.secondlife.com/wiki/PyOGP_Client_Library pWiki Pyogp Tech Overview]&lt;br /&gt;
# we need to spend time improving unit test coverage very soon&lt;br /&gt;
# we need to use pylint to help clean up pyogp&lt;br /&gt;
&amp;lt;s&amp;gt;# we need to come up with pyogp specific coding guidelines&amp;lt;/s&amp;gt; (Done - PyOGP_Coding_Guidelines)&lt;br /&gt;
&amp;lt;s&amp;gt;## wiki page indicating style, naming conventions, docstring standards, and examples of adding code (in the lib context)&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Functional Changes ==&lt;br /&gt;
&lt;br /&gt;
# PyOGP Application support &lt;br /&gt;
## adding application level events throughout&lt;br /&gt;
## Raise an application event when disconnected&lt;br /&gt;
# Messaging changes&lt;br /&gt;
## add a MessagingManager, refactor UDPDispatcher and EventQueueClient to purely parse/pack data, and handle messaging concerns in this new class&lt;br /&gt;
### incorporate message.xml handling&lt;br /&gt;
## &amp;lt;s&amp;gt;remove packets.py and refactor accordingly&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
## &amp;lt;s&amp;gt;Merge UPDPacket and Message&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
## &amp;lt;s&amp;gt;merge packet_handler and event_queue_handler&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
## &amp;lt;s&amp;gt;fix http://jira.secondlife.com/browse/PYO-62 (kotler)&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
# &amp;lt;s&amp;gt;update the event handler&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
## &amp;lt;s&amp;gt;create a generic event message class with name and payload&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
## add convenience methods (e.g. to_llsd(), to_dict())&lt;br /&gt;
# Functional Additions&lt;br /&gt;
## teleport&lt;br /&gt;
##* &amp;lt;s&amp;gt;teleport to region/x/y/z&amp;lt;/s&amp;gt; (Done 2009-06-15)&lt;br /&gt;
##* &amp;lt;s&amp;gt;teleport to landmark&amp;lt;/s&amp;gt; (Done 2009-09-01)&lt;br /&gt;
##* receive teleport request&lt;br /&gt;
##* accept teleport request&lt;br /&gt;
##* accept god teleport request&lt;br /&gt;
##* &amp;lt;s&amp;gt;teleport status&amp;lt;/s&amp;gt; (Done 2009-06-15)&lt;br /&gt;
## L$&lt;br /&gt;
##* &amp;lt;s&amp;gt;Send money&amp;lt;/s&amp;gt; (Done 2009-06-17)&lt;br /&gt;
##* &amp;lt;s&amp;gt;money balance updates&amp;lt;/s&amp;gt; (Done 2009-06-17)&lt;br /&gt;
## Actions&lt;br /&gt;
##* &amp;lt;s&amp;gt;Sit on ground&amp;lt;/s&amp;gt; (Done 2009-07-07)&lt;br /&gt;
##* Sit on target&lt;br /&gt;
##* &amp;lt;s&amp;gt;Stand&amp;lt;/s&amp;gt; (Done 2009-07-07)&lt;br /&gt;
##* Gestures&lt;br /&gt;
## Friends&lt;br /&gt;
##* &amp;lt;s&amp;gt;List of friends&amp;lt;/s&amp;gt; (Done 2009-06-15)&lt;br /&gt;
##* &amp;lt;s&amp;gt;offline/online notifications&amp;lt;/s&amp;gt; (Done 2009-06-15)&lt;br /&gt;
##* send/accept friend invite&lt;br /&gt;
##* de-friending&lt;br /&gt;
## Parcels&lt;br /&gt;
##* parcel update events (media)&lt;br /&gt;
## Voice&lt;br /&gt;
##* &amp;lt;s&amp;gt;Voice URI (Can be done using caps; should we bother with it outside a sample?)&amp;lt;/s&amp;gt; (Sample added 2009-10-13)&lt;br /&gt;
##* &amp;lt;s&amp;gt;Voice credentials&amp;lt;/s&amp;gt; (Sample added 2009-10-13)&lt;br /&gt;
## Object Tracking&lt;br /&gt;
##* Avatars (name cache)&lt;br /&gt;
## Appearance management (e.g. avoid having to bake locally)&lt;br /&gt;
##* &amp;lt;s&amp;gt;Initialization of appearance manager and required messages&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
##* &amp;lt;s&amp;gt;Requesting cached Texture ids&amp;lt;/s&amp;gt;(Done)&lt;br /&gt;
##* &amp;lt;s&amp;gt;VisualParams classes&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
##* &amp;lt;s&amp;gt;AgentSetAppearance&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
##* &amp;lt;s&amp;gt;Fetch own avatar visualParams from wearables&amp;lt;/s&amp;gt; (Done)&lt;br /&gt;
##* Cases where sim does not have cached TextureEntry(ObjectUpdate) or TextureIDs (AgentCachedTextureResponse) &lt;br /&gt;
##* Attachments&lt;br /&gt;
##* Animations&lt;br /&gt;
## a thousand other things&lt;br /&gt;
&lt;br /&gt;
=== Apps to develop using pyogp ===&lt;br /&gt;
&lt;br /&gt;
# build a regression test suite using pyogp&lt;br /&gt;
# create a viewer proxy using pyogp&lt;br /&gt;
# create something akin to libomv&#039;s TestClient&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP&amp;diff=947662</id>
		<title>PyOGP</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP&amp;diff=947662"/>
		<updated>2010-06-25T18:07:20Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* Project Status */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
=== What Is It? ===&lt;br /&gt;
&lt;br /&gt;
Pyogp is an open source project to explore a suite of python based Second Life client libraries and to produce an automated testing framework. &lt;br /&gt;
&lt;br /&gt;
PyOGP is useful for:&lt;br /&gt;
* learning more about Second Life&#039;s client-server relationship&lt;br /&gt;
* prototyping client side features &lt;br /&gt;
* quickly writing tests for software which communicates using LLMessageSystem-like messages&lt;br /&gt;
* demonstrating protocol proposals&lt;br /&gt;
* building test suites which validate Second Life simulator and grid functionality&lt;br /&gt;
&lt;br /&gt;
=== Getting Started ===&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP Client Library Development Sandbox]] for instructions on the mechanics of working with the PyOGP package suite.&lt;br /&gt;
&lt;br /&gt;
For a more comprehensive overview of working within the structure of classes and event systems in PyOGP packages, take a look at [[PyOGP Client Library]].&lt;br /&gt;
&lt;br /&gt;
=== How To Contribute ===&lt;br /&gt;
* Source: [[Pyogp/Client_Lib/The_Development_Sandbox | Checkout Instructions]]. See the [[Open_Source_Portal|Open Source Portal]] for details on being a contributor&lt;br /&gt;
* in-world group: pyogp (open enrollement)&lt;br /&gt;
* IRC: irc://irc.freenode.com/#pyogp&lt;br /&gt;
* Mailing list: https://lists.secondlife.com/cgi-bin/mailman/listinfo/pyogp, pyogp@lists.secondlife.com&lt;br /&gt;
* Jira: http://jira.secondlife.com/browse/PYO&lt;br /&gt;
* Related Meetings&lt;br /&gt;
** Enus Linden&#039;s office hours: Friday @ 1:00 http://slurl.com/secondlife/Longfellow/99/97/28&lt;br /&gt;
&lt;br /&gt;
== Project Status ==&lt;br /&gt;
&lt;br /&gt;
PyOGP has moved to bitbucket! http://bitbucket.org/enus_linden/ &lt;br /&gt;
&lt;br /&gt;
client_proxy is now stable[https://lists.secondlife.com/pipermail/pyogp/2010-June/000255.html], though it&#039;s only logging things currently. &lt;br /&gt;
&lt;br /&gt;
Keep track of progress on the list: https://lists.secondlife.com/cgi-bin/mailman/listinfo/pyogp.&lt;br /&gt;
&lt;br /&gt;
== Pic of the Moment ==&lt;br /&gt;
[[Image:355571.jpg|900x835px|the EnusBots are coming!]]&lt;br /&gt;
&lt;br /&gt;
Image used with permission. Taken by [[User:Opensource_Obscure|Opensource Obscure]]. (thanks oo! &amp;lt;3)&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
Contributions to Pyogp are subject to Linden Lab&#039;s [http://secondlifegrid.net/programs/open_source/submission contributor agreement]. The Pyogp open source code is made available subject to the Apache v2 license. Read more at [http://opensource.org/licenses/apache2.0.php opensource.org] and [http://www.apache.org/licenses/LICENSE-2.0 apache.org].&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;excerpt&amp;gt;&lt;br /&gt;
  Copyright 2008, Linden Research, Inc.&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
  you may not use this file except in compliance with the License.&lt;br /&gt;
  You may obtain a copy of the License at&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
  distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
  See the License for the specific language governing permissions and&lt;br /&gt;
  limitations under the License.&lt;br /&gt;
  &amp;lt;/excerpt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Linden Lab and the [[AWG]] ([[AW_Groupies|in-world discussion group page]]) are working together to develop a set of open protocols called the [[Open Grid Protocol]] that can be used to create a virtual world where regions are independently operated (not only by Linden Lab). The project is aiming to allow people (organizations, individuals, and the like) to host their own regions in the virtual world and be able to interact and communicate with people in regions hosted elsewhere. In essence, the project&#039;s goal is to allow open-source region hosting.&lt;br /&gt;
&lt;br /&gt;
AWG and Linden Lab plan to share the effort in writing a test harness that executes tests against implementations of the Open Grid Protocol. &lt;br /&gt;
&lt;br /&gt;
The intent is not to test SL or OpenSim (or gridX) themselves. Rather, the desire is to create a framework where the implementations of the protocols can be tested in any virtual environment implemented per the Open Grid Protocols as documented. The goal is to use the test harness to test the implementations to make sure that the virtual environment is interoperable with the other virtual environments that have implemented the OGP. However, we also plan to test the current SL protocols (the Legacy protocols). We plan to be able to test at the smallest functional level possible, akin to unit testing, and to have the ability to use the framework to sequence steps to enable state specific tests to be run.&lt;br /&gt;
&lt;br /&gt;
The longer-term vision is essentially a [[Pyogp_Client_Lib|client library]], capable of navigating the grid and interacting with the various hosts, sitting next to a testing framework, happily running along telling us what works where, and where something needs a little attention to work according to specification...&lt;br /&gt;
&lt;br /&gt;
For more detail on OGP, see a visual representation of the upcoming [[Open Grid Platform Projects Q2-Q3|projects]] and a general [[Structural Design Overview|introduction]].&lt;br /&gt;
&lt;br /&gt;
=== Notes from the kickoff meeting ===&lt;br /&gt;
&lt;br /&gt;
At the AWG meeting held April 29, 2008, we discussed what a test harness could look like that would be used to test the agent-domain, rez-avatar, and overall work being done implementing the open grid protocols. I&#039;d like to summarize, and continue the discussion on the mailing list, in-world, and on the wiki. See [[AWGroupies-2008-04-29|meeting chat log]].&lt;br /&gt;
&lt;br /&gt;
How do we start?&lt;br /&gt;
&lt;br /&gt;
Let&#039;s work on defining the test harness components (from the meeting):&lt;br /&gt;
# Login&lt;br /&gt;
# Caps (and while it&#039;s around the UDP pipe)&lt;br /&gt;
# Message Handlers (see chttp)&lt;br /&gt;
# Basic web server parts for the Agent, Region and grid bits (ideally a snap in framework)&lt;br /&gt;
# Test framework&lt;br /&gt;
# Test data (I put this here, not really as a component of the harness, more as a &amp;quot;i&#039;m not telling you my test account&#039;s password and what are we gonna do about it&amp;quot; thing)&lt;br /&gt;
&lt;br /&gt;
Python seems to be the flavor of choice here, with a requirement that it accommodate non-python components as needed. The repository for the code is proposed to be maintained by Linden Lab, distributed as an open source export, under the Apache v2 License (see http://opensource.org/licenses/apache2.0.php). The process and details here are tentative, and need more attention...&lt;br /&gt;
&lt;br /&gt;
There is plenty to be figured out. How to start, who wants to play, details are all TBD. My role is primarily intended as one who will facilitate dialogue and contribute as much as possible, but this is intended as a joint effort.&lt;br /&gt;
&lt;br /&gt;
-- Enus Linden&lt;br /&gt;
&lt;br /&gt;
[[Category:Architecture Working Group]]&lt;br /&gt;
[[Category:Grid_Interoperability]]&lt;br /&gt;
[[Category: Pyogp|*]]&lt;br /&gt;
[[Category:Pyogp_Kitchen_Sink]]&lt;br /&gt;
[[Category: AW Groupies]]&lt;br /&gt;
[[Category:Automated Testing]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP&amp;diff=947652</id>
		<title>PyOGP</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP&amp;diff=947652"/>
		<updated>2010-06-25T18:05:41Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* Getting Started */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
=== What Is It? ===&lt;br /&gt;
&lt;br /&gt;
Pyogp is an open source project to explore a suite of python based Second Life client libraries and to produce an automated testing framework. &lt;br /&gt;
&lt;br /&gt;
PyOGP is useful for:&lt;br /&gt;
* learning more about Second Life&#039;s client-server relationship&lt;br /&gt;
* prototyping client side features &lt;br /&gt;
* quickly writing tests for software which communicates using LLMessageSystem-like messages&lt;br /&gt;
* demonstrating protocol proposals&lt;br /&gt;
* building test suites which validate Second Life simulator and grid functionality&lt;br /&gt;
&lt;br /&gt;
=== Getting Started ===&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP Client Library Development Sandbox]] for instructions on the mechanics of working with the PyOGP package suite.&lt;br /&gt;
&lt;br /&gt;
For a more comprehensive overview of working within the structure of classes and event systems in PyOGP packages, take a look at [[PyOGP Client Library]].&lt;br /&gt;
&lt;br /&gt;
=== How To Contribute ===&lt;br /&gt;
* Source: [[Pyogp/Client_Lib/The_Development_Sandbox | Checkout Instructions]]. See the [[Open_Source_Portal|Open Source Portal]] for details on being a contributor&lt;br /&gt;
* in-world group: pyogp (open enrollement)&lt;br /&gt;
* IRC: irc://irc.freenode.com/#pyogp&lt;br /&gt;
* Mailing list: https://lists.secondlife.com/cgi-bin/mailman/listinfo/pyogp, pyogp@lists.secondlife.com&lt;br /&gt;
* Jira: http://jira.secondlife.com/browse/PYO&lt;br /&gt;
* Related Meetings&lt;br /&gt;
** Enus Linden&#039;s office hours: Friday @ 1:00 http://slurl.com/secondlife/Longfellow/99/97/28&lt;br /&gt;
&lt;br /&gt;
== Project Status ==&lt;br /&gt;
&lt;br /&gt;
PyOGP is moving to bitbucket! http://bitbucket.org/enus_linden/ &lt;br /&gt;
&lt;br /&gt;
Thanks for the patience as we make this transition.&lt;br /&gt;
&lt;br /&gt;
Keep track of progress on the list: https://lists.secondlife.com/cgi-bin/mailman/listinfo/pyogp.&lt;br /&gt;
&lt;br /&gt;
== Pic of the Moment ==&lt;br /&gt;
[[Image:355571.jpg|900x835px|the EnusBots are coming!]]&lt;br /&gt;
&lt;br /&gt;
Image used with permission. Taken by [[User:Opensource_Obscure|Opensource Obscure]]. (thanks oo! &amp;lt;3)&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
Contributions to Pyogp are subject to Linden Lab&#039;s [http://secondlifegrid.net/programs/open_source/submission contributor agreement]. The Pyogp open source code is made available subject to the Apache v2 license. Read more at [http://opensource.org/licenses/apache2.0.php opensource.org] and [http://www.apache.org/licenses/LICENSE-2.0 apache.org].&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;excerpt&amp;gt;&lt;br /&gt;
  Copyright 2008, Linden Research, Inc.&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
  you may not use this file except in compliance with the License.&lt;br /&gt;
  You may obtain a copy of the License at&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
  distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
  See the License for the specific language governing permissions and&lt;br /&gt;
  limitations under the License.&lt;br /&gt;
  &amp;lt;/excerpt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Linden Lab and the [[AWG]] ([[AW_Groupies|in-world discussion group page]]) are working together to develop a set of open protocols called the [[Open Grid Protocol]] that can be used to create a virtual world where regions are independently operated (not only by Linden Lab). The project is aiming to allow people (organizations, individuals, and the like) to host their own regions in the virtual world and be able to interact and communicate with people in regions hosted elsewhere. In essence, the project&#039;s goal is to allow open-source region hosting.&lt;br /&gt;
&lt;br /&gt;
AWG and Linden Lab plan to share the effort in writing a test harness that executes tests against implementations of the Open Grid Protocol. &lt;br /&gt;
&lt;br /&gt;
The intent is not to test SL or OpenSim (or gridX) themselves. Rather, the desire is to create a framework where the implementations of the protocols can be tested in any virtual environment implemented per the Open Grid Protocols as documented. The goal is to use the test harness to test the implementations to make sure that the virtual environment is interoperable with the other virtual environments that have implemented the OGP. However, we also plan to test the current SL protocols (the Legacy protocols). We plan to be able to test at the smallest functional level possible, akin to unit testing, and to have the ability to use the framework to sequence steps to enable state specific tests to be run.&lt;br /&gt;
&lt;br /&gt;
The longer-term vision is essentially a [[Pyogp_Client_Lib|client library]], capable of navigating the grid and interacting with the various hosts, sitting next to a testing framework, happily running along telling us what works where, and where something needs a little attention to work according to specification...&lt;br /&gt;
&lt;br /&gt;
For more detail on OGP, see a visual representation of the upcoming [[Open Grid Platform Projects Q2-Q3|projects]] and a general [[Structural Design Overview|introduction]].&lt;br /&gt;
&lt;br /&gt;
=== Notes from the kickoff meeting ===&lt;br /&gt;
&lt;br /&gt;
At the AWG meeting held April 29, 2008, we discussed what a test harness could look like that would be used to test the agent-domain, rez-avatar, and overall work being done implementing the open grid protocols. I&#039;d like to summarize, and continue the discussion on the mailing list, in-world, and on the wiki. See [[AWGroupies-2008-04-29|meeting chat log]].&lt;br /&gt;
&lt;br /&gt;
How do we start?&lt;br /&gt;
&lt;br /&gt;
Let&#039;s work on defining the test harness components (from the meeting):&lt;br /&gt;
# Login&lt;br /&gt;
# Caps (and while it&#039;s around the UDP pipe)&lt;br /&gt;
# Message Handlers (see chttp)&lt;br /&gt;
# Basic web server parts for the Agent, Region and grid bits (ideally a snap in framework)&lt;br /&gt;
# Test framework&lt;br /&gt;
# Test data (I put this here, not really as a component of the harness, more as a &amp;quot;i&#039;m not telling you my test account&#039;s password and what are we gonna do about it&amp;quot; thing)&lt;br /&gt;
&lt;br /&gt;
Python seems to be the flavor of choice here, with a requirement that it accommodate non-python components as needed. The repository for the code is proposed to be maintained by Linden Lab, distributed as an open source export, under the Apache v2 License (see http://opensource.org/licenses/apache2.0.php). The process and details here are tentative, and need more attention...&lt;br /&gt;
&lt;br /&gt;
There is plenty to be figured out. How to start, who wants to play, details are all TBD. My role is primarily intended as one who will facilitate dialogue and contribute as much as possible, but this is intended as a joint effort.&lt;br /&gt;
&lt;br /&gt;
-- Enus Linden&lt;br /&gt;
&lt;br /&gt;
[[Category:Architecture Working Group]]&lt;br /&gt;
[[Category:Grid_Interoperability]]&lt;br /&gt;
[[Category: Pyogp|*]]&lt;br /&gt;
[[Category:Pyogp_Kitchen_Sink]]&lt;br /&gt;
[[Category: AW Groupies]]&lt;br /&gt;
[[Category:Automated Testing]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP&amp;diff=947642</id>
		<title>PyOGP</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP&amp;diff=947642"/>
		<updated>2010-06-25T18:03:34Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* What Is It? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
=== What Is It? ===&lt;br /&gt;
&lt;br /&gt;
Pyogp is an open source project to explore a suite of python based Second Life client libraries and to produce an automated testing framework. &lt;br /&gt;
&lt;br /&gt;
PyOGP is useful for:&lt;br /&gt;
* learning more about Second Life&#039;s client-server relationship&lt;br /&gt;
* prototyping client side features &lt;br /&gt;
* quickly writing tests for software which communicates using LLMessageSystem-like messages&lt;br /&gt;
* demonstrating protocol proposals&lt;br /&gt;
* building test suites which validate Second Life simulator and grid functionality&lt;br /&gt;
&lt;br /&gt;
=== Getting Started ===&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP Client Library Development Sandbox]] for instructions on how to starting using Pyogp.&lt;br /&gt;
See also [[PyOGP Client Library]] for a more up-to-date page.&lt;br /&gt;
&lt;br /&gt;
=== How To Contribute ===&lt;br /&gt;
* Source: [[Pyogp/Client_Lib/The_Development_Sandbox | Checkout Instructions]]. See the [[Open_Source_Portal|Open Source Portal]] for details on being a contributor&lt;br /&gt;
* in-world group: pyogp (open enrollement)&lt;br /&gt;
* IRC: irc://irc.freenode.com/#pyogp&lt;br /&gt;
* Mailing list: https://lists.secondlife.com/cgi-bin/mailman/listinfo/pyogp, pyogp@lists.secondlife.com&lt;br /&gt;
* Jira: http://jira.secondlife.com/browse/PYO&lt;br /&gt;
* Related Meetings&lt;br /&gt;
** Enus Linden&#039;s office hours: Friday @ 1:00 http://slurl.com/secondlife/Longfellow/99/97/28&lt;br /&gt;
&lt;br /&gt;
== Project Status ==&lt;br /&gt;
&lt;br /&gt;
PyOGP is moving to bitbucket! http://bitbucket.org/enus_linden/ &lt;br /&gt;
&lt;br /&gt;
Thanks for the patience as we make this transition.&lt;br /&gt;
&lt;br /&gt;
Keep track of progress on the list: https://lists.secondlife.com/cgi-bin/mailman/listinfo/pyogp.&lt;br /&gt;
&lt;br /&gt;
== Pic of the Moment ==&lt;br /&gt;
[[Image:355571.jpg|900x835px|the EnusBots are coming!]]&lt;br /&gt;
&lt;br /&gt;
Image used with permission. Taken by [[User:Opensource_Obscure|Opensource Obscure]]. (thanks oo! &amp;lt;3)&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
Contributions to Pyogp are subject to Linden Lab&#039;s [http://secondlifegrid.net/programs/open_source/submission contributor agreement]. The Pyogp open source code is made available subject to the Apache v2 license. Read more at [http://opensource.org/licenses/apache2.0.php opensource.org] and [http://www.apache.org/licenses/LICENSE-2.0 apache.org].&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;excerpt&amp;gt;&lt;br /&gt;
  Copyright 2008, Linden Research, Inc.&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
  you may not use this file except in compliance with the License.&lt;br /&gt;
  You may obtain a copy of the License at&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
  distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
  See the License for the specific language governing permissions and&lt;br /&gt;
  limitations under the License.&lt;br /&gt;
  &amp;lt;/excerpt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Linden Lab and the [[AWG]] ([[AW_Groupies|in-world discussion group page]]) are working together to develop a set of open protocols called the [[Open Grid Protocol]] that can be used to create a virtual world where regions are independently operated (not only by Linden Lab). The project is aiming to allow people (organizations, individuals, and the like) to host their own regions in the virtual world and be able to interact and communicate with people in regions hosted elsewhere. In essence, the project&#039;s goal is to allow open-source region hosting.&lt;br /&gt;
&lt;br /&gt;
AWG and Linden Lab plan to share the effort in writing a test harness that executes tests against implementations of the Open Grid Protocol. &lt;br /&gt;
&lt;br /&gt;
The intent is not to test SL or OpenSim (or gridX) themselves. Rather, the desire is to create a framework where the implementations of the protocols can be tested in any virtual environment implemented per the Open Grid Protocols as documented. The goal is to use the test harness to test the implementations to make sure that the virtual environment is interoperable with the other virtual environments that have implemented the OGP. However, we also plan to test the current SL protocols (the Legacy protocols). We plan to be able to test at the smallest functional level possible, akin to unit testing, and to have the ability to use the framework to sequence steps to enable state specific tests to be run.&lt;br /&gt;
&lt;br /&gt;
The longer-term vision is essentially a [[Pyogp_Client_Lib|client library]], capable of navigating the grid and interacting with the various hosts, sitting next to a testing framework, happily running along telling us what works where, and where something needs a little attention to work according to specification...&lt;br /&gt;
&lt;br /&gt;
For more detail on OGP, see a visual representation of the upcoming [[Open Grid Platform Projects Q2-Q3|projects]] and a general [[Structural Design Overview|introduction]].&lt;br /&gt;
&lt;br /&gt;
=== Notes from the kickoff meeting ===&lt;br /&gt;
&lt;br /&gt;
At the AWG meeting held April 29, 2008, we discussed what a test harness could look like that would be used to test the agent-domain, rez-avatar, and overall work being done implementing the open grid protocols. I&#039;d like to summarize, and continue the discussion on the mailing list, in-world, and on the wiki. See [[AWGroupies-2008-04-29|meeting chat log]].&lt;br /&gt;
&lt;br /&gt;
How do we start?&lt;br /&gt;
&lt;br /&gt;
Let&#039;s work on defining the test harness components (from the meeting):&lt;br /&gt;
# Login&lt;br /&gt;
# Caps (and while it&#039;s around the UDP pipe)&lt;br /&gt;
# Message Handlers (see chttp)&lt;br /&gt;
# Basic web server parts for the Agent, Region and grid bits (ideally a snap in framework)&lt;br /&gt;
# Test framework&lt;br /&gt;
# Test data (I put this here, not really as a component of the harness, more as a &amp;quot;i&#039;m not telling you my test account&#039;s password and what are we gonna do about it&amp;quot; thing)&lt;br /&gt;
&lt;br /&gt;
Python seems to be the flavor of choice here, with a requirement that it accommodate non-python components as needed. The repository for the code is proposed to be maintained by Linden Lab, distributed as an open source export, under the Apache v2 License (see http://opensource.org/licenses/apache2.0.php). The process and details here are tentative, and need more attention...&lt;br /&gt;
&lt;br /&gt;
There is plenty to be figured out. How to start, who wants to play, details are all TBD. My role is primarily intended as one who will facilitate dialogue and contribute as much as possible, but this is intended as a joint effort.&lt;br /&gt;
&lt;br /&gt;
-- Enus Linden&lt;br /&gt;
&lt;br /&gt;
[[Category:Architecture Working Group]]&lt;br /&gt;
[[Category:Grid_Interoperability]]&lt;br /&gt;
[[Category: Pyogp|*]]&lt;br /&gt;
[[Category:Pyogp_Kitchen_Sink]]&lt;br /&gt;
[[Category: AW Groupies]]&lt;br /&gt;
[[Category:Automated Testing]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Package_Unittests&amp;diff=947592</id>
		<title>PyOGP Package Unittests</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Package_Unittests&amp;diff=947592"/>
		<updated>2010-06-25T17:52:19Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
Each package in the lib should have unit tests, which cover as much code as possible. The unit tests evaluate the integrity of the library code itself, in terms of apis, code paths, and dependencies. &lt;br /&gt;
&lt;br /&gt;
Packages under unit test right now:&lt;br /&gt;
 pyogp.lib.base&lt;br /&gt;
 pyogp.lib.client&lt;br /&gt;
&lt;br /&gt;
Unit tests live in directories named test/ within any directory in any package.&lt;br /&gt;
&lt;br /&gt;
== Python test types ==&lt;br /&gt;
&lt;br /&gt;
=== unittest ===&lt;br /&gt;
&lt;br /&gt;
Unit tests are written as standard python unittest implementations. For more on this, see http://docs.python.org/library/unittest.html. &lt;br /&gt;
&lt;br /&gt;
=== doctest ===&lt;br /&gt;
&lt;br /&gt;
doctests are narrative sample uses of code, that may be run via various test wrappers. For more, see http://docs.python.org/library/doctest.html.&lt;br /&gt;
&lt;br /&gt;
== Running tests ==&lt;br /&gt;
&lt;br /&gt;
=== nose ===&lt;br /&gt;
&lt;br /&gt;
We use Nose! http://somethingaboutorange.com/mrl/projects/nose/0.11.1/&lt;br /&gt;
&lt;br /&gt;
Buildout grabs the necessary module. If you are an enterprising soul, please download the nose source and install to your native python or virtualenv instance.&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;Nose Install Steps:&#039;&#039;&#039;&lt;br /&gt;
 # http://somethingaboutorange.com/mrl/projects/nose/nose-0.11.1.tar.gz&lt;br /&gt;
 # gzip -dc nose-0.11.1.tar.gz | tar xf -&lt;br /&gt;
 # cd nose-0.11.1&lt;br /&gt;
 # python setup.py install&lt;br /&gt;
&lt;br /&gt;
=== in buildout ===&lt;br /&gt;
&lt;br /&gt;
After running buildout, there will be a bin/unittests script available. Simply run it, passing which package&#039;s unit tests to run...&lt;br /&gt;
&lt;br /&gt;
 bin/unittests --where=src/pyogp.lib.client/&lt;br /&gt;
 bin/unittests --where=src/pyogp.lib.base/&lt;br /&gt;
&lt;br /&gt;
=== per packages test runs ===&lt;br /&gt;
&lt;br /&gt;
There is a test.py in each of pyogp.lib.*.tests. It works in a buildout context by adding to path all the necessary packages and dependencies, or works outside of buildout assuming your python path has all the necessary modules sourced.&lt;br /&gt;
&lt;br /&gt;
To run it, simply:&lt;br /&gt;
 cd pyogp/lib/base/tests&lt;br /&gt;
 python test.py&lt;br /&gt;
&lt;br /&gt;
Pass test.py a file name, or to run all tests in the package, pass &#039;..&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ensure the necessary modules are in your python instance&#039;s path:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what the buildout generated nose test wrapper looks like on Enus&#039; machine:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/Users/enus/svn/buildout/bin/python&lt;br /&gt;
&lt;br /&gt;
import sys&lt;br /&gt;
sys.path[0:0] = [&lt;br /&gt;
  &#039;/Users/enus/svn/buildout/eggs/uuid-1.30-py2.5.egg&#039;,&lt;br /&gt;
  &#039;/Users/enus/svn/buildout/eggs/indra.base-1.0-py2.5.egg&#039;,&lt;br /&gt;
  &#039;/Users/enus/svn/buildout/eggs/eventlet-0.8.14-py2.5.egg&#039;,&lt;br /&gt;
  &#039;/Users/enus/svn/buildout/eggs/wsgiref-0.1.2-py2.5.egg&#039;,&lt;br /&gt;
  &#039;/Users/enus/svn/buildout/src/pyogp.lib.base&#039;,&lt;br /&gt;
  &#039;/Users/enus/svn/buildout/eggs/nose-0.11.1-py2.5.egg&#039;,&lt;br /&gt;
  &#039;/Users/enus/svn/buildout/eggs/WebOb-0.9.6.1-py2.5.egg&#039;,&lt;br /&gt;
  &#039;/Users/enus/svn/buildout/eggs/elementtree-1.2.7_20070827_preview-py2.5.egg&#039;,&lt;br /&gt;
  &#039;/Users/enus/svn/buildout/eggs/setuptools-0.6c9-py2.5.egg&#039;,&lt;br /&gt;
  &#039;/Users/enus/svn/buildout/eggs/pyOpenSSL-0.9-py2.5-macosx-10.5-i386.egg&#039;,&lt;br /&gt;
  &#039;/Users/enus/svn/buildout/eggs/greenlet-0.2-py2.5-macosx-10.5-i386.egg&#039;,&lt;br /&gt;
  &#039;/Users/enus/svn/buildout/eggs/indra.util-1.0-py2.5.egg&#039;,&lt;br /&gt;
  ]&lt;br /&gt;
&lt;br /&gt;
import nose&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    nose.main(argv=[&#039;nose&#039;]+sys.argv[1:])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Evaluating test coverage ===&lt;br /&gt;
&lt;br /&gt;
Nose has a great tie into the coverage module (http://nedbatchelder.com/code/modules/rees-coverage.html), which evaluates code coverage by our tests. Buildout automatically installs the necessary module, or, you can install it to your python instance via &amp;quot;easy_install coverage&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To run the unittests via a buildout instance, add the following flags (making sure package names match up):&lt;br /&gt;
&lt;br /&gt;
 --with-coverage --cover-package=pyogp.lib.client&lt;br /&gt;
&lt;br /&gt;
For more on the nose test wrapper, see bin/unittests -h.&lt;br /&gt;
&lt;br /&gt;
== Code Coverage ==&lt;br /&gt;
&lt;br /&gt;
Currently, coverage of code by unittest is OK, but, we need to improve it!&lt;br /&gt;
&lt;br /&gt;
=== pyogp.lib.client ===&lt;br /&gt;
&lt;br /&gt;
Current coverage:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[11:32:17] [enus@sune] buildout$ bin/unittests --where=src/pyogp.lib.client/ --with-coverage --cover-package=pyogp.lib.client&lt;br /&gt;
&lt;br /&gt;
Name                            Stmts   Exec  Cover   Missing&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
pyogp.lib.client                    1      1   100%   &lt;br /&gt;
pyogp.lib.client.agent            513    164    31%   35-49, 71, 82, 179-180, 213, 216, 222-239, 272, 281-303, 311-331, 336-345, 350-359, 365-431, 437-446, 452-457, 477-486, 496-533, 552-570, 575-580, 586-587, 593, 600-615, 620-632, 637-644, 649, 658-674, 679-700, 705-746, 751-757, 762-787, 792-804, 818-872, 881-925, 930-953, 967-980, 986-1017, 1024-1044, 1052-1068, 1073, 1080-1086, 1090-1093, 1098-1101, 1105, 1109-1112, 1117-1119&lt;br /&gt;
pyogp.lib.client.appearance       151     76    50%   76-83, 89-97, 122-135, 151-162, 165, 171, 179-183, 194-199, 216-226, 234-249, 257-280, 294-310, 335, 341-347, 354-355&lt;br /&gt;
pyogp.lib.client.assets           125     30    24%   58, 68-123, 145-168, 174, 177, 185-192, 202-211, 215-217, 222-231, 234-261&lt;br /&gt;
pyogp.lib.client.event_queue      153     90    58%   31, 39, 64, 73, 104, 107-109, 118-125, 136-149, 173, 179, 184-215, 220-235, 248-273&lt;br /&gt;
pyogp.lib.client.event_system      89     71    79%   43, 60-67, 82-84, 173-174, 184-185, 193-200, 205, 210&lt;br /&gt;
pyogp.lib.client.exc              136     78    57%   36, 42, 45, 57-60, 64, 73, 76, 86-90, 94, 116, 119, 128, 131, 141-142, 145, 160-161, 164, 173-174, 177, 186-187, 190, 199-200, 203, 212-213, 216, 225-226, 229, 238-239, 242, 261, 273, 285, 302, 305, 317, 330, 333, 345, 348, 356, 359, 367, 370&lt;br /&gt;
pyogp.lib.client.groups           243     54    22%   65-79, 85-90, 97-111, 116-130, 135-144, 149-156, 174-205, 210-215, 221-224, 229-236, 241, 246-252, 262-273, 278-287, 292-310, 315, 320, 325-329, 333-339, 347-359, 364, 369-375, 380-382, 387-404, 424-451, 469-477, 484-488, 492, 496-520, 524-527&lt;br /&gt;
pyogp.lib.client.inventory        495    181    36%   73-80, 84, 88, 93-152, 157-164, 173-180, 191-193, 199-202, 227, 243, 275-277, 295-302, 312, 320-322, 332-338, 350, 362, 373, 378-384, 389-391, 399-408, 417-431, 436-468, 473-480, 522, 559-560, 567-572, 577, 582, 587, 592, 599-601, 606-630, 635-659, 664-697, 702-705, 710-742, 749, 754, 759, 764-775, 780, 784-812, 816-867, 897, 902-909, 914, 924-933, 938, 948-956, 1021-1027, 1036-1040, 1046-1063, 1075-1104, 1109-1150&lt;br /&gt;
pyogp.lib.client.login            205    176    85%   111, 129, 150, 171, 201, 210, 225-226, 234, 281-283, 293, 300-301, 308-313, 341, 343, 347, 361, 370, 374-377, 389, 406, 433&lt;br /&gt;
pyogp.lib.client.objects          612    276    45%   114, 120-132, 143, 159-190, 200, 207, 212-220, 225-227, 235-239, 244-257, 262-284, 289-294, 298-303, 329-332, 340, 354, 357, 367-376, 382-391, 425-461, 466-633, 639-663, 691-693, 729-859, 907-908, 919-967, 971-973, 977-1014, 1037-1067, 1173, 1183-1195, 1203-1205, 1213-1215, 1223-1225, 1233-1235, 1242-1244, 1251-1253, 1260, 1268-1276, 1283, 1291-1299, 1304, 1309-1323, 1328-1344, 1351, 1358-1365, 1372, 1379-1386&lt;br /&gt;
pyogp.lib.client.parcel           372     69    18%   99-112, 122-127, 132-185, 190-212, 219-234, 239-279, 284-299, 304-307, 311, 315, 319, 325-328, 333-338, 343-359, 364-376, 381-389, 394-412, 417-424, 429-447, 452-456, 462, 467-482, 489, 521, 554, 587, 615, 642, 670, 696-699, 704-713, 721-723, 747-750, 755-763, 768-787, 797-873, 878-882, 889, 921, 945, 978, 1006, 1030, 1051, 1083, 1107, 1139&lt;br /&gt;
pyogp.lib.client.permissions       23     18    78%   57-61&lt;br /&gt;
pyogp.lib.client.region           259     91    35%   34, 40-41, 43, 78, 85, 96, 189-195, 199, 223-229, 237-240, 245-250, 255-272, 277-285, 289-315, 321-331, 336-351, 356-361, 366-367, 373-385, 390-396, 401-407, 412-416, 433-448, 453-460, 465-472, 477-514, 519-523, 528-529, 535-565, 570, 575, 580-586, 597-620, 623&lt;br /&gt;
pyogp.lib.client.settings          67     55    82%   146-155, 178-179&lt;br /&gt;
pyogp.lib.client.visualparams     502    495    98%   42-44, 50-53&lt;br /&gt;
-------------------------------------------------------------&lt;br /&gt;
TOTAL                            3946   1925    48%   &lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
Ran 94 tests in 14.455s&lt;br /&gt;
&lt;br /&gt;
FAILED (errors=1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== pyogp.lib.base ===&lt;br /&gt;
&lt;br /&gt;
Nice coverage!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[11:32:40] [enus@sune] buildout$ bin/unittests --where=src/pyogp.lib.base/ --with-coverage --cover-package=pyogp.lib.base&lt;br /&gt;
&lt;br /&gt;
Name                                     Stmts   Exec  Cover   Missing&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
pyogp.lib.base                               1      1   100%   &lt;br /&gt;
pyogp.lib.base.datatypes                   106     73    68%   45, 49, 53, 72, 75, 80, 88-91, 107, 111, 115, 119, 136-141, 150, 153, 158, 184-189, 208, 213, 222-225, 230-232&lt;br /&gt;
pyogp.lib.base.exc                         136     77    56%   33, 36, 42, 45, 57-60, 64, 73, 76, 86-90, 94, 116, 119, 128, 131, 141-142, 145, 160-161, 164, 173-174, 177, 186-187, 190, 199-200, 203, 212-213, 216, 225-226, 229, 238-239, 242, 261, 273, 285, 302, 305, 317, 330, 333, 345, 348, 356, 359, 367, 370&lt;br /&gt;
pyogp.lib.base.message                       1      1   100%   &lt;br /&gt;
pyogp.lib.base.message.circuit              84     69    82%   39, 78-83, 91, 98-104, 134, 149-150, 154&lt;br /&gt;
pyogp.lib.base.message.data                  4      4   100%   &lt;br /&gt;
pyogp.lib.base.message.data_packer          63     48    76%   66, 69-70, 73-75, 78, 81, 84-87, 92, 99, 101&lt;br /&gt;
pyogp.lib.base.message.data_unpacker        65     57    87%   76-80, 83-84, 91, 94, 100&lt;br /&gt;
pyogp.lib.base.message.llsd_builder         39     38    97%   34&lt;br /&gt;
pyogp.lib.base.message.message              63     42    66%   35-36, 43-44, 109-110, 114, 119-136, 141&lt;br /&gt;
pyogp.lib.base.message.message_handler      44     29    65%   38, 47-49, 60, 75-78, 88-90, 93, 97, 100-102, 106&lt;br /&gt;
pyogp.lib.base.message.msgtypes             83     76    91%   45-47, 118, 125, 127, 143&lt;br /&gt;
pyogp.lib.base.message.template            133    105    78%   46, 63, 71, 84, 87-92, 98, 101, 105, 116, 119, 121, 145, 148, 151, 154, 187, 190, 196, 199, 202, 205, 208, 211, 214&lt;br /&gt;
pyogp.lib.base.message.template_dict        58     52    89%   49-52, 100, 106&lt;br /&gt;
pyogp.lib.base.message.template_parser     228    187    82%   172-173, 177, 223, 252, 266-278, 281-294, 297-305, 309-317, 320&lt;br /&gt;
pyogp.lib.base.message.udpdeserializer     180    139    77%   52, 76-78, 116-125, 132, 138, 145-147, 170, 175, 184, 193, 197, 220-230, 240, 262, 274-275, 296-297, 308-315, 321-323, 335&lt;br /&gt;
pyogp.lib.base.message.udpdispatcher       149    108    72%   80, 111, 124-130, 135, 141, 147, 164, 173, 178, 190, 192, 203-211, 220-224, 242-255, 281, 287-288, 297-301, 305&lt;br /&gt;
pyogp.lib.base.message.udpserializer        66     57    86%   72, 89, 110-111, 131, 138, 143-147&lt;br /&gt;
pyogp.lib.base.network                       1      1   100%   &lt;br /&gt;
pyogp.lib.base.network.net                  27     14    51%   31, 35-38, 41-50, 66&lt;br /&gt;
pyogp.lib.base.settings                     67     45    67%   146-155, 167-198&lt;br /&gt;
pyogp.lib.base.utilities                     1      1   100%   &lt;br /&gt;
pyogp.lib.base.utilities.events             35     17    48%   36-38, 43-51, 55-65, 69, 73-74, 78&lt;br /&gt;
pyogp.lib.base.utilities.helpers           107     45    42%   48, 54-58, 64-71, 77-81, 87-100, 106-119, 125-128, 136, 150, 156, 162, 187, 204, 208, 213, 267-268, 270, 275-276, 287-292, 296-305, 309&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
TOTAL                                     1741   1286    73%   &lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
Ran 71 tests in 17.255s&lt;br /&gt;
&lt;br /&gt;
OK&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Writing Test Cases ==&lt;br /&gt;
&lt;br /&gt;
Tests can be written using standard unittest. The tests in pyogp.interop cover some ogp and a couple of legacy cases, these need to be updated to work.&lt;br /&gt;
&lt;br /&gt;
Testing only the call to login.cgi is unique, we don&#039;t need to spawn the client in a coroutine, nor do we need to keep the client alive, we just need to post to the login endpoint and evaluate the response.&lt;br /&gt;
&lt;br /&gt;
=== pyogp.lib.client.test.test_agent ===&lt;br /&gt;
&lt;br /&gt;
This test is a standard unittest instance, which tests agent.py at some level of coverage, and also shows how to use some of the mock objects available for use in testing the libs without connecting to a real grid. The mocks should likely be reworked to be simplified and standardized, but are functional for now.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;# standard python libs&lt;br /&gt;
import unittest&lt;br /&gt;
&lt;br /&gt;
# pyogp&lt;br /&gt;
from pyogp.lib.client.agent import Agent, Home&lt;br /&gt;
from pyogp.lib.client.login import LegacyLoginParams, OGPLoginParams&lt;br /&gt;
from pyogp.lib.client.exc import LoginError&lt;br /&gt;
&lt;br /&gt;
# pyogp tests&lt;br /&gt;
from pyogp.lib.base.tests.mock_xmlrpc import MockXMLRPC&lt;br /&gt;
from pyogp.lib.base.tests.base import MockXMLRPCLogin, MockAgentDomainLogin&lt;br /&gt;
from pyogp.lib.base.network.tests.mockup_client import MockupClient&lt;br /&gt;
import pyogp.lib.base.tests.config &lt;br /&gt;
&lt;br /&gt;
class TestAgent(unittest.TestCase):&lt;br /&gt;
&lt;br /&gt;
    def setUp(self):&lt;br /&gt;
&lt;br /&gt;
        self.legacy_loginuri = &#039;http://localhost:12345/cgi-bin/login.cgi&#039;&lt;br /&gt;
        self.ogp_loginuri = &#039;http://localhost:12345/auth.cgi&#039;&lt;br /&gt;
        self.firstname = &#039;firstname&#039;&lt;br /&gt;
        self.lastname = &#039;lastname&#039;&lt;br /&gt;
        self.password = &#039;secret&#039;&lt;br /&gt;
&lt;br /&gt;
        self.client = Agent()&lt;br /&gt;
&lt;br /&gt;
    def tearDown(self):&lt;br /&gt;
&lt;br /&gt;
        pass&lt;br /&gt;
&lt;br /&gt;
    def test_agent_legacy_login_via_variables(self):&lt;br /&gt;
&lt;br /&gt;
        # override the network client with the mock client pointed at the mock login handler&lt;br /&gt;
        self.loginhandler = MockXMLRPC(MockXMLRPCLogin(), self.legacy_loginuri)  &lt;br /&gt;
&lt;br /&gt;
        self.client.login(self.legacy_loginuri, self.firstname, self.lastname, self.password, start_location = &#039;start&#039;, handler = self.loginhandler, connect_region = False)&lt;br /&gt;
&lt;br /&gt;
        self.assertEquals(self.client.login_response, {&#039;region_y&#039;: &#039;256&#039;, &#039;region_x&#039;: &#039;256&#039;, &#039;first_name&#039;: &#039;&amp;quot;first&amp;quot;&#039;, &#039;secure_session_id&#039;: &#039;00000000-0000-0000-0000-000000000000&#039;, &#039;sim_ip&#039;: &#039;127.0.0.1&#039;, &#039;agent_access&#039;: &#039;M&#039;, &#039;circuit_code&#039;: &#039;600000000&#039;, &#039;look_at&#039;: &#039;[r0.9963859999999999939,r-0.084939700000000006863,r0]&#039;, &#039;session_id&#039;: &#039;00000000-0000-0000-0000-000000000000&#039;, &#039;udp_blacklist&#039;: &#039;EnableSimulator,TeleportFinish,CrossedRegion&#039;, &#039;seed_capability&#039;: &#039;https://somesim:12043/cap/00000000-0000-0000-0000-000000000000&#039;, &#039;agent_id&#039;: &#039;00000000-0000-0000-0000-000000000000&#039;, &#039;last_name&#039;: &#039;last&#039;, &#039;inventory_host&#039;: &#039;someinvhost&#039;, &#039;start_location&#039;: &#039;last&#039;, &#039;sim_port&#039;: &#039;13001&#039;, &#039;message&#039;: &#039;message&#039;, &#039;login&#039;: &#039;true&#039;, &#039;seconds_since_epoch&#039;: &#039;1234567890&#039;})&lt;br /&gt;
&lt;br /&gt;
    def test_agent_legacy_login_via_params(self):&lt;br /&gt;
&lt;br /&gt;
        # override the network client with the mock client pointed at the mock login handler&lt;br /&gt;
        self.loginhandler = MockXMLRPC(MockXMLRPCLogin(), self.legacy_loginuri)&lt;br /&gt;
&lt;br /&gt;
        login_params = LegacyLoginParams(self.firstname, self.lastname, self.password)&lt;br /&gt;
&lt;br /&gt;
        self.client.login(self.legacy_loginuri, login_params = login_params, start_location = &#039;start&#039;, handler = self.loginhandler, connect_region = False)&lt;br /&gt;
&lt;br /&gt;
        self.assertEquals(self.client.login_response, {&#039;region_y&#039;: &#039;256&#039;, &#039;region_x&#039;: &#039;256&#039;, &#039;first_name&#039;: &#039;&amp;quot;first&amp;quot;&#039;, &#039;secure_session_id&#039;: &#039;00000000-0000-0000-0000-000000000000&#039;, &#039;sim_ip&#039;: &#039;127.0.0.1&#039;, &#039;agent_access&#039;: &#039;M&#039;, &#039;circuit_code&#039;: &#039;600000000&#039;, &#039;look_at&#039;: &#039;[r0.9963859999999999939,r-0.084939700000000006863,r0]&#039;, &#039;session_id&#039;: &#039;00000000-0000-0000-0000-000000000000&#039;, &#039;udp_blacklist&#039;: &#039;EnableSimulator,TeleportFinish,CrossedRegion&#039;, &#039;seed_capability&#039;: &#039;https://somesim:12043/cap/00000000-0000-0000-0000-000000000000&#039;, &#039;agent_id&#039;: &#039;00000000-0000-0000-0000-000000000000&#039;, &#039;last_name&#039;: &#039;last&#039;, &#039;inventory_host&#039;: &#039;someinvhost&#039;, &#039;start_location&#039;: &#039;last&#039;, &#039;sim_port&#039;: &#039;13001&#039;, &#039;message&#039;: &#039;message&#039;, &#039;login&#039;: &#039;true&#039;, &#039;seconds_since_epoch&#039;: &#039;1234567890&#039;})&lt;br /&gt;
&lt;br /&gt;
    def test_agent_ogp_login_via_variables(self):&lt;br /&gt;
&lt;br /&gt;
        # override the network client with the mock client pointed at the mock login handler&lt;br /&gt;
        self.loginhandler = MockupClient(MockAgentDomainLogin())&lt;br /&gt;
&lt;br /&gt;
        self.client.login(self.ogp_loginuri, self.firstname, self.lastname, self.password, start_location = &#039;start&#039;, handler = self.loginhandler, connect_region = False)&lt;br /&gt;
&lt;br /&gt;
        self.assertEquals(self.client.login_response,  {&#039;agent_seed_capability&#039;: &#039;http://127.0.0.1:12345/seed_cap&#039;, &#039;authenticated&#039;: True})&lt;br /&gt;
&lt;br /&gt;
    def test_agent_ogp_login_via_params(self):&lt;br /&gt;
&lt;br /&gt;
        # override the network client with the mock client pointed at the mock login handler&lt;br /&gt;
        self.loginhandler = MockupClient(MockAgentDomainLogin())&lt;br /&gt;
&lt;br /&gt;
        login_params = OGPLoginParams(self.firstname, self.lastname, self.password)&lt;br /&gt;
&lt;br /&gt;
        self.client.login(self.ogp_loginuri, self.firstname, self.lastname, self.password, start_location = &#039;start&#039;, handler = self.loginhandler, connect_region = False)&lt;br /&gt;
&lt;br /&gt;
        self.assertEquals(self.client.login_response,  {&#039;agent_seed_capability&#039;: &#039;http://127.0.0.1:12345/seed_cap&#039;, &#039;authenticated&#039;: True})&lt;br /&gt;
&lt;br /&gt;
    def test_agent_login_no_account_info(self):&lt;br /&gt;
&lt;br /&gt;
        self.assertRaises(LoginError, self.client.login, self.ogp_loginuri)&lt;br /&gt;
&lt;br /&gt;
    def test_legacy_get_login_params(self):&lt;br /&gt;
&lt;br /&gt;
        self.client.grid_type = &#039;Legacy&#039;&lt;br /&gt;
        params = self.client._get_login_params(self.firstname, self.lastname, self.password)&lt;br /&gt;
&lt;br /&gt;
        self.assertEquals(type(params), type(LegacyLoginParams(self.firstname, self.lastname, self.password)))&lt;br /&gt;
&lt;br /&gt;
    def test_ogp_get_login_params(self):&lt;br /&gt;
&lt;br /&gt;
        self.client.grid_type = &#039;OGP&#039;&lt;br /&gt;
        params = self.client._get_login_params(self.firstname, self.lastname, self.password)&lt;br /&gt;
&lt;br /&gt;
        self.assertEquals(type(params), type(OGPLoginParams(self.firstname, self.lastname, self.password)))&lt;br /&gt;
&lt;br /&gt;
    &#039;&#039;&#039;&lt;br /&gt;
    def test_failed_legacy_login(self):&lt;br /&gt;
&lt;br /&gt;
        # ToDo: enable mne when you can get me working, it&#039;s &#039;correct&#039;,&lt;br /&gt;
        # but not raising the error properly?&lt;br /&gt;
&lt;br /&gt;
        self.password = &#039;badpassword&#039;&lt;br /&gt;
&lt;br /&gt;
        # override the network client with the mock client pointed at the mock login handler&lt;br /&gt;
        self.loginhandler = MockXMLRPC(MockXMLRPCLogin(), self.legacy_loginuri)  &lt;br /&gt;
&lt;br /&gt;
        self.assertRaises(LoginError, self.client.login, self.legacy_loginuri, self.firstname, self.lastname, self.password, start_location = &#039;start&#039;, handler = self.loginhandler)&lt;br /&gt;
    &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    def test_agent_home_class(self):&lt;br /&gt;
&lt;br /&gt;
        home_string = &amp;quot;{&#039;region_handle&#039;:[r261120, r247040], &#039;position&#039;:[r171.622, r148.26, r79.3938], &#039;look_at&#039;:[r0, r1, r0]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        home = Home(home_string)&lt;br /&gt;
&lt;br /&gt;
        # Note: have not yet worked out precision on floats. Kinda need to&lt;br /&gt;
        self.assertEquals(home.region_handle, [261120, 247040])&lt;br /&gt;
        self.assertEquals(home.position.X, 171.62200000000001)&lt;br /&gt;
        self.assertEquals(home.position.Y, 148.25999999999999)&lt;br /&gt;
        self.assertEquals(home.position.Z, 79.393799999999999)&lt;br /&gt;
        self.assertEquals(home.look_at.X, 0)&lt;br /&gt;
        self.assertEquals(home.look_at.Y, 1)&lt;br /&gt;
        self.assertEquals(home.look_at.Z, 0)&lt;br /&gt;
        self.assertEquals(home.global_x, 261120)&lt;br /&gt;
        self.assertEquals(home.global_y, 247040)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def test_suite():&lt;br /&gt;
    from unittest import TestSuite, makeSuite&lt;br /&gt;
    suite = TestSuite()&lt;br /&gt;
    suite.addTest(makeSuite(TestAgent))&lt;br /&gt;
    return suite&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;br /&gt;
[[Category: Pyogp]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:PyOGP/navigation&amp;diff=947572</id>
		<title>Template:PyOGP/navigation</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:PyOGP/navigation&amp;diff=947572"/>
		<updated>2010-06-25T17:51:54Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;float:right; width:17em; padding-bottom:1em; padding-left:1em; margin-left: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;[[PyOGP]]&#039;&#039;&#039;&lt;br /&gt;
* [[PyOGP Client Library]]:&lt;br /&gt;
** [[PyOGP Coding Guidelines|Coding Guidelines]]&lt;br /&gt;
** [[PyOGP Client Library Development|Package Development]]&lt;br /&gt;
** [[PyOGP Client Library Development Sandbox|Client Development Sandbox]]&lt;br /&gt;
** [[PyOGP Package Unittests|Package Unittests]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development&amp;diff=947532</id>
		<title>PyOGP Client Library Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development&amp;diff=947532"/>
		<updated>2010-06-25T17:45:25Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* How-Tos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Major revisions are needed to pull this document up to speed.&lt;br /&gt;
&lt;br /&gt;
This is the development page for the [[Pyogp]] [[Pyogp/Client_Lib | Client Library]].&lt;br /&gt;
If you want to work with us on PyOGP here is all you need to know.&lt;br /&gt;
&lt;br /&gt;
== Setup and Preliminary Info== &lt;br /&gt;
&lt;br /&gt;
* [[Pyogp/Client_Lib/The_Development_Sandbox| How to setup a development sandbox for developing the library]]&lt;br /&gt;
* [[Pyogp/Client_Lib/Filesystem_Structure| The filesystem structure of pyogp]]&lt;br /&gt;
&lt;br /&gt;
== Development Principles ==&lt;br /&gt;
&lt;br /&gt;
* Tools we use (buildout, eggs, unit tests)&lt;br /&gt;
* How do I add new functionality the best way? See [[PyOGP_Client_Library]] for implementation details.&lt;br /&gt;
&lt;br /&gt;
== How-Tos ==&lt;br /&gt;
&lt;br /&gt;
* [[PyOGP_Client_Library#Extending_Functionality | How do I add a new component/subproject to the project?]]&lt;br /&gt;
* [[PyOGP_Package_Unittests | How do I write and run library unit tests? ]]&lt;br /&gt;
&lt;br /&gt;
== Code Status ==&lt;br /&gt;
*[https://svn.secondlife.com/svn/linden/projects/2008/pyogp/ Current Pyogp Repo] - svn repo of the most up-to-date code we are using for the project&lt;br /&gt;
&lt;br /&gt;
== Coding Guidelines ==&lt;br /&gt;
&lt;br /&gt;
We&#039;ve recently published goals to keep in mind while writing new code for PyOGP. Please follow [[PyOGP_Coding_Guidelines]] when possible.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
* Pyogp created documentation&lt;br /&gt;
** [[Pyogp/Client_Lib/Packet]] - notes that may help understand the rest&lt;br /&gt;
** [[Pyogp/Documentation/Specification/pyogp.lib.base]] - documentation on the code&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* Current Protocols&lt;br /&gt;
** [[Current_login_protocols]] - what login is like now&lt;br /&gt;
** [[Current_Sim_Capabilities]] - capabilities that are currently used&lt;br /&gt;
* OGP Protocols&lt;br /&gt;
** [[Structural_Design]] - the design of the new architecture&lt;br /&gt;
** [[Open Grid Protocol]] - the outline of the OGP protocols&lt;br /&gt;
** [[OGP_Draft_Login|OGP Draft Login flowchart]] - flowchart for current OGP login protocols&lt;br /&gt;
** [[SLGOGP_Teleport_Strawman]] - what login may be like&lt;br /&gt;
** [[Second_Life_Login_API_Strawman]] - what login may be like&lt;br /&gt;
** [[OGP_Draft_Login]] - diagrams of the OGP login&lt;br /&gt;
* General Notes&lt;br /&gt;
** [[Second_Life_Grid_Protocols/Foundation]] - general protocol information&lt;br /&gt;
** [[Protocol]] - this is general information about messaging and the various protocol systems&lt;br /&gt;
** [http://en.wikipedia.org/wiki/Comet_(programming) COMET programming]&lt;br /&gt;
** [[Eventlet]] - a networking library written in Python, probably going to be used for this project&lt;br /&gt;
***NOTE: We have been testing eventlet and it seems there&#039;s a problem posting to the seed capability. &lt;br /&gt;
****[[Pyogp_Client_Lib/Login_Test_Script]] - a very simple test script using eventlet that fails at the post to the seed cap&lt;br /&gt;
***Windows Instructions - Eventlet for Windows is a bit tricky to install&lt;br /&gt;
****[[User:Baba_Yamamoto/Eventlet]] - there are some problems with eventlet that Baba has looked into&lt;br /&gt;
****greenlet - you MUST have Visual Studio 2003 installed to install greenlet on windows (are there binary versions?). Use easy_install greenlet to install it.&lt;br /&gt;
****pyOpenSSl - windows versions&lt;br /&gt;
*****[http://webcleaner.sourceforge.net/pyOpenSSL-0.6.win32-py2.4.exe pyOpenSSL py2.4] - windows pyOpenSSL for Python 2.4&lt;br /&gt;
*****[http://webcleaner.sourceforge.net/pyOpenSSL-0.6.win32-py2.5.exe pyOpenSSL py2.5] - windows pyOpenSSL for Python 2.5&lt;br /&gt;
****util.py - has a dependency on fcntl. Go into eventlet&#039;s util.py, and either comment out all the fcntl calls, or for a slightly (not a good fix) better solution, [https://lists.secondlife.com/pipermail/sldev/2007-September/004790.html Donovan&#039;s Fix]&lt;br /&gt;
** [[Circuit]] - the way to pass two-way information along a UDP connection&lt;br /&gt;
** [[Message]] - more detail of messages&lt;br /&gt;
** [[Reverse_HTTP]] - I believe this is used (or will be) in the OGP protocols&lt;br /&gt;
** [http://www.libsecondlife.org/wiki/Protocol_%28network%29 General Packet Format] - libsecondlife - describes what the general format is for a packet&lt;br /&gt;
** [http://www.libsecondlife.org/wiki/ACK ACKs] - libsecondlife - describes what an ACK is&lt;br /&gt;
* Coding notes&lt;br /&gt;
** [http://www.muthukadan.net/docs/zca.html ZCA Guide] - ZCA that the lib project will be using&lt;br /&gt;
* Python Docs&lt;br /&gt;
** [http://www.python.org/doc/current/lib/module-distutils.html DistUtils] -&lt;br /&gt;
*** [http://www.python.org/community/sigs/current/distutils-sig/ Sig for utils]&lt;br /&gt;
** [http://peak.telecommunity.com/DevCenter/PythonEggs Python Eggs] -&lt;br /&gt;
*** [http://peak.telecommunity.com/DevCenter/setuptools setuptools] - lib to handle eggs&lt;br /&gt;
&lt;br /&gt;
* Old Code&lt;br /&gt;
**[http://pysecondlife.googlecode.com/svn/pyogp/pyogp.lib.base/trunk: Tao Takashi&#039;s Pyogp] - svn repo - Tao Takashi has hit the ground running with an experimental framework which has been made available [http://code.google.com/p/pysecondlife/ here]. &lt;br /&gt;
***Read more at his blogpost describing the start of his work at his very long [http://mrtopf.de/blog/secondlife/worldofsl/setting-up-a-framework-for-a-python-implementation-of-the-open-grid-protocol-technical url]. &lt;br /&gt;
**[[Presence_Code_Python| Sai&#039;s Presence]] and [[Presence_Code_Python_cmd_line| Sai&#039;s Presence_cmd_line]] - Saijanai Kuhn&#039;s first attempts at some Python presence&lt;br /&gt;
**[https://svn.secondlife.com/svn/linden/projects/2008/pyogp_old/ Linden Pyogp] - svn repo of Linden&#039;s first stab at framework, using Sai&#039;s code as a base&lt;br /&gt;
***[https://svn.secondlife.com/svn/linden/projects/2008/pyogp_old/examples/pyogp.lib-login.py pyogp.lib-login.py] - sample script which logs into aditi&#039;s agent domain and establishes a presence on a simulator on vaak:&lt;br /&gt;
***Disclaimer*: Everything in the repo now will change dramatically in the next few weeks as things firm up structure wise. My desires for the work include: a simple, well defined library, a separate test framework (unittest, the initial high level code to be added this week), an samples/examples sandbox, and clean well commented code. That said, none of the above are in place now. They will be. More sophisticated implementations can evolve over time, or can be included on the side of the library...&lt;br /&gt;
**[[Example_protocol_code]] - code written about login and presence&lt;br /&gt;
** [http://zhaewry.wordpress.com/2008/06/05/happy-jumpy-ruths-interop-takes-a-step/ Interop Ruths] - some news that may be of interest to us&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
# The code written as part of this effort is subject to the Apache v2 license. Read more at http://opensource.org/licenses/apache2.0.php.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;excerpt&amp;gt;&lt;br /&gt;
  Copyright 2008, Linden Research, Inc.&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
  you may not use this file except in compliance with the License.&lt;br /&gt;
  You may obtain a copy of the License at&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
  distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
  See the License for the specific language governing permissions and&lt;br /&gt;
  limitations under the License.&lt;br /&gt;
  &amp;lt;/excerpt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development&amp;diff=947522</id>
		<title>PyOGP Client Library Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development&amp;diff=947522"/>
		<updated>2010-06-25T17:44:24Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* How-Tos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Major revisions are needed to pull this document up to speed.&lt;br /&gt;
&lt;br /&gt;
This is the development page for the [[Pyogp]] [[Pyogp/Client_Lib | Client Library]].&lt;br /&gt;
If you want to work with us on PyOGP here is all you need to know.&lt;br /&gt;
&lt;br /&gt;
== Setup and Preliminary Info== &lt;br /&gt;
&lt;br /&gt;
* [[Pyogp/Client_Lib/The_Development_Sandbox| How to setup a development sandbox for developing the library]]&lt;br /&gt;
* [[Pyogp/Client_Lib/Filesystem_Structure| The filesystem structure of pyogp]]&lt;br /&gt;
&lt;br /&gt;
== Development Principles ==&lt;br /&gt;
&lt;br /&gt;
* Tools we use (buildout, eggs, unit tests)&lt;br /&gt;
* How do I add new functionality the best way? See [[PyOGP_Client_Library]] for implementation details.&lt;br /&gt;
&lt;br /&gt;
== How-Tos ==&lt;br /&gt;
&lt;br /&gt;
* [[Pyogp/Client_Lib/newcomponent | How do I add a new component/subproject to the project?]]&lt;br /&gt;
* [[PyOGP_Package_Unittests | How do I write and run library unit tests? ]]&lt;br /&gt;
&lt;br /&gt;
== Code Status ==&lt;br /&gt;
*[https://svn.secondlife.com/svn/linden/projects/2008/pyogp/ Current Pyogp Repo] - svn repo of the most up-to-date code we are using for the project&lt;br /&gt;
&lt;br /&gt;
== Coding Guidelines ==&lt;br /&gt;
&lt;br /&gt;
We&#039;ve recently published goals to keep in mind while writing new code for PyOGP. Please follow [[PyOGP_Coding_Guidelines]] when possible.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
* Pyogp created documentation&lt;br /&gt;
** [[Pyogp/Client_Lib/Packet]] - notes that may help understand the rest&lt;br /&gt;
** [[Pyogp/Documentation/Specification/pyogp.lib.base]] - documentation on the code&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* Current Protocols&lt;br /&gt;
** [[Current_login_protocols]] - what login is like now&lt;br /&gt;
** [[Current_Sim_Capabilities]] - capabilities that are currently used&lt;br /&gt;
* OGP Protocols&lt;br /&gt;
** [[Structural_Design]] - the design of the new architecture&lt;br /&gt;
** [[Open Grid Protocol]] - the outline of the OGP protocols&lt;br /&gt;
** [[OGP_Draft_Login|OGP Draft Login flowchart]] - flowchart for current OGP login protocols&lt;br /&gt;
** [[SLGOGP_Teleport_Strawman]] - what login may be like&lt;br /&gt;
** [[Second_Life_Login_API_Strawman]] - what login may be like&lt;br /&gt;
** [[OGP_Draft_Login]] - diagrams of the OGP login&lt;br /&gt;
* General Notes&lt;br /&gt;
** [[Second_Life_Grid_Protocols/Foundation]] - general protocol information&lt;br /&gt;
** [[Protocol]] - this is general information about messaging and the various protocol systems&lt;br /&gt;
** [http://en.wikipedia.org/wiki/Comet_(programming) COMET programming]&lt;br /&gt;
** [[Eventlet]] - a networking library written in Python, probably going to be used for this project&lt;br /&gt;
***NOTE: We have been testing eventlet and it seems there&#039;s a problem posting to the seed capability. &lt;br /&gt;
****[[Pyogp_Client_Lib/Login_Test_Script]] - a very simple test script using eventlet that fails at the post to the seed cap&lt;br /&gt;
***Windows Instructions - Eventlet for Windows is a bit tricky to install&lt;br /&gt;
****[[User:Baba_Yamamoto/Eventlet]] - there are some problems with eventlet that Baba has looked into&lt;br /&gt;
****greenlet - you MUST have Visual Studio 2003 installed to install greenlet on windows (are there binary versions?). Use easy_install greenlet to install it.&lt;br /&gt;
****pyOpenSSl - windows versions&lt;br /&gt;
*****[http://webcleaner.sourceforge.net/pyOpenSSL-0.6.win32-py2.4.exe pyOpenSSL py2.4] - windows pyOpenSSL for Python 2.4&lt;br /&gt;
*****[http://webcleaner.sourceforge.net/pyOpenSSL-0.6.win32-py2.5.exe pyOpenSSL py2.5] - windows pyOpenSSL for Python 2.5&lt;br /&gt;
****util.py - has a dependency on fcntl. Go into eventlet&#039;s util.py, and either comment out all the fcntl calls, or for a slightly (not a good fix) better solution, [https://lists.secondlife.com/pipermail/sldev/2007-September/004790.html Donovan&#039;s Fix]&lt;br /&gt;
** [[Circuit]] - the way to pass two-way information along a UDP connection&lt;br /&gt;
** [[Message]] - more detail of messages&lt;br /&gt;
** [[Reverse_HTTP]] - I believe this is used (or will be) in the OGP protocols&lt;br /&gt;
** [http://www.libsecondlife.org/wiki/Protocol_%28network%29 General Packet Format] - libsecondlife - describes what the general format is for a packet&lt;br /&gt;
** [http://www.libsecondlife.org/wiki/ACK ACKs] - libsecondlife - describes what an ACK is&lt;br /&gt;
* Coding notes&lt;br /&gt;
** [http://www.muthukadan.net/docs/zca.html ZCA Guide] - ZCA that the lib project will be using&lt;br /&gt;
* Python Docs&lt;br /&gt;
** [http://www.python.org/doc/current/lib/module-distutils.html DistUtils] -&lt;br /&gt;
*** [http://www.python.org/community/sigs/current/distutils-sig/ Sig for utils]&lt;br /&gt;
** [http://peak.telecommunity.com/DevCenter/PythonEggs Python Eggs] -&lt;br /&gt;
*** [http://peak.telecommunity.com/DevCenter/setuptools setuptools] - lib to handle eggs&lt;br /&gt;
&lt;br /&gt;
* Old Code&lt;br /&gt;
**[http://pysecondlife.googlecode.com/svn/pyogp/pyogp.lib.base/trunk: Tao Takashi&#039;s Pyogp] - svn repo - Tao Takashi has hit the ground running with an experimental framework which has been made available [http://code.google.com/p/pysecondlife/ here]. &lt;br /&gt;
***Read more at his blogpost describing the start of his work at his very long [http://mrtopf.de/blog/secondlife/worldofsl/setting-up-a-framework-for-a-python-implementation-of-the-open-grid-protocol-technical url]. &lt;br /&gt;
**[[Presence_Code_Python| Sai&#039;s Presence]] and [[Presence_Code_Python_cmd_line| Sai&#039;s Presence_cmd_line]] - Saijanai Kuhn&#039;s first attempts at some Python presence&lt;br /&gt;
**[https://svn.secondlife.com/svn/linden/projects/2008/pyogp_old/ Linden Pyogp] - svn repo of Linden&#039;s first stab at framework, using Sai&#039;s code as a base&lt;br /&gt;
***[https://svn.secondlife.com/svn/linden/projects/2008/pyogp_old/examples/pyogp.lib-login.py pyogp.lib-login.py] - sample script which logs into aditi&#039;s agent domain and establishes a presence on a simulator on vaak:&lt;br /&gt;
***Disclaimer*: Everything in the repo now will change dramatically in the next few weeks as things firm up structure wise. My desires for the work include: a simple, well defined library, a separate test framework (unittest, the initial high level code to be added this week), an samples/examples sandbox, and clean well commented code. That said, none of the above are in place now. They will be. More sophisticated implementations can evolve over time, or can be included on the side of the library...&lt;br /&gt;
**[[Example_protocol_code]] - code written about login and presence&lt;br /&gt;
** [http://zhaewry.wordpress.com/2008/06/05/happy-jumpy-ruths-interop-takes-a-step/ Interop Ruths] - some news that may be of interest to us&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
# The code written as part of this effort is subject to the Apache v2 license. Read more at http://opensource.org/licenses/apache2.0.php.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;excerpt&amp;gt;&lt;br /&gt;
  Copyright 2008, Linden Research, Inc.&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
  you may not use this file except in compliance with the License.&lt;br /&gt;
  You may obtain a copy of the License at&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
  distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
  See the License for the specific language governing permissions and&lt;br /&gt;
  limitations under the License.&lt;br /&gt;
  &amp;lt;/excerpt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development&amp;diff=947512</id>
		<title>PyOGP Client Library Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development&amp;diff=947512"/>
		<updated>2010-06-25T17:44:11Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* How-Tos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Major revisions are needed to pull this document up to speed.&lt;br /&gt;
&lt;br /&gt;
This is the development page for the [[Pyogp]] [[Pyogp/Client_Lib | Client Library]].&lt;br /&gt;
If you want to work with us on PyOGP here is all you need to know.&lt;br /&gt;
&lt;br /&gt;
== Setup and Preliminary Info== &lt;br /&gt;
&lt;br /&gt;
* [[Pyogp/Client_Lib/The_Development_Sandbox| How to setup a development sandbox for developing the library]]&lt;br /&gt;
* [[Pyogp/Client_Lib/Filesystem_Structure| The filesystem structure of pyogp]]&lt;br /&gt;
&lt;br /&gt;
== Development Principles ==&lt;br /&gt;
&lt;br /&gt;
* Tools we use (buildout, eggs, unit tests)&lt;br /&gt;
* How do I add new functionality the best way? See [[PyOGP_Client_Library]] for implementation details.&lt;br /&gt;
&lt;br /&gt;
== How-Tos ==&lt;br /&gt;
&lt;br /&gt;
* [[Pyogp/Client_Lib/newcomponent | How do I add a new component/subproject to the project?]]&lt;br /&gt;
* [[PyOGP_Package_Unittests | How do I write and run tests? ]]&lt;br /&gt;
&lt;br /&gt;
== Code Status ==&lt;br /&gt;
*[https://svn.secondlife.com/svn/linden/projects/2008/pyogp/ Current Pyogp Repo] - svn repo of the most up-to-date code we are using for the project&lt;br /&gt;
&lt;br /&gt;
== Coding Guidelines ==&lt;br /&gt;
&lt;br /&gt;
We&#039;ve recently published goals to keep in mind while writing new code for PyOGP. Please follow [[PyOGP_Coding_Guidelines]] when possible.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
* Pyogp created documentation&lt;br /&gt;
** [[Pyogp/Client_Lib/Packet]] - notes that may help understand the rest&lt;br /&gt;
** [[Pyogp/Documentation/Specification/pyogp.lib.base]] - documentation on the code&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* Current Protocols&lt;br /&gt;
** [[Current_login_protocols]] - what login is like now&lt;br /&gt;
** [[Current_Sim_Capabilities]] - capabilities that are currently used&lt;br /&gt;
* OGP Protocols&lt;br /&gt;
** [[Structural_Design]] - the design of the new architecture&lt;br /&gt;
** [[Open Grid Protocol]] - the outline of the OGP protocols&lt;br /&gt;
** [[OGP_Draft_Login|OGP Draft Login flowchart]] - flowchart for current OGP login protocols&lt;br /&gt;
** [[SLGOGP_Teleport_Strawman]] - what login may be like&lt;br /&gt;
** [[Second_Life_Login_API_Strawman]] - what login may be like&lt;br /&gt;
** [[OGP_Draft_Login]] - diagrams of the OGP login&lt;br /&gt;
* General Notes&lt;br /&gt;
** [[Second_Life_Grid_Protocols/Foundation]] - general protocol information&lt;br /&gt;
** [[Protocol]] - this is general information about messaging and the various protocol systems&lt;br /&gt;
** [http://en.wikipedia.org/wiki/Comet_(programming) COMET programming]&lt;br /&gt;
** [[Eventlet]] - a networking library written in Python, probably going to be used for this project&lt;br /&gt;
***NOTE: We have been testing eventlet and it seems there&#039;s a problem posting to the seed capability. &lt;br /&gt;
****[[Pyogp_Client_Lib/Login_Test_Script]] - a very simple test script using eventlet that fails at the post to the seed cap&lt;br /&gt;
***Windows Instructions - Eventlet for Windows is a bit tricky to install&lt;br /&gt;
****[[User:Baba_Yamamoto/Eventlet]] - there are some problems with eventlet that Baba has looked into&lt;br /&gt;
****greenlet - you MUST have Visual Studio 2003 installed to install greenlet on windows (are there binary versions?). Use easy_install greenlet to install it.&lt;br /&gt;
****pyOpenSSl - windows versions&lt;br /&gt;
*****[http://webcleaner.sourceforge.net/pyOpenSSL-0.6.win32-py2.4.exe pyOpenSSL py2.4] - windows pyOpenSSL for Python 2.4&lt;br /&gt;
*****[http://webcleaner.sourceforge.net/pyOpenSSL-0.6.win32-py2.5.exe pyOpenSSL py2.5] - windows pyOpenSSL for Python 2.5&lt;br /&gt;
****util.py - has a dependency on fcntl. Go into eventlet&#039;s util.py, and either comment out all the fcntl calls, or for a slightly (not a good fix) better solution, [https://lists.secondlife.com/pipermail/sldev/2007-September/004790.html Donovan&#039;s Fix]&lt;br /&gt;
** [[Circuit]] - the way to pass two-way information along a UDP connection&lt;br /&gt;
** [[Message]] - more detail of messages&lt;br /&gt;
** [[Reverse_HTTP]] - I believe this is used (or will be) in the OGP protocols&lt;br /&gt;
** [http://www.libsecondlife.org/wiki/Protocol_%28network%29 General Packet Format] - libsecondlife - describes what the general format is for a packet&lt;br /&gt;
** [http://www.libsecondlife.org/wiki/ACK ACKs] - libsecondlife - describes what an ACK is&lt;br /&gt;
* Coding notes&lt;br /&gt;
** [http://www.muthukadan.net/docs/zca.html ZCA Guide] - ZCA that the lib project will be using&lt;br /&gt;
* Python Docs&lt;br /&gt;
** [http://www.python.org/doc/current/lib/module-distutils.html DistUtils] -&lt;br /&gt;
*** [http://www.python.org/community/sigs/current/distutils-sig/ Sig for utils]&lt;br /&gt;
** [http://peak.telecommunity.com/DevCenter/PythonEggs Python Eggs] -&lt;br /&gt;
*** [http://peak.telecommunity.com/DevCenter/setuptools setuptools] - lib to handle eggs&lt;br /&gt;
&lt;br /&gt;
* Old Code&lt;br /&gt;
**[http://pysecondlife.googlecode.com/svn/pyogp/pyogp.lib.base/trunk: Tao Takashi&#039;s Pyogp] - svn repo - Tao Takashi has hit the ground running with an experimental framework which has been made available [http://code.google.com/p/pysecondlife/ here]. &lt;br /&gt;
***Read more at his blogpost describing the start of his work at his very long [http://mrtopf.de/blog/secondlife/worldofsl/setting-up-a-framework-for-a-python-implementation-of-the-open-grid-protocol-technical url]. &lt;br /&gt;
**[[Presence_Code_Python| Sai&#039;s Presence]] and [[Presence_Code_Python_cmd_line| Sai&#039;s Presence_cmd_line]] - Saijanai Kuhn&#039;s first attempts at some Python presence&lt;br /&gt;
**[https://svn.secondlife.com/svn/linden/projects/2008/pyogp_old/ Linden Pyogp] - svn repo of Linden&#039;s first stab at framework, using Sai&#039;s code as a base&lt;br /&gt;
***[https://svn.secondlife.com/svn/linden/projects/2008/pyogp_old/examples/pyogp.lib-login.py pyogp.lib-login.py] - sample script which logs into aditi&#039;s agent domain and establishes a presence on a simulator on vaak:&lt;br /&gt;
***Disclaimer*: Everything in the repo now will change dramatically in the next few weeks as things firm up structure wise. My desires for the work include: a simple, well defined library, a separate test framework (unittest, the initial high level code to be added this week), an samples/examples sandbox, and clean well commented code. That said, none of the above are in place now. They will be. More sophisticated implementations can evolve over time, or can be included on the side of the library...&lt;br /&gt;
**[[Example_protocol_code]] - code written about login and presence&lt;br /&gt;
** [http://zhaewry.wordpress.com/2008/06/05/happy-jumpy-ruths-interop-takes-a-step/ Interop Ruths] - some news that may be of interest to us&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
# The code written as part of this effort is subject to the Apache v2 license. Read more at http://opensource.org/licenses/apache2.0.php.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;excerpt&amp;gt;&lt;br /&gt;
  Copyright 2008, Linden Research, Inc.&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
  you may not use this file except in compliance with the License.&lt;br /&gt;
  You may obtain a copy of the License at&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
  distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
  See the License for the specific language governing permissions and&lt;br /&gt;
  limitations under the License.&lt;br /&gt;
  &amp;lt;/excerpt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=947502</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=947502"/>
		<updated>2010-06-25T17:41:24Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* Environment Preparation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Repositories ==&lt;br /&gt;
&lt;br /&gt;
Stable trunk repositories:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Maintenance repositories:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps-maint/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base-maint/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client-maint/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout-maint/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x, 2.6.x (untested on 3.0)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Mac Specifics ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a updated install of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix Specifics ===&lt;br /&gt;
&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
=== easy_install ===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Easy Install is a python module (easy_install) bundled with setuptools that lets you automatically download, build, install, and manage Python packages.&amp;quot; I stole that from here: http://peak.telecommunity.com/DevCenter/EasyInstall.&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
  -or-&lt;br /&gt;
 curl -O http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
=== virtualenv ===&lt;br /&gt;
&lt;br /&gt;
Virtualenv builds isolated python environments. To learn more, read this: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, isolated from your system python install, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
== Install methods ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways... we&#039;re encouraging the virtualenv and setup.py method.&lt;br /&gt;
&lt;br /&gt;
=== buildout ===&lt;br /&gt;
&lt;br /&gt;
Buildout has a variety of uses, in PyOGP&#039;s case it is used as a development sandbox. Buildout will checkout all the necessary PyOGP repositories and their dependencies, and configure everything automatically (set up the right path members and install scripts). Once the sandbox is set up, you can make changes to the libs in the parts/ directory (they are actually local mercurial repositories), update the code referenced in buildout (re-run bin/buildout), and test your changes.&lt;br /&gt;
&lt;br /&gt;
 It&#039;s really easy to work with...&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
hg clone http://bitbucket.org/enus_linden/pyogp.buildout (or grab pyogp.buildout-maint to work with maintenance repos)&lt;br /&gt;
&lt;br /&gt;
2. Now turn this checkout into a virtual python environment, independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd pyogp.buildout&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter:&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp_interpreter, a python interpreter which contains all the installed packages and the pyogp libraries and dependencies referenced in the path.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following sample script or run the unittests:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  -or-&lt;br /&gt;
&lt;br /&gt;
  bin/unittests --where=parts/pyogp.lib.base (or pyogp.lib.client)&lt;br /&gt;
&lt;br /&gt;
Enter the avatar&#039;s password when prompted, and you&#039;re on your way to aditi, the Beta Grid.&lt;br /&gt;
&lt;br /&gt;
=== setup.py ===&lt;br /&gt;
&lt;br /&gt;
If you prefer to not use buildout, and to do things a bit more manually, well, you probably don&#039;t need much help here then do you? ;)&lt;br /&gt;
&lt;br /&gt;
Grab the source for each of the pyogp repos, and install them to a virtualenv instance (see above for installing virtualenv if you don&#039;t have it)..&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a simple setup that Enus likes:&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir sandbox&lt;br /&gt;
 cd sandbox&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir hg&lt;br /&gt;
 cd hg&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
 cd ~/hg/pyogp.lib.base&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.lib.client&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.apps&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 ......&lt;br /&gt;
 now, in ~/sandbox/bin/ you&#039;ll have all kinds of pyogp executables for testing stuff out (like region_connect, etc)&lt;br /&gt;
&lt;br /&gt;
You now have all the source, plus a sandbox, for tinkering with pyogp!&lt;br /&gt;
&lt;br /&gt;
To try an executable out, just run it in ~/sandbox/bin/. for example:&lt;br /&gt;
  ~/sandbox/bin/region_connect firstname lastname&lt;br /&gt;
This command will login in your agent to aditi, and will prompt you for a password.&lt;br /&gt;
&lt;br /&gt;
Pass any script the &amp;quot;-h&amp;quot; param to get it&#039;s usage.&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Package_Unittests]] for details...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=947492</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=947492"/>
		<updated>2010-06-25T17:39:57Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Repositories ==&lt;br /&gt;
&lt;br /&gt;
Stable trunk repositories:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Maintenance repositories:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps-maint/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base-maint/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client-maint/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout-maint/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x, 2.6.x (untested on 3.0)&lt;br /&gt;
&lt;br /&gt;
=== Mac Specifics ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a reinstall of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix Specifics ===&lt;br /&gt;
&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
=== easy_install ===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Easy Install is a python module (easy_install) bundled with setuptools that lets you automatically download, build, install, and manage Python packages.&amp;quot; I stole that from here: http://peak.telecommunity.com/DevCenter/EasyInstall.&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
  -or-&lt;br /&gt;
 curl -O http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
=== virtualenv ===&lt;br /&gt;
&lt;br /&gt;
Virtualenv builds isolated python environments. To learn more, read this: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, isolated from your system python install, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
== Install methods ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways... we&#039;re encouraging the virtualenv and setup.py method.&lt;br /&gt;
&lt;br /&gt;
=== buildout ===&lt;br /&gt;
&lt;br /&gt;
Buildout has a variety of uses, in PyOGP&#039;s case it is used as a development sandbox. Buildout will checkout all the necessary PyOGP repositories and their dependencies, and configure everything automatically (set up the right path members and install scripts). Once the sandbox is set up, you can make changes to the libs in the parts/ directory (they are actually local mercurial repositories), update the code referenced in buildout (re-run bin/buildout), and test your changes.&lt;br /&gt;
&lt;br /&gt;
 It&#039;s really easy to work with...&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
hg clone http://bitbucket.org/enus_linden/pyogp.buildout (or grab pyogp.buildout-maint to work with maintenance repos)&lt;br /&gt;
&lt;br /&gt;
2. Now turn this checkout into a virtual python environment, independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd pyogp.buildout&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter:&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp_interpreter, a python interpreter which contains all the installed packages and the pyogp libraries and dependencies referenced in the path.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following sample script or run the unittests:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  -or-&lt;br /&gt;
&lt;br /&gt;
  bin/unittests --where=parts/pyogp.lib.base (or pyogp.lib.client)&lt;br /&gt;
&lt;br /&gt;
Enter the avatar&#039;s password when prompted, and you&#039;re on your way to aditi, the Beta Grid.&lt;br /&gt;
&lt;br /&gt;
=== setup.py ===&lt;br /&gt;
&lt;br /&gt;
If you prefer to not use buildout, and to do things a bit more manually, well, you probably don&#039;t need much help here then do you? ;)&lt;br /&gt;
&lt;br /&gt;
Grab the source for each of the pyogp repos, and install them to a virtualenv instance (see above for installing virtualenv if you don&#039;t have it)..&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a simple setup that Enus likes:&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir sandbox&lt;br /&gt;
 cd sandbox&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir hg&lt;br /&gt;
 cd hg&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
 cd ~/hg/pyogp.lib.base&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.lib.client&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.apps&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 ......&lt;br /&gt;
 now, in ~/sandbox/bin/ you&#039;ll have all kinds of pyogp executables for testing stuff out (like region_connect, etc)&lt;br /&gt;
&lt;br /&gt;
You now have all the source, plus a sandbox, for tinkering with pyogp!&lt;br /&gt;
&lt;br /&gt;
To try an executable out, just run it in ~/sandbox/bin/. for example:&lt;br /&gt;
  ~/sandbox/bin/region_connect firstname lastname&lt;br /&gt;
This command will login in your agent to aditi, and will prompt you for a password.&lt;br /&gt;
&lt;br /&gt;
Pass any script the &amp;quot;-h&amp;quot; param to get it&#039;s usage.&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Package_Unittests]] for details...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=947482</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=947482"/>
		<updated>2010-06-25T17:39:37Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Repositories ==&lt;br /&gt;
&lt;br /&gt;
Stable trunk repositories:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Maintenance repositories:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps-maint/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base-maint/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client-maint/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout-maint/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x, 2.6.x (untested on 3.0)&lt;br /&gt;
&lt;br /&gt;
=== Mac Specifics ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a reinstall of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix Specifics ===&lt;br /&gt;
&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
=== easy_install ===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Easy Install is a python module (easy_install) bundled with setuptools that lets you automatically download, build, install, and manage Python packages.&amp;quot; I stole that from here: http://peak.telecommunity.com/DevCenter/EasyInstall.&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
  -or-&lt;br /&gt;
 curl -O http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
==== virtualenv ====&lt;br /&gt;
&lt;br /&gt;
Virtualenv builds isolated python environments. To learn more, read this: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, isolated from your system python install, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
== Install methods ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways... we&#039;re encouraging the virtualenv and setup.py method.&lt;br /&gt;
&lt;br /&gt;
=== buildout ===&lt;br /&gt;
&lt;br /&gt;
Buildout has a variety of uses, in PyOGP&#039;s case it is used as a development sandbox. Buildout will checkout all the necessary PyOGP repositories and their dependencies, and configure everything automatically (set up the right path members and install scripts). Once the sandbox is set up, you can make changes to the libs in the parts/ directory (they are actually local mercurial repositories), update the code referenced in buildout (re-run bin/buildout), and test your changes.&lt;br /&gt;
&lt;br /&gt;
 It&#039;s really easy to work with...&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
hg clone http://bitbucket.org/enus_linden/pyogp.buildout (or grab pyogp.buildout-maint to work with maintenance repos)&lt;br /&gt;
&lt;br /&gt;
2. Now turn this checkout into a virtual python environment, independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd pyogp.buildout&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter:&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp_interpreter, a python interpreter which contains all the installed packages and the pyogp libraries and dependencies referenced in the path.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following sample script or run the unittests:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  -or-&lt;br /&gt;
&lt;br /&gt;
  bin/unittests --where=parts/pyogp.lib.base (or pyogp.lib.client)&lt;br /&gt;
&lt;br /&gt;
Enter the avatar&#039;s password when prompted, and you&#039;re on your way to aditi, the Beta Grid.&lt;br /&gt;
&lt;br /&gt;
=== setup.py ===&lt;br /&gt;
&lt;br /&gt;
If you prefer to not use buildout, and to do things a bit more manually, well, you probably don&#039;t need much help here then do you? ;)&lt;br /&gt;
&lt;br /&gt;
Grab the source for each of the pyogp repos, and install them to a virtualenv instance (see above for installing virtualenv if you don&#039;t have it)..&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a simple setup that Enus likes:&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir sandbox&lt;br /&gt;
 cd sandbox&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir hg&lt;br /&gt;
 cd hg&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
 cd ~/hg/pyogp.lib.base&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.lib.client&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.apps&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 ......&lt;br /&gt;
 now, in ~/sandbox/bin/ you&#039;ll have all kinds of pyogp executables for testing stuff out (like region_connect, etc)&lt;br /&gt;
&lt;br /&gt;
You now have all the source, plus a sandbox, for tinkering with pyogp!&lt;br /&gt;
&lt;br /&gt;
To try an executable out, just run it in ~/sandbox/bin/. for example:&lt;br /&gt;
  ~/sandbox/bin/region_connect firstname lastname&lt;br /&gt;
This command will login in your agent to aditi, and will prompt you for a password.&lt;br /&gt;
&lt;br /&gt;
Pass any script the &amp;quot;-h&amp;quot; param to get it&#039;s usage.&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Package_Unittests]] for details...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=947432</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=947432"/>
		<updated>2010-06-25T17:22:18Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* Note */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Repositories ==&lt;br /&gt;
&lt;br /&gt;
Stable trunk repositories:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Maintenance repositories:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps-maint/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base-maint/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client-maint/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout-maint/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x, 2.6.x (untested on 3.0)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a reinstall of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix distribution ===&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
==== easy_install ====&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
  -or-&lt;br /&gt;
 curl -O http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
==== virtualenv ====&lt;br /&gt;
&lt;br /&gt;
One may choose to create an isolated python instance on your host, to be able to work with PyOGP without installing packages to your base Python install on your host. &lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Install method ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways... we&#039;re encouraging the virtualenv and setup.py method.&lt;br /&gt;
&lt;br /&gt;
=== Install Method 1: buildout [Defunct] ===&lt;br /&gt;
&lt;br /&gt;
We use zc.buildout to automatically setup a development environment. buildout gives you the ability to install packages only locally instead of your global python installation. It&#039;s sort of a local python installation which helps you avoiding version conflicts of packages.&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
 svn co http://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/trunk/ libdev&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;(Optional)&#039;&#039;&#039; Now turn this directory into a virtual python environment which is independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd libdev&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter (if installed. If not, use your system&#039;s python.):&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp which is a python interpreter which contains all the installed packaged and the pyogp library and related projects.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Give your Avatar name and it will ask for a password. Then it tries to login to the Preview Grid.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== setup.py ===&lt;br /&gt;
&lt;br /&gt;
Grab the source files for each of the pyogp repos, and install them to a virtualenv instance (see above for installing virtualenv if you don&#039;t have it)..&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a simple setup that Enus likes:&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir sandbox&lt;br /&gt;
 cd sandbox&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir hg&lt;br /&gt;
 cd hg&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
 cd ~/hg/pyogp.lib.base&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.lib.client&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.apps&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 ......&lt;br /&gt;
 now, in ~/sandbox/bin/ you&#039;ll have all kinds of pyogp executables for testing stuff out (like region_connect, etc)&lt;br /&gt;
&lt;br /&gt;
You now have all the source, plus a sandbox, for tinkering with pyogp!&lt;br /&gt;
&lt;br /&gt;
To try an executable out, just run it in ~/sandbox/bin/. for example:&lt;br /&gt;
  ~/sandbox/bin/region_connect firstname lastname&lt;br /&gt;
This command will login in your agent to aditi, and will prompt you for a password.&lt;br /&gt;
&lt;br /&gt;
Pass any script the &amp;quot;-h&amp;quot; param to get it&#039;s usage.&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Package_Unittests]] for details...&lt;br /&gt;
&lt;br /&gt;
== The structure of the sandbox ==&lt;br /&gt;
&lt;br /&gt;
You now might wonder what all those directories are good for. To learn more about this check out the [[Pyogp/Filesystem_Structure|Filesystem Structure]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=947402</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=947402"/>
		<updated>2010-06-25T16:52:08Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&lt;br /&gt;
We&#039;re migrating to [[Mercurial_repositories|Mercurial]]... Please check back soon for updated docs.&lt;br /&gt;
&lt;br /&gt;
PyOGP package install instructions need some work... stay tuned. Feel free to follow the buildout directions to use the Subversion repositories for now.&lt;br /&gt;
&lt;br /&gt;
=== Repositories ===&lt;br /&gt;
&lt;br /&gt;
Stable trunk repositories:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Maintenance repositories:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps-maint/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base-maint/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client-maint/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout-maint/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x, 2.6.x (untested on 3.0)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a reinstall of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix distribution ===&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
==== easy_install ====&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
  -or-&lt;br /&gt;
 curl -O http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
==== virtualenv ====&lt;br /&gt;
&lt;br /&gt;
One may choose to create an isolated python instance on your host, to be able to work with PyOGP without installing packages to your base Python install on your host. &lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Install method ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways... we&#039;re encouraging the virtualenv and setup.py method.&lt;br /&gt;
&lt;br /&gt;
=== Install Method 1: buildout [Defunct] ===&lt;br /&gt;
&lt;br /&gt;
We use zc.buildout to automatically setup a development environment. buildout gives you the ability to install packages only locally instead of your global python installation. It&#039;s sort of a local python installation which helps you avoiding version conflicts of packages.&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
 svn co http://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/trunk/ libdev&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;(Optional)&#039;&#039;&#039; Now turn this directory into a virtual python environment which is independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd libdev&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter (if installed. If not, use your system&#039;s python.):&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp which is a python interpreter which contains all the installed packaged and the pyogp library and related projects.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Give your Avatar name and it will ask for a password. Then it tries to login to the Preview Grid.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== setup.py ===&lt;br /&gt;
&lt;br /&gt;
Grab the source files for each of the pyogp repos, and install them to a virtualenv instance (see above for installing virtualenv if you don&#039;t have it)..&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a simple setup that Enus likes:&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir sandbox&lt;br /&gt;
 cd sandbox&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir hg&lt;br /&gt;
 cd hg&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
 cd ~/hg/pyogp.lib.base&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.lib.client&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.apps&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 ......&lt;br /&gt;
 now, in ~/sandbox/bin/ you&#039;ll have all kinds of pyogp executables for testing stuff out (like region_connect, etc)&lt;br /&gt;
&lt;br /&gt;
You now have all the source, plus a sandbox, for tinkering with pyogp!&lt;br /&gt;
&lt;br /&gt;
To try an executable out, just run it in ~/sandbox/bin/. for example:&lt;br /&gt;
  ~/sandbox/bin/region_connect firstname lastname&lt;br /&gt;
This command will login in your agent to aditi, and will prompt you for a password.&lt;br /&gt;
&lt;br /&gt;
Pass any script the &amp;quot;-h&amp;quot; param to get it&#039;s usage.&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Package_Unittests]] for details...&lt;br /&gt;
&lt;br /&gt;
== The structure of the sandbox ==&lt;br /&gt;
&lt;br /&gt;
You now might wonder what all those directories are good for. To learn more about this check out the [[Pyogp/Filesystem_Structure|Filesystem Structure]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=946653</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=946653"/>
		<updated>2010-06-24T21:46:08Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* Run the tests */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&lt;br /&gt;
We&#039;re migrating to [[Mercurial_repositories|Mercurial]]... Please check back soon for updated docs.&lt;br /&gt;
&lt;br /&gt;
PyOGP package install instructions need some work... stay tuned. Feel free to follow the buildout directions to use the Subversion repositories for now.&lt;br /&gt;
&lt;br /&gt;
=== Repositories ===&lt;br /&gt;
&lt;br /&gt;
Need some work before they are ready as installed packages. In the meantime, just add the path to &amp;quot;pyogp.{package}&amp;quot; to your PYTHONPATH to use the libs, assuming you have the other dependencies.&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Needs updates to work:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x, 2.6.x (untested on 3.0)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a reinstall of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix distribution ===&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
==== easy_install ====&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
  -or-&lt;br /&gt;
 curl -O http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
==== virtualenv ====&lt;br /&gt;
&lt;br /&gt;
One may choose to create an isolated python instance on your host, to be able to work with PyOGP without installing packages to your base Python install on your host. &lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Install method ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways... we&#039;re encouraging the virtualenv and setup.py method.&lt;br /&gt;
&lt;br /&gt;
=== Install Method 1: buildout [Defunct] ===&lt;br /&gt;
&lt;br /&gt;
We use zc.buildout to automatically setup a development environment. buildout gives you the ability to install packages only locally instead of your global python installation. It&#039;s sort of a local python installation which helps you avoiding version conflicts of packages.&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
 svn co http://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/trunk/ libdev&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;(Optional)&#039;&#039;&#039; Now turn this directory into a virtual python environment which is independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd libdev&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter (if installed. If not, use your system&#039;s python.):&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp which is a python interpreter which contains all the installed packaged and the pyogp library and related projects.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Give your Avatar name and it will ask for a password. Then it tries to login to the Preview Grid.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== setup.py ===&lt;br /&gt;
&lt;br /&gt;
Grab the source files for each of the pyogp repos, and install them to a virtualenv instance (see above for installing virtualenv if you don&#039;t have it)..&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a simple setup that Enus likes:&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir sandbox&lt;br /&gt;
 cd sandbox&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir hg&lt;br /&gt;
 cd hg&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
 cd ~/hg/pyogp.lib.base&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.lib.client&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.apps&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 ......&lt;br /&gt;
 now, in ~/sandbox/bin/ you&#039;ll have all kinds of pyogp executables for testing stuff out (like region_connect, etc)&lt;br /&gt;
&lt;br /&gt;
You now have all the source, plus a sandbox, for tinkering with pyogp!&lt;br /&gt;
&lt;br /&gt;
To try an executable out, just run it in ~/sandbox/bin/. for example:&lt;br /&gt;
  ~/sandbox/bin/region_connect firstname lastname&lt;br /&gt;
This command will login in your agent to aditi, and will prompt you for a password.&lt;br /&gt;
&lt;br /&gt;
Pass any script the &amp;quot;-h&amp;quot; param to get it&#039;s usage.&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Package_Unittests]] for details...&lt;br /&gt;
&lt;br /&gt;
== The structure of the sandbox ==&lt;br /&gt;
&lt;br /&gt;
You now might wonder what all those directories are good for. To learn more about this check out the [[Pyogp/Filesystem_Structure|Filesystem Structure]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=946643</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=946643"/>
		<updated>2010-06-24T21:41:11Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* Prerequisites */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&lt;br /&gt;
We&#039;re migrating to [[Mercurial_repositories|Mercurial]]... Please check back soon for updated docs.&lt;br /&gt;
&lt;br /&gt;
PyOGP package install instructions need some work... stay tuned. Feel free to follow the buildout directions to use the Subversion repositories for now.&lt;br /&gt;
&lt;br /&gt;
=== Repositories ===&lt;br /&gt;
&lt;br /&gt;
Need some work before they are ready as installed packages. In the meantime, just add the path to &amp;quot;pyogp.{package}&amp;quot; to your PYTHONPATH to use the libs, assuming you have the other dependencies.&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Needs updates to work:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x, 2.6.x (untested on 3.0)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a reinstall of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix distribution ===&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
==== easy_install ====&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
  -or-&lt;br /&gt;
 curl -O http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
==== virtualenv ====&lt;br /&gt;
&lt;br /&gt;
One may choose to create an isolated python instance on your host, to be able to work with PyOGP without installing packages to your base Python install on your host. &lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Install method ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways... we&#039;re encouraging the virtualenv and setup.py method.&lt;br /&gt;
&lt;br /&gt;
=== Install Method 1: buildout [Defunct] ===&lt;br /&gt;
&lt;br /&gt;
We use zc.buildout to automatically setup a development environment. buildout gives you the ability to install packages only locally instead of your global python installation. It&#039;s sort of a local python installation which helps you avoiding version conflicts of packages.&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
 svn co http://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/trunk/ libdev&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;(Optional)&#039;&#039;&#039; Now turn this directory into a virtual python environment which is independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd libdev&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter (if installed. If not, use your system&#039;s python.):&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp which is a python interpreter which contains all the installed packaged and the pyogp library and related projects.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Give your Avatar name and it will ask for a password. Then it tries to login to the Preview Grid.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== setup.py ===&lt;br /&gt;
&lt;br /&gt;
Grab the source files for each of the pyogp repos, and install them to a virtualenv instance (see above for installing virtualenv if you don&#039;t have it)..&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a simple setup that Enus likes:&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir sandbox&lt;br /&gt;
 cd sandbox&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir hg&lt;br /&gt;
 cd hg&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
 cd ~/hg/pyogp.lib.base&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.lib.client&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.apps&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 ......&lt;br /&gt;
 now, in ~/sandbox/bin/ you&#039;ll have all kinds of pyogp executables for testing stuff out (like region_connect, etc)&lt;br /&gt;
&lt;br /&gt;
You now have all the source, plus a sandbox, for tinkering with pyogp!&lt;br /&gt;
&lt;br /&gt;
To try an executable out, just run it in ~/sandbox/bin/. for example:&lt;br /&gt;
  ~/sandbox/bin/region_connect firstname lastname&lt;br /&gt;
This command will login in your agent to aditi, and will prompt you for a password.&lt;br /&gt;
&lt;br /&gt;
Pass any script the &amp;quot;-h&amp;quot; param to get it&#039;s usage.&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Client_Library#Pyogp_Unit_Tests]] for details...&lt;br /&gt;
&lt;br /&gt;
== The structure of the sandbox ==&lt;br /&gt;
&lt;br /&gt;
You now might wonder what all those directories are good for. To learn more about this check out the [[Pyogp/Filesystem_Structure|Filesystem Structure]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=891012</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=891012"/>
		<updated>2010-05-03T21:29:17Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* setup.py */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&lt;br /&gt;
We&#039;re migrating to [[Mercurial_repositories|Mercurial]]... Please check back soon for updated docs.&lt;br /&gt;
&lt;br /&gt;
PyOGP package install instructions need some work... stay tuned. Feel free to follow the buildout directions to use the Subversion repositories for now.&lt;br /&gt;
&lt;br /&gt;
=== Repositories ===&lt;br /&gt;
&lt;br /&gt;
Need some work before they are ready as installed packages. In the meantime, just add the path to &amp;quot;pyogp.{package}&amp;quot; to your PYTHONPATH to use the libs, assuming you have the other dependencies.&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Needs updates to work:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x (fails on 2.6 currently and untested on 3.0)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a reinstall of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Buildout does not yet support subversion 1.6, only 1.4.4-1.5.x.&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix distribution ===&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
==== easy_install ====&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
  -or-&lt;br /&gt;
 curl -O http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
==== virtualenv ====&lt;br /&gt;
&lt;br /&gt;
One may choose to create an isolated python instance on your host, to be able to work with PyOGP without installing packages to your base Python install on your host. &lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Install method ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways... we&#039;re encouraging the virtualenv and setup.py method.&lt;br /&gt;
&lt;br /&gt;
=== Install Method 1: buildout [Defunct] ===&lt;br /&gt;
&lt;br /&gt;
We use zc.buildout to automatically setup a development environment. buildout gives you the ability to install packages only locally instead of your global python installation. It&#039;s sort of a local python installation which helps you avoiding version conflicts of packages.&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
 svn co http://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/trunk/ libdev&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;(Optional)&#039;&#039;&#039; Now turn this directory into a virtual python environment which is independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd libdev&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter (if installed. If not, use your system&#039;s python.):&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp which is a python interpreter which contains all the installed packaged and the pyogp library and related projects.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Give your Avatar name and it will ask for a password. Then it tries to login to the Preview Grid.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== setup.py ===&lt;br /&gt;
&lt;br /&gt;
Grab the source files for each of the pyogp repos, and install them to a virtualenv instance (see above for installing virtualenv if you don&#039;t have it)..&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a simple setup that Enus likes:&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir sandbox&lt;br /&gt;
 cd sandbox&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir hg&lt;br /&gt;
 cd hg&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
 cd ~/hg/pyogp.lib.base&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.lib.client&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.apps&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 ......&lt;br /&gt;
 now, in ~/sandbox/bin/ you&#039;ll have all kinds of pyogp executables for testing stuff out (like region_connect, etc)&lt;br /&gt;
&lt;br /&gt;
You now have all the source, plus a sandbox, for tinkering with pyogp!&lt;br /&gt;
&lt;br /&gt;
To try an executable out, just run it in ~/sandbox/bin/. for example:&lt;br /&gt;
  ~/sandbox/bin/region_connect firstname lastname&lt;br /&gt;
This command will login in your agent to aditi, and will prompt you for a password.&lt;br /&gt;
&lt;br /&gt;
Pass any script the &amp;quot;-h&amp;quot; param to get it&#039;s usage.&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Client_Library#Pyogp_Unit_Tests]] for details...&lt;br /&gt;
&lt;br /&gt;
== The structure of the sandbox ==&lt;br /&gt;
&lt;br /&gt;
You now might wonder what all those directories are good for. To learn more about this check out the [[Pyogp/Filesystem_Structure|Filesystem Structure]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=891002</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=891002"/>
		<updated>2010-05-03T21:27:14Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* setup.py */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&lt;br /&gt;
We&#039;re migrating to [[Mercurial_repositories|Mercurial]]... Please check back soon for updated docs.&lt;br /&gt;
&lt;br /&gt;
PyOGP package install instructions need some work... stay tuned. Feel free to follow the buildout directions to use the Subversion repositories for now.&lt;br /&gt;
&lt;br /&gt;
=== Repositories ===&lt;br /&gt;
&lt;br /&gt;
Need some work before they are ready as installed packages. In the meantime, just add the path to &amp;quot;pyogp.{package}&amp;quot; to your PYTHONPATH to use the libs, assuming you have the other dependencies.&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Needs updates to work:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x (fails on 2.6 currently and untested on 3.0)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a reinstall of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Buildout does not yet support subversion 1.6, only 1.4.4-1.5.x.&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix distribution ===&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
==== easy_install ====&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
  -or-&lt;br /&gt;
 curl -O http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
==== virtualenv ====&lt;br /&gt;
&lt;br /&gt;
One may choose to create an isolated python instance on your host, to be able to work with PyOGP without installing packages to your base Python install on your host. &lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Install method ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways... we&#039;re encouraging the virtualenv and setup.py method.&lt;br /&gt;
&lt;br /&gt;
=== Install Method 1: buildout [Defunct] ===&lt;br /&gt;
&lt;br /&gt;
We use zc.buildout to automatically setup a development environment. buildout gives you the ability to install packages only locally instead of your global python installation. It&#039;s sort of a local python installation which helps you avoiding version conflicts of packages.&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
 svn co http://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/trunk/ libdev&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;(Optional)&#039;&#039;&#039; Now turn this directory into a virtual python environment which is independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd libdev&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter (if installed. If not, use your system&#039;s python.):&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp which is a python interpreter which contains all the installed packaged and the pyogp library and related projects.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Give your Avatar name and it will ask for a password. Then it tries to login to the Preview Grid.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== setup.py ===&lt;br /&gt;
&lt;br /&gt;
Grab the source files for each of the pyogp repos, and install them to a virtualenv instance (see above for installing virtualenv if you don&#039;t have it)..&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a simple setup that Enus likes:&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir sandbox&lt;br /&gt;
 cd sandbox&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir hg&lt;br /&gt;
 cd hg&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
 cd ~/hg/pyogp.lib.base&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.lib.client&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.apps&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 ......&lt;br /&gt;
 now, in ~/sandbox/bin/you&#039;ll have all kinds of pyogp executables for testing stuff out.&lt;br /&gt;
&lt;br /&gt;
You now have all the source, plus a sandbox, for tinkering with pyogp!&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Client_Library#Pyogp_Unit_Tests]] for details...&lt;br /&gt;
&lt;br /&gt;
== The structure of the sandbox ==&lt;br /&gt;
&lt;br /&gt;
You now might wonder what all those directories are good for. To learn more about this check out the [[Pyogp/Filesystem_Structure|Filesystem Structure]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=890992</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=890992"/>
		<updated>2010-05-03T21:26:27Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* setup.py */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&lt;br /&gt;
We&#039;re migrating to [[Mercurial_repositories|Mercurial]]... Please check back soon for updated docs.&lt;br /&gt;
&lt;br /&gt;
PyOGP package install instructions need some work... stay tuned. Feel free to follow the buildout directions to use the Subversion repositories for now.&lt;br /&gt;
&lt;br /&gt;
=== Repositories ===&lt;br /&gt;
&lt;br /&gt;
Need some work before they are ready as installed packages. In the meantime, just add the path to &amp;quot;pyogp.{package}&amp;quot; to your PYTHONPATH to use the libs, assuming you have the other dependencies.&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Needs updates to work:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x (fails on 2.6 currently and untested on 3.0)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a reinstall of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Buildout does not yet support subversion 1.6, only 1.4.4-1.5.x.&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix distribution ===&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
==== easy_install ====&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
  -or-&lt;br /&gt;
 curl -O http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
==== virtualenv ====&lt;br /&gt;
&lt;br /&gt;
One may choose to create an isolated python instance on your host, to be able to work with PyOGP without installing packages to your base Python install on your host. &lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Install method ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways... we&#039;re encouraging the virtualenv and setup.py method.&lt;br /&gt;
&lt;br /&gt;
=== Install Method 1: buildout [Defunct] ===&lt;br /&gt;
&lt;br /&gt;
We use zc.buildout to automatically setup a development environment. buildout gives you the ability to install packages only locally instead of your global python installation. It&#039;s sort of a local python installation which helps you avoiding version conflicts of packages.&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
 svn co http://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/trunk/ libdev&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;(Optional)&#039;&#039;&#039; Now turn this directory into a virtual python environment which is independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd libdev&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter (if installed. If not, use your system&#039;s python.):&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp which is a python interpreter which contains all the installed packaged and the pyogp library and related projects.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Give your Avatar name and it will ask for a password. Then it tries to login to the Preview Grid.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== setup.py ===&lt;br /&gt;
&lt;br /&gt;
Grab the source files for each of the pyogp repos, and install them to a virtualenv instance (see above for installing virtualenv if you don&#039;t have it)..&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a simple setup that Enus likes:&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir sandbox&lt;br /&gt;
 cd sandbox&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir hg&lt;br /&gt;
 cd hg&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
 cd ~/hg/pyogp.lib.base&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.lib.client&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd ~/hg/pyogp.apps&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
&lt;br /&gt;
You now have all the source, plus a sandbox, for tinkering with pyogp!&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Client_Library#Pyogp_Unit_Tests]] for details...&lt;br /&gt;
&lt;br /&gt;
== The structure of the sandbox ==&lt;br /&gt;
&lt;br /&gt;
You now might wonder what all those directories are good for. To learn more about this check out the [[Pyogp/Filesystem_Structure|Filesystem Structure]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=890982</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=890982"/>
		<updated>2010-05-03T21:20:52Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* easy_install */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&lt;br /&gt;
We&#039;re migrating to [[Mercurial_repositories|Mercurial]]... Please check back soon for updated docs.&lt;br /&gt;
&lt;br /&gt;
PyOGP package install instructions need some work... stay tuned. Feel free to follow the buildout directions to use the Subversion repositories for now.&lt;br /&gt;
&lt;br /&gt;
=== Repositories ===&lt;br /&gt;
&lt;br /&gt;
Need some work before they are ready as installed packages. In the meantime, just add the path to &amp;quot;pyogp.{package}&amp;quot; to your PYTHONPATH to use the libs, assuming you have the other dependencies.&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Needs updates to work:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x (fails on 2.6 currently and untested on 3.0)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a reinstall of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Buildout does not yet support subversion 1.6, only 1.4.4-1.5.x.&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix distribution ===&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
==== easy_install ====&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
  -or-&lt;br /&gt;
 curl -O http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
==== virtualenv ====&lt;br /&gt;
&lt;br /&gt;
One may choose to create an isolated python instance on your host, to be able to work with PyOGP without installing packages to your base Python install on your host. &lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Install method ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways... we&#039;re encouraging the virtualenv and setup.py method.&lt;br /&gt;
&lt;br /&gt;
=== Install Method 1: buildout [Defunct] ===&lt;br /&gt;
&lt;br /&gt;
We use zc.buildout to automatically setup a development environment. buildout gives you the ability to install packages only locally instead of your global python installation. It&#039;s sort of a local python installation which helps you avoiding version conflicts of packages.&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
 svn co http://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/trunk/ libdev&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;(Optional)&#039;&#039;&#039; Now turn this directory into a virtual python environment which is independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd libdev&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter (if installed. If not, use your system&#039;s python.):&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp which is a python interpreter which contains all the installed packaged and the pyogp library and related projects.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Give your Avatar name and it will ask for a password. Then it tries to login to the Preview Grid.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== setup.py ===&lt;br /&gt;
&lt;br /&gt;
Grab the source files for each of the pyogp repos, and install them to a virtualenv instance (see above for installing virtualenv if you don&#039;t have it)..&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a simple setup that Enus likes:&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir sandbox&lt;br /&gt;
 cd sandbox&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir hg&lt;br /&gt;
 cd hg&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
 cd pyogp.lib.base&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd pyogp.lib.client&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd pyogp.apps&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
&lt;br /&gt;
You now have all the source, plus a sandbox, for tinkering with pyogp!&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Client_Library#Pyogp_Unit_Tests]] for details...&lt;br /&gt;
&lt;br /&gt;
== The structure of the sandbox ==&lt;br /&gt;
&lt;br /&gt;
You now might wonder what all those directories are good for. To learn more about this check out the [[Pyogp/Filesystem_Structure|Filesystem Structure]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=890972</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=890972"/>
		<updated>2010-05-03T21:16:45Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* Environment Preparation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&lt;br /&gt;
We&#039;re migrating to [[Mercurial_repositories|Mercurial]]... Please check back soon for updated docs.&lt;br /&gt;
&lt;br /&gt;
PyOGP package install instructions need some work... stay tuned. Feel free to follow the buildout directions to use the Subversion repositories for now.&lt;br /&gt;
&lt;br /&gt;
=== Repositories ===&lt;br /&gt;
&lt;br /&gt;
Need some work before they are ready as installed packages. In the meantime, just add the path to &amp;quot;pyogp.{package}&amp;quot; to your PYTHONPATH to use the libs, assuming you have the other dependencies.&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Needs updates to work:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x (fails on 2.6 currently and untested on 3.0)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a reinstall of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Buildout does not yet support subversion 1.6, only 1.4.4-1.5.x.&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix distribution ===&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
==== easy_install ====&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
  -or-&lt;br /&gt;
 curl -O tp://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
==== virtualenv ====&lt;br /&gt;
&lt;br /&gt;
One may choose to create an isolated python instance on your host, to be able to work with PyOGP without installing packages to your base Python install on your host. &lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Install method ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways... we&#039;re encouraging the virtualenv and setup.py method.&lt;br /&gt;
&lt;br /&gt;
=== Install Method 1: buildout [Defunct] ===&lt;br /&gt;
&lt;br /&gt;
We use zc.buildout to automatically setup a development environment. buildout gives you the ability to install packages only locally instead of your global python installation. It&#039;s sort of a local python installation which helps you avoiding version conflicts of packages.&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
 svn co http://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/trunk/ libdev&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;(Optional)&#039;&#039;&#039; Now turn this directory into a virtual python environment which is independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd libdev&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter (if installed. If not, use your system&#039;s python.):&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp which is a python interpreter which contains all the installed packaged and the pyogp library and related projects.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Give your Avatar name and it will ask for a password. Then it tries to login to the Preview Grid.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== setup.py ===&lt;br /&gt;
&lt;br /&gt;
Grab the source files for each of the pyogp repos, and install them to a virtualenv instance (see above for installing virtualenv if you don&#039;t have it)..&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a simple setup that Enus likes:&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir sandbox&lt;br /&gt;
 cd sandbox&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
 cd ~&lt;br /&gt;
 mkdir hg&lt;br /&gt;
 cd hg&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
 cd pyogp.lib.base&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd pyogp.lib.client&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
 cd pyogp.apps&lt;br /&gt;
 ~/sandbox/bin/python setup.py install&lt;br /&gt;
&lt;br /&gt;
You now have all the source, plus a sandbox, for tinkering with pyogp!&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Client_Library#Pyogp_Unit_Tests]] for details...&lt;br /&gt;
&lt;br /&gt;
== The structure of the sandbox ==&lt;br /&gt;
&lt;br /&gt;
You now might wonder what all those directories are good for. To learn more about this check out the [[Pyogp/Filesystem_Structure|Filesystem Structure]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=890962</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=890962"/>
		<updated>2010-05-03T21:15:43Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&lt;br /&gt;
We&#039;re migrating to [[Mercurial_repositories|Mercurial]]... Please check back soon for updated docs.&lt;br /&gt;
&lt;br /&gt;
PyOGP package install instructions need some work... stay tuned. Feel free to follow the buildout directions to use the Subversion repositories for now.&lt;br /&gt;
&lt;br /&gt;
=== Repositories ===&lt;br /&gt;
&lt;br /&gt;
Need some work before they are ready as installed packages. In the meantime, just add the path to &amp;quot;pyogp.{package}&amp;quot; to your PYTHONPATH to use the libs, assuming you have the other dependencies.&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Needs updates to work:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x (fails on 2.6 currently and untested on 3.0)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a reinstall of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Buildout does not yet support subversion 1.6, only 1.4.4-1.5.x.&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix distribution ===&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
==== easy_install ====&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
  -or-&lt;br /&gt;
 curl -O tp://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
==== virtualenv ====&lt;br /&gt;
&lt;br /&gt;
One may choose to create an isolated python instance on your host, to be able to work with PyOGP without installing packages to your base Python install on your host. &lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Install method ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways... we&#039;re encouraging the virtualenv and setup.py method.&lt;br /&gt;
&lt;br /&gt;
=== Install Method 1: buildout [Defunct] ===&lt;br /&gt;
&lt;br /&gt;
We use zc.buildout to automatically setup a development environment. buildout gives you the ability to install packages only locally instead of your global python installation. It&#039;s sort of a local python installation which helps you avoiding version conflicts of packages.&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
 svn co http://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/trunk/ libdev&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;(Optional)&#039;&#039;&#039; Now turn this directory into a virtual python environment which is independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd libdev&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter (if installed. If not, use your system&#039;s python.):&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp which is a python interpreter which contains all the installed packaged and the pyogp library and related projects.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Give your Avatar name and it will ask for a password. Then it tries to login to the Preview Grid.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== setup.py ===&lt;br /&gt;
&lt;br /&gt;
Grab the source files for each of the pyogp repos, and install them to a virtualenv instance (see above for installing virtualenv if you don&#039;t have it)..&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a simple setup that Enus likes:&lt;br /&gt;
: cd ~&lt;br /&gt;
: mkdir sandbox&lt;br /&gt;
: cd sandbox&lt;br /&gt;
: virtualenv . --no-site-packages&lt;br /&gt;
: cd ~&lt;br /&gt;
: mkdir hg&lt;br /&gt;
: cd hg&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
: cd pyogp.lib.base&lt;br /&gt;
: ~/sandbox/bin/python setup.py install&lt;br /&gt;
: cd pyogp.lib.client&lt;br /&gt;
: ~/sandbox/bin/python setup.py install&lt;br /&gt;
: cd pyogp.apps&lt;br /&gt;
: ~/sandbox/bin/python setup.py install&lt;br /&gt;
&lt;br /&gt;
You now have all the source, plus a sandbox, for tinkering with pyogp!&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Client_Library#Pyogp_Unit_Tests]] for details...&lt;br /&gt;
&lt;br /&gt;
== The structure of the sandbox ==&lt;br /&gt;
&lt;br /&gt;
You now might wonder what all those directories are good for. To learn more about this check out the [[Pyogp/Filesystem_Structure|Filesystem Structure]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Enus_Linden/Office_Hours/Friday&amp;diff=783022</id>
		<title>User:Enus Linden/Office Hours/Friday</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Enus_Linden/Office_Hours/Friday&amp;diff=783022"/>
		<updated>2010-03-05T20:23:44Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{hCalendar event/Office Hours&lt;br /&gt;
|mode={{{mode|}}}&lt;br /&gt;
|Resident=Enus Linden&lt;br /&gt;
|weekday=Friday&lt;br /&gt;
|start=1pm {{SLT}}&lt;br /&gt;
|end=2pm {{SLT}}&lt;br /&gt;
|location=[http://slurl.com/secondlife/Longfellow/99/97/28 Enus&#039; Clubhouse]&lt;br /&gt;
|description=&#039;&#039;&#039;My Office hours are on sabbatical until further notice, feel free to find me in world otherwise...&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Topics:&lt;br /&gt;
* Primarily Pyogp&lt;br /&gt;
* QA&lt;br /&gt;
* Bots&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Enus_Linden/Office_Hours/Friday&amp;diff=783012</id>
		<title>User:Enus Linden/Office Hours/Friday</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Enus_Linden/Office_Hours/Friday&amp;diff=783012"/>
		<updated>2010-03-05T20:23:19Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{hCalendar event/Office Hours&lt;br /&gt;
|mode={{{mode|}}}&lt;br /&gt;
|Resident=Enus Linden&lt;br /&gt;
|weekday=Friday&lt;br /&gt;
|start=1pm {{SLT}}&lt;br /&gt;
|end=2pm {{SLT}}&lt;br /&gt;
|location=[http://slurl.com/secondlife/Longfellow/99/97/28 Enus&#039; Clubhouse]&lt;br /&gt;
|description=&#039;&#039;&#039;On Office hours sabbatical until further notice, feel free to find me in world otherwise...&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Topics:&lt;br /&gt;
* Primarily Pyogp&lt;br /&gt;
* QA&lt;br /&gt;
* Bots&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Enus_Linden/Office_Hours/Friday&amp;diff=774272</id>
		<title>User:Enus Linden/Office Hours/Friday</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Enus_Linden/Office_Hours/Friday&amp;diff=774272"/>
		<updated>2010-02-26T20:28:23Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{hCalendar event/Office Hours&lt;br /&gt;
|mode={{{mode|}}}&lt;br /&gt;
|Resident=Enus Linden&lt;br /&gt;
|weekday=Friday&lt;br /&gt;
|start=1pm {{SLT}}&lt;br /&gt;
|end=2pm {{SLT}}&lt;br /&gt;
|location=[http://slurl.com/secondlife/Longfellow/99/97/28 Enus&#039; Clubhouse]&lt;br /&gt;
|description=&#039;&#039;&#039;No meeting February 26...&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Topics:&lt;br /&gt;
* Primarily Pyogp&lt;br /&gt;
* QA&lt;br /&gt;
* Bots&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library&amp;diff=724932</id>
		<title>PyOGP Client Library</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library&amp;diff=724932"/>
		<updated>2010-02-09T18:14:57Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* Python module dependencies */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
PyOGP is a young, open source, python client library which provides an interface to an agent (client) of a Second Life grid. The code aims to enable automated testing of Second Life grids, to encourage and enable exploration into the client/server relationship and related protocols of Second Life, and to make possible simple prototyping of various client applications.&lt;br /&gt;
&lt;br /&gt;
Hosted on svn.secondlife.com, it does require a contributor&#039;s agreement for commit access, and currently has a few contributors from the Second Life open source community.&lt;br /&gt;
&lt;br /&gt;
P.S. We&#039;ll likely be moving to hg relatively soon...&lt;br /&gt;
&lt;br /&gt;
* mailing list: pyogp@lists.secondlife.com&lt;br /&gt;
* irc: irc://irc.freenode.com/#pyogp&lt;br /&gt;
* wiki: http://wiki.secondlife.com/wiki/Pyogp&lt;br /&gt;
* licensing: Apache 2.0 license, copyright Linden Lab&lt;br /&gt;
&lt;br /&gt;
=== Goals ===&lt;br /&gt;
&lt;br /&gt;
In the very near future, we can have tests available to be run as soon as a deploy is completed that exercise a simulator/grid in the same way we do a smoke test. We will use these as automated tests run at build time, post deploy validation, and regression testing of simulators and backend systems.&lt;br /&gt;
&lt;br /&gt;
This provides early feedback on code quality. QA is then able to dive deeper in testing the changes specific to a branch. &lt;br /&gt;
&lt;br /&gt;
Having this library available also allows us to test potential changes before we have finalized design and are ready to submit to QA. Not sure how something will play out? Try it, and test it with PyOGP....&lt;br /&gt;
&lt;br /&gt;
=== A Brief History ===&lt;br /&gt;
&lt;br /&gt;
PyOGP was originally created as a tool for testing [[OGP]] related changes to the Second Life grid. By the end of the summer in 2008, the &#039;&#039;&#039;pyogp.lib.base&#039;&#039;&#039; package provided a skeleton messaging system and was able to test Linden Lab&#039;s first implementation of an agent domain and the related changes in an agent&#039;s region handoff and teleport. As the development effort around OGP waned, we started to extend pyogp by adding higher level client related functionality. Recently, this functionality was split out into a separate python package (&#039;&#039;&#039;pyogp.lib.client&#039;&#039;&#039;), and sample scripts (and future apps) were moved into &#039;&#039;&#039;pyogp.apps&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Architecture Overview==&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
&lt;br /&gt;
PyOGP is comprised of three python packages. The library consists of pyogp.lib.base and pyogp.lib.client, while sample scripts, and in time applications, live in pyogp.apps. &lt;br /&gt;
:&#039;&#039;&#039;pyogp.lib.base&#039;&#039;&#039; - consists of basic networking, messaging systems (UDP and event queue) and capabilities, custom datatypes, and a low level message related event system&lt;br /&gt;
:&#039;&#039;&#039;pyogp.lib.client&#039;&#039;&#039; - consists of &#039;convenience&#039; classes mapping methods and handlers to specific messages (e.g. Agent().say(msg) tells the client to send the ChatFromViewer message to the host region). Raises application oriented events based on processing of messages (these are currently sparsely implemented)&lt;br /&gt;
:&#039;&#039;&#039;pyogp.apps&#039;&#039;&#039; - sample scripts and works in progress, the scripts here generally illustrate simple usage of classes as related to in world interactions by an agent of a Second Life grid&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
==== Platform / Python version compatibility ====&lt;br /&gt;
&lt;br /&gt;
PyOGP aims to be compatible across platforms, though there are known problems with various environments. We&#039;ll be focusing on ensuring better compatibility soon.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Known good configurations&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:Windows XP + Python 2.5&lt;br /&gt;
:Mac + Python 2.5, 2.6&lt;br /&gt;
:Linux + Python 2.4, 2.5, 2.6 (Linden hosts fall into this group) &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Known bad configurations&#039;&#039;&#039;&lt;br /&gt;
:Windows Vista + Python 2.6&lt;br /&gt;
:Windows 7 + Python 2.6&lt;br /&gt;
&lt;br /&gt;
There have been challenges in ensuring compatibility between the various dependencies, largely due to greenlet, eventlet, and pyopenssl. Please report bugs on [http://jira.secondlife.com/browse/PYO pJira]&lt;br /&gt;
&lt;br /&gt;
==== Python module dependencies ====&lt;br /&gt;
&lt;br /&gt;
The packages that make up PyOGP have some dependencies on python modules not included in a standard install, or sometimes not available on an older Python distribution.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;pyogp.lib.base dependencies:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;  #from setup.py&lt;br /&gt;
  &lt;br /&gt;
     install_requires=[&lt;br /&gt;
         &#039;setuptools&#039;,&lt;br /&gt;
         # -*- Extra requirements: -*-&lt;br /&gt;
         &#039;uuid&#039;,&lt;br /&gt;
         &#039;elementtree&#039;,&lt;br /&gt;
         &#039;llbase&#039;,&lt;br /&gt;
         &#039;WebOb&#039;,&lt;br /&gt;
         &#039;wsgiref&#039;,&lt;br /&gt;
         &#039;eventlet==0.8.14&#039;&lt;br /&gt;
         ]&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;pyogp.lib.client dependencies:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;     install_requires=[&lt;br /&gt;
         &#039;setuptools&#039;,&lt;br /&gt;
         # -*- Extra requirements: -*-&lt;br /&gt;
         &#039;pyogp.lib.base&#039;&lt;br /&gt;
         ] &amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;pyogp.apps dependencies:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;     install_requires=[&lt;br /&gt;
         &#039;setuptools&#039;,&lt;br /&gt;
         &#039;pyogp.lib.client&#039;&lt;br /&gt;
         ]&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== How to install ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Lindens can see internal documentation for more specific guidance. https://wiki.lindenlab.com/wiki/Pyogp#How_to_Install&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Standalone dev environment using buildout ====&lt;br /&gt;
&lt;br /&gt;
Buildout is a type of Python development environment, organizing and configuring various components and their dependencies. On a desktop, one may checkout such an environment for working with PyOGP. One may optionally use a virtualenv Python environment to isolate the development code and it&#039;s runtime environment on one&#039;s host.&lt;br /&gt;
&lt;br /&gt;
Dependencies: buildout takes care of everything, grabbing needed modules etc.&lt;br /&gt;
&lt;br /&gt;
Wiki instructions: https://wiki.secondlife.com/wiki/Pyogp/Client_Lib/The_Development_Sandbox&lt;br /&gt;
&lt;br /&gt;
==== Installing the PyOGP packages ====&lt;br /&gt;
&lt;br /&gt;
Each of the PyOGP package may be installed to one&#039;s Python install or to a [http://pypi.python.org/pypi/virtualenv virtualenv]. &#039;&#039;&#039;Buyer beware&#039;&#039;&#039; if installing into your system&#039;s install: you&#039;ll want to be able to uninstall manually, as we haven&#039;t hooked up the uninstall. PyOGP is still coming up to speed with respect to distutils and pypi and the like, but it&#039;s relatively close now.&lt;br /&gt;
&lt;br /&gt;
To install a package, simply run &#039;python setup.py install&#039; in a package&#039;s root.&lt;br /&gt;
&lt;br /&gt;
==== Referencing PyOGP packages via the PATH ====&lt;br /&gt;
&lt;br /&gt;
Source code can be referenced directly if one simply ensures that a package, and it&#039;s dependencies, are available in the PYTHONPATH environmental variable.&lt;br /&gt;
&lt;br /&gt;
== Current functional coverage ==&lt;br /&gt;
&lt;br /&gt;
Anything not listed as covered is probably not yet covered.&lt;br /&gt;
&lt;br /&gt;
pyogp.lib.base:&lt;br /&gt;
:* base udp messaging system (message.*)&lt;br /&gt;
:** UDP serialization/deserialization&lt;br /&gt;
:** message_template.msg parsing &lt;br /&gt;
:* base event queue messaging system (event_queue.EventQueueClient())&lt;br /&gt;
:* capabilities and their methods. Seed capabilities are a special case. (caps.Capability())&lt;br /&gt;
:* Message-based events (message.message_handler)&lt;br /&gt;
&lt;br /&gt;
pyogp.lib.client:&lt;br /&gt;
:* agents (agent.Agent())&lt;br /&gt;
:** L$ balance request, friending, and walk/fly/sit/stand actions...&lt;br /&gt;
:* OGP agentdomain (agentdomain.AgentDomain())&lt;br /&gt;
:* application level events (event_system.AppEventsHandler())&lt;br /&gt;
:* some object handling (objects.*)&lt;br /&gt;
:** edit name, description, next-owner permissions and more&lt;br /&gt;
:** object creation is possible&lt;br /&gt;
:* some inventory handling (inventory.*)&lt;br /&gt;
:** login inv skeletons&lt;br /&gt;
:** fetching inventory, including AIS (caps based Agent Inventory Services))&lt;br /&gt;
:** some creating of new inventory items (LSL scripts, notecards)&lt;br /&gt;
:* regions (region.Region())&lt;br /&gt;
:** host and neighboring regions are handled slightly differently&lt;br /&gt;
:** udp and event queue connections are optionally enabled for each case&lt;br /&gt;
:** currently only pulling caps available to the agent via the seed cap (plus using the inventory related caps in the AIS context)&lt;br /&gt;
:* some appearance handling (appearance.AppearanceManager), &lt;br /&gt;
:* parcels&lt;br /&gt;
:* chat&lt;br /&gt;
:* some ImprovedInstantMessage handling&lt;br /&gt;
:** raises events on received instant messages&lt;br /&gt;
:** can deal with inventory offers/accepts/declines&lt;br /&gt;
:** other cases in this message are currently only logged&lt;br /&gt;
:* groups&lt;br /&gt;
:* group chat&lt;br /&gt;
:* LSL script uploading&lt;br /&gt;
&lt;br /&gt;
=== Sample Scripts ===&lt;br /&gt;
&lt;br /&gt;
There are a variety of scripted examples that have been used to exercise and test functionality as it is added to the library. These persist as coded documentation.&lt;br /&gt;
&lt;br /&gt;
The source code is available in https://svn.secondlife.com/svn/linden/projects/2008/pyogp/pyogp.apps/trunk/pyogp/apps/examples/.&lt;br /&gt;
&lt;br /&gt;
The following refers to a buildout context. If one installs pyogp.apps vi setup.py, these scripts will exist in the python environment&#039;s bin/ directory. In the buildout context, these scripts are available in {buildout root}/bin.&lt;br /&gt;
&lt;br /&gt;
The scripts are derived from a package&#039;s &#039;setup.py&#039; via the entry_points parameter, and essentially build executable Python scripts configured to run in the correct environment with the proper dependencies added the the path used by the script. These scripts are currently just simple illustrations of some uses of the PyOGP codebase.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;  #the current entry_points in setup.py og pyogp.apps:&lt;br /&gt;
  &lt;br /&gt;
     entry_points={&lt;br /&gt;
         &#039;console_scripts&#039;: [&lt;br /&gt;
             &#039;AIS_inventory_handling = pyogp.apps.examples.AIS_inventory_handling:main&#039;,&lt;br /&gt;
             &#039;agent_login = pyogp.apps.examples.agent_login:main&#039;,&lt;br /&gt;
             &#039;agent_manager = pyogp.apps.examples.agent_manager:main&#039;,&lt;br /&gt;
             &#039;appearance_management = pyogp.apps.examples.appearance_management:main&#039;,&lt;br /&gt;
             &#039;chat_and_instant_messaging = pyogp.apps.examples.chat_and_instant_messaging:main&#039;,&lt;br /&gt;
             &#039;group_chat = pyogp.apps.examples.group_chat:main&#039;,&lt;br /&gt;
             &#039;group_creation = pyogp.apps.examples.group_creation:main&#039;,&lt;br /&gt;
             &#039;inventory_handling = pyogp.apps.examples.inventory_handling:main&#039;,&lt;br /&gt;
             &#039;inventory_transfer = pyogp.apps.examples.inventory_transfer:main&#039;,&lt;br /&gt;
             &#039;inventory_transfer_specify_agent = pyogp.apps.examples.inventory_transfer_specify_agent:main&#039;,&lt;br /&gt;
             &#039;login = pyogp.apps.examples.login:main&#039;,&lt;br /&gt;
             &#039;multi_region_connect = pyogp.apps.examples.multi_region_connect:main&#039;,&lt;br /&gt;
             &#039;object_create_edit = pyogp.apps.examples.object_create_edit:main&#039;,&lt;br /&gt;
             &#039;object_create_permissions = pyogp.apps.examples.object_create_permissions:main&#039;,&lt;br /&gt;
             &#039;object_create_rez_script = pyogp.apps.examples.object_create_rez_script:main&#039;,&lt;br /&gt;
             &#039;object_creation = pyogp.apps.examples.object_creation:main&#039;,&lt;br /&gt;
             &#039;object_properties = pyogp.apps.examples.object_properties:main&#039;,&lt;br /&gt;
             &#039;object_tracking = pyogp.apps.examples.object_tracking:main&#039;,&lt;br /&gt;
             &#039;parcel_management = pyogp.apps.examples.parcel_management:main&#039;,&lt;br /&gt;
             &#039;parse_packets = pyogp.apps.examples.parse_packets:main&#039;,&lt;br /&gt;
             &#039;region_connect = pyogp.apps.examples.region_connect:main&#039;,&lt;br /&gt;
             &#039;smoke_test = pyogp.apps.examples.smoke_test:main&#039;,&lt;br /&gt;
             &#039;chat = pyogp.apps.examples.chat_interface:main&#039;,&lt;br /&gt;
             ]&lt;br /&gt;
        }&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How it Works (High Level) ==&lt;br /&gt;
&lt;br /&gt;
=== Eventlet ===&lt;br /&gt;
&lt;br /&gt;
PyOGP use [[Eventlet]] to run coroutines to handle multiple &#039;concurrent&#039; processes, rather than threads or multiple processes. Each client agent instance will spawn a handful of coroutines to handles e.g. the UDP pipe, the Event Queue, various monitors, while yielding time to the parent process which should ensure it yields to the other routines as well.&lt;br /&gt;
&lt;br /&gt;
PyOGP uses eventlet in very elementary ways at this point, but will perhaps start to use blocking queues in some cases, so that the coroutine only is allocated processing time if there is work for it to do.&lt;br /&gt;
&lt;br /&gt;
=== pyogp.lib.base ===&lt;br /&gt;
&lt;br /&gt;
This package handles the protocols used when communicating with a Second Life grid. A high level perspective on the package reveals a MessageManager() (still in development) which provides an interface to the UDP and Event Queue connections, as well as basic networking with enables login and capabilities interactions. The base package also has a low level even system through which all messages are passed and sent to subscribers.&lt;br /&gt;
&lt;br /&gt;
Any subcomponent is available for direct interaction at any time, the MessageManager() and the MessageHandler() are the simple access points.&lt;br /&gt;
&lt;br /&gt;
==== Events &amp;amp; Callbacks ====&lt;br /&gt;
&lt;br /&gt;
The event implementation in pyogp follows the observer pattern, where observers subscribe to and are notified when an event occurs. Data is passed throughout the client instance via events. &lt;br /&gt;
&lt;br /&gt;
* MessageManager - is an attribute of a Region and every packet received/sent is filtered through here. subscriptions are by message name&lt;br /&gt;
** MessageHandler - is an attribute of MessageManager, and every categorized message received from the event queue or udp dispatcher is filtered through here. (message as defined in message_template.msg, or one of [&#039;ChatterBoxInvitation&#039;, &#039;ChatterBoxSessionEventReply&#039;, &#039;ChatterBoxSessionAgentListUpdates&#039;, &#039;ChatterBoxSessionStartReply&#039;, &#039;EstablishAgentCommunication&#039;]. There may be unhandled messages, I just haven&#039;t seen em yet :))&lt;br /&gt;
&lt;br /&gt;
===== Message Events =====&lt;br /&gt;
&lt;br /&gt;
In the most fundamental implementation of event usage, all packets are passed through a MessageManager() instance for evaluation. Observers may register to receive udp packets serialized into the form of Message() instances. The MessageHandler() is a consolidation point for subscribing to messages keyed by message name, and created on demand via subscription.&lt;br /&gt;
&lt;br /&gt;
See pyogp.lib.base.message.message_handler.MessageHandler() for more details.&lt;br /&gt;
&lt;br /&gt;
The pyogp agent&#039;s Region() instances each monitor their stream of packets (e.g. the host region: agent.region.message_manager.message_handler). (Perhaps this should be changed to a generalized Network() class where all packets (coupled to their originating regions) are evaluated.&lt;br /&gt;
&lt;br /&gt;
Event firing passes data on to a callback handler defined in the subscription, in the form of (handler, *args, **kwargs).&lt;br /&gt;
&lt;br /&gt;
The Agent class monitors the ImprovedInstantMessage packet:&lt;br /&gt;
&amp;lt;python&amp;gt;        onImprovedInstantMessage_received = self.region.message_handler.register(&#039;ImprovedInstantMessage&#039;)&lt;br /&gt;
        onImprovedInstantMessage_received.subscribe(self.onImprovedInstantMessage)&lt;br /&gt;
&lt;br /&gt;
    def onImprovedInstantMessage(self, packet):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot; handles the many cases of data being passed in this message &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        {code} # parse and handle the data...&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The messaging system then fires the event when an ImprovedInstantMessage message is received, which calls onImprovedInstantMessage method above to handle the message contents. Multiple subscribers may be listening for any message related event, and each would be notified of the same Message() instance.&lt;br /&gt;
&lt;br /&gt;
Unsubscribing from an event:&lt;br /&gt;
&amp;lt;python&amp;gt;        onImprovedInstantMessage_received.unsubscribe(self.onImprovedInstantMessage)&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are various event and callback implementations viewable in pyogp, poke around and help consolidate things if you like.&lt;br /&gt;
&lt;br /&gt;
=== pyogp.lib.client ===&lt;br /&gt;
&lt;br /&gt;
The client package generally provides a convenient interface to initiate or interpret interactions with host region (or neighboring regions). By listening to the messaging related event system in pyogp.lib.base, the client package interprets the messages that come in off the wire, and executes business logic in building responses. pyogp.lib.client also provides simple methods to enable the ending of messages to a grid.&lt;br /&gt;
&lt;br /&gt;
==== Events ====&lt;br /&gt;
&lt;br /&gt;
* EventsHandler - an attribute of an Agent, also able to be passed in, that is intended as the primary interface of a pyogp application into the internal state and data events within the lib. This system uses the same base classes as used by the MessageHandler() in the base package, and the descriptions about events and callbacks above apply here as well. The api for subscribing to these events is similar to the MessageHandler(), with an additional timeout parameter passed in the _register() method. When the specified timeout expires, the subscription returns None and expires the subscription.&lt;br /&gt;
&lt;br /&gt;
==== Agent Login (examples) ====&lt;br /&gt;
&lt;br /&gt;
===== Single Agent Login &amp;amp; Chat=====&lt;br /&gt;
&lt;br /&gt;
Spawn a client in a co-routine, allowing persistent presence until forcefully terminated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;from eventlet import api&lt;br /&gt;
&lt;br /&gt;
from pyogp.lib.client.agent import Agent&lt;br /&gt;
from pyogp.lib.client.settings import Settings&lt;br /&gt;
&lt;br /&gt;
settings = Settings()&lt;br /&gt;
&lt;br /&gt;
settings.ENABLE_INVENTORY_MANAGEMENT = True&lt;br /&gt;
settings.MULTIPLE_SIM_CONNECTIONS = False&lt;br /&gt;
&lt;br /&gt;
client = Agent(settings = settings)&lt;br /&gt;
&lt;br /&gt;
api.spawn(client.login, options.loginuri, &#039;first&#039;, &#039;last&#039;, &#039;password&#039;, start_location = options.region)&lt;br /&gt;
&lt;br /&gt;
# wait for the agent to connect to it&#039;s region&lt;br /&gt;
while client.connected == False:&lt;br /&gt;
    api.sleep(0)&lt;br /&gt;
&lt;br /&gt;
while client.region.connected == False:&lt;br /&gt;
    api.sleep(0)&lt;br /&gt;
&lt;br /&gt;
client.say(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# once connected, live until someone kills me&lt;br /&gt;
while client.running:&lt;br /&gt;
    api.sleep(0)&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Multiple Agent Login =====&lt;br /&gt;
&lt;br /&gt;
Each agent instance in logged in in a separate coroutine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;from pyogp.lib.client.agent import Agent&lt;br /&gt;
from pyogp.lib.client.agentmanager import AgentManager&lt;br /&gt;
&lt;br /&gt;
credentials= [(&#039;agent1&#039;, &#039;lastname&#039;, &#039;password&#039;), (&#039;agent2&#039;, &#039;lastname&#039;, &#039;password&#039;)]&lt;br /&gt;
agents = []&lt;br /&gt;
&lt;br /&gt;
# prime the Agent instances&lt;br /&gt;
for firstname, lastname, password in credentials:&lt;br /&gt;
    agents.append(Agent(settings, firstname, lastname, password))&lt;br /&gt;
&lt;br /&gt;
agentmanager = AgentManager()&lt;br /&gt;
agentmanager.initialize(agents)&lt;br /&gt;
&lt;br /&gt;
# log them in&lt;br /&gt;
for key in agentmanager.agents:&lt;br /&gt;
    agentmanager.login(key, options.loginuri, options.region)&lt;br /&gt;
&lt;br /&gt;
# while they are connected, stay alive&lt;br /&gt;
while agentmanager.has_agents_running():&lt;br /&gt;
    api.sleep(0)&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extending Functionality ==&lt;br /&gt;
&lt;br /&gt;
While the implementations and structures in pyogp.lib.base can (and are in the process of) being refactored to improve performance or usability, it is a fairly complete package. &lt;br /&gt;
&lt;br /&gt;
The functional coverage PyOGP provides on the other hand is not complete, and there are a variety of needs to complete the implementation in pyogp.lib.base. We need to improve coverage of message handling (dealing with messages sent to the client), add more wrappers for sending various messages and performing multistep tasks (to simplify the initiation of interactions with the region), and we need to raise more application level events in the client package so that applications have easy access to incoming data. &lt;br /&gt;
&lt;br /&gt;
=== Sending Messages ===&lt;br /&gt;
&lt;br /&gt;
PyOGP, like the Viewer, communicates with the Second Life simulator by sending messages over UDP. &lt;br /&gt;
&lt;br /&gt;
In order to extend PyOGP, you&#039;ll build a representation of a new UDP message, and send it through the pyogp.lib.base modules for serialization and wire handling.&lt;br /&gt;
&lt;br /&gt;
=== Example: Sending an IM ===&lt;br /&gt;
&lt;br /&gt;
To send an IM to the simulator, send an ImprovedInstantMessage packet.  The base class for message packets is defined in &amp;lt;code&amp;gt;base/message/message.py&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Packets are assembled using a Message() instance which has the message name and Block() instances passed in through its constructor.  Similarly, Blocks are assembled by passing in the Block name and the value name and values for each of the Block values. (The ability to build Message() instances via an llsd payload is expected to be introduced soon.)&lt;br /&gt;
&lt;br /&gt;
Note: It is important that the message name, block name, and value names and types should match what is specified in the message template. (It is also possible to manipulate the representation of the stored template, or to use a custom message template.)&lt;br /&gt;
 &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;python&amp;gt;    def send_ImprovedInstantMessage(self, AgentID = None, SessionID = None, &lt;br /&gt;
                                FromGroup = None, ToAgentID = None, &lt;br /&gt;
                                ParentEstateID = None, RegionID = None, &lt;br /&gt;
                                Position = None, Offline = None, &lt;br /&gt;
                                Dialog = None, _ID = None, Timestamp = None, &lt;br /&gt;
                                FromAgentName = None, _Message = None, &lt;br /&gt;
                                BinaryBucket = None):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot; &lt;br /&gt;
        sends an instant message packet to ToAgentID. this is a &lt;br /&gt;
        multi-purpose message for inventory offer handling, im, group chat, &lt;br /&gt;
        and more &lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        packet = Message(&#039;ImprovedInstantMessage&#039;, &lt;br /&gt;
                         Block(&#039;AgentData&#039;, &lt;br /&gt;
                               AgentID = AgentID, &lt;br /&gt;
                               SessionID = SessionID), &lt;br /&gt;
                         Block(&#039;MessageBlock&#039;, &lt;br /&gt;
                               FromGroup = FromGroup, &lt;br /&gt;
                               ToAgentID = ToAgentID, &lt;br /&gt;
                               ParentEstateID = ParentEstateID, &lt;br /&gt;
                               RegionID = RegionID, &lt;br /&gt;
                               Position = Position, &lt;br /&gt;
                               Offline = Offline, &lt;br /&gt;
                               Dialog = Dialog, &lt;br /&gt;
                               ID = UUID(str(_ID)), &lt;br /&gt;
                               Timestamp = Timestamp, &lt;br /&gt;
                               FromAgentName = FromAgentName, &lt;br /&gt;
                               Message = _Message, &lt;br /&gt;
                               BinaryBucket = BinaryBucket))&lt;br /&gt;
&lt;br /&gt;
        # Send the message:&lt;br /&gt;
        self.region.enqueue_message(packet, True)&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling Incoming Messages and Raising an Event ===&lt;br /&gt;
&lt;br /&gt;
To listen for when messages of a particular type are sent to the client instance, subscribe to the MessageHandler() on the host region&#039;s MessageManager(), like the example that follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;        onImprovedInstantMessage_received = self.region.message_handler.register(&#039;ImprovedInstantMessage&#039;)&lt;br /&gt;
        onImprovedInstantMessage_received.subscribe(self.onImprovedInstantMessage)&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When the event is fired upon receipt of the message matching the name, the specified callback handles the data passed along, and in this case raises an event notifying observers of the &#039;InstantMessageReceived&#039; event in pyogp.lib.client of the important data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;    def onImprovedInstantMessage(self, packet):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot; callback handler for received ImprovedInstantMessage messages. much is passed in this message, and handling the data is only partially implemented &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        Dialog = packet.blocks[&#039;MessageBlock&#039;][0].get_variable(&#039;Dialog&#039;).data&lt;br /&gt;
        FromAgentID = packet.blocks[&#039;AgentData&#039;][0].get_variable(&#039;AgentID&#039;).data&lt;br /&gt;
&lt;br /&gt;
        if Dialog == ImprovedIMDialogue.InventoryOffered:&lt;br /&gt;
&lt;br /&gt;
            self.inventory.handle_inventory_offer(packet)&lt;br /&gt;
&lt;br /&gt;
        # ...&lt;br /&gt;
        # some of the Dialogue types this message can contain are handled, we are showing 2&lt;br /&gt;
        # ...&lt;br /&gt;
&lt;br /&gt;
        elif Dialog == ImprovedIMDialogue.FromAgent:&lt;br /&gt;
&lt;br /&gt;
            # ... code parses the data from the Message() instance ...&lt;br /&gt;
&lt;br /&gt;
            message = AppEvent(&#039;InstantMessageReceived&#039;, FromAgentID = FromAgentID, RegionID = RegionID, Position = Position, ID = ID, FromAgentName = FromAgentName, Message = _Message)&lt;br /&gt;
&lt;br /&gt;
            logger.info(&amp;quot;Received instant message from %s: %s&amp;quot; % (FromAgentName, _Message))&lt;br /&gt;
&lt;br /&gt;
            self.events_handler.handle(message)&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
&lt;br /&gt;
Uses python&#039;s standard logging module (http://docs.python.org/library/logging.html). The library defines logging events throughout, it is up to the application/script to determine the output.&lt;br /&gt;
&lt;br /&gt;
Hooking logging into a new module:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;from logging import getLogger&lt;br /&gt;
&lt;br /&gt;
# initialize logging&lt;br /&gt;
logger = getLogger(&#039;pyogp.lib.client.agent&#039;)&lt;br /&gt;
&lt;br /&gt;
class Agent(object):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot; our agent class &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, params):&lt;br /&gt;
&lt;br /&gt;
        self.params = params&lt;br /&gt;
&lt;br /&gt;
        logger.debug(&amp;quot;Initializing agent with params: %s&amp;quot; % (params))&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An application can then set up the logging output as follows (or any other way it pleases):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;console = logging.StreamHandler()&lt;br /&gt;
formatter = logging.Formatter(&#039;%(asctime)-30s%(name)-30s: %(levelname)-8s %(message)s&#039;)&lt;br /&gt;
console.setFormatter(formatter)&lt;br /&gt;
logging.getLogger(&#039;&#039;).addHandler(console)&lt;br /&gt;
logging.getLogger(&#039;&#039;).setLevel(logging.DEBUG)&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The output to console is then:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bash&amp;gt;2009-04-21 22:08:58,681       pyogp.lib.base.agent          : DEBUG    agent with params: params&amp;lt;/bash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pyogp Unit Tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Package_Unittests]].&lt;br /&gt;
&lt;br /&gt;
== Sphinx (api docs) ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Api documentation is now available for PyOGP packages&#039;&#039;&#039; (well, not for apps yet, but someday....)!&lt;br /&gt;
 &lt;br /&gt;
In pyogp/docs in each of the pyogp.lib.base and pyogp.lib.client packages, one will find source, last revision, and build files for sphinx based documents. Output is available at {package root}/docs/html/index.html.&lt;br /&gt;
&lt;br /&gt;
We plan on sharing the api documentation on the web soon, and will work to make simple build wrappers work on various platforms, though this is a low priority.&lt;br /&gt;
&lt;br /&gt;
Ask Enus for updated documentation to be checked in, or, build a better refresh.py.&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See [[Pyogp/Roadmap]] for details, or ask in irc or on the mailing list. Here&#039;s what&#039;s up in the near term for pyogp:&lt;br /&gt;
&lt;br /&gt;
* better &#039;&#039;&#039;packaging&#039;&#039;&#039; and &#039;&#039;&#039;platform compatibility&#039;&#039;&#039;&lt;br /&gt;
* more &#039;&#039;&#039;functional coverage&#039;&#039;&#039; of message. We are covering 32% of the messages the viewers sends or handles when received (though it&#039;s estimated at more like 50% of normal use cases.&lt;br /&gt;
* &#039;&#039;&#039;permissions system testing&#039;&#039;&#039; to save QA from 3-5 day regression passes on perms&lt;br /&gt;
* &#039;&#039;&#039;appearance&#039;&#039;&#039; - this will require enabling upload and download, plus baking. Anyone have some spare time? :)&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;br /&gt;
[[Category: Pyogp]]&lt;br /&gt;
[[Category:Architecture Working Group]]&lt;br /&gt;
[[Category:Grid_Interoperability]]&lt;br /&gt;
[[Category:AW Groupies]]&lt;br /&gt;
[[Category:MMOX]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Enus_Linden/Office_Hours/2010_Fenruary_05&amp;diff=722613</id>
		<title>User:Enus Linden/Office Hours/2010 Fenruary 05</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Enus_Linden/Office_Hours/2010_Fenruary_05&amp;diff=722613"/>
		<updated>2010-02-05T23:47:35Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: moved User:Enus Linden/Office Hours/2010 Fenruary 05 to User:Enus Linden/Office Hours/2010 February 05&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[User:Enus Linden/Office Hours/2010 February 05]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Enus_Linden/Office_Hours/2010_February_05&amp;diff=722603</id>
		<title>User:Enus Linden/Office Hours/2010 February 05</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Enus_Linden/Office_Hours/2010_February_05&amp;diff=722603"/>
		<updated>2010-02-05T23:47:35Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: moved User:Enus Linden/Office Hours/2010 Fenruary 05 to User:Enus Linden/Office Hours/2010 February 05&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[13:02]  Latif Khalifa: perhaps enus will grace us with his presence this year&amp;lt;br&amp;gt;&lt;br /&gt;
[13:02]  Latif Khalifa: :P&amp;lt;br&amp;gt;&lt;br /&gt;
[13:02]  Dedric Mauriac: if anyone would like a free bear, let me know and i&#039;ll send you mine.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:02]  Ardy Lay: Nice lag-walk there Enus.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:02]  Enus Linden: it&#039;s punishment latif&amp;lt;br&amp;gt;&lt;br /&gt;
[13:03]  Latif Khalifa: speaking of the...&amp;lt;br&amp;gt;&lt;br /&gt;
[13:03]  Latif Khalifa: lol&amp;lt;br&amp;gt;&lt;br /&gt;
[13:03]  Enus Linden: tz ardy, i&#039;ve been working on perfecting it!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:03]  Enus Linden: tx*&amp;lt;br&amp;gt;&lt;br /&gt;
[13:03]  Latif Khalifa: judging by how often you come, you sure must feel like it&#039;s punishment :P&amp;lt;br&amp;gt;&lt;br /&gt;
[13:04]  Enus Linden: tbh, i&#039;ve been wrestling with the idea of 1. stopping my OH or 2. sharing the mc responsibilities&amp;lt;br&amp;gt;&lt;br /&gt;
[13:04]  Enus Linden: its not getting any easier to make time, and that sucks&amp;lt;br&amp;gt;&lt;br /&gt;
[13:04]  Enus Linden: i dont want to stop em&amp;lt;br&amp;gt;&lt;br /&gt;
[13:04]  Enus Linden: but do want them to be mutually useful&amp;lt;br&amp;gt;&lt;br /&gt;
[13:05]  Enus Linden: nice to see that folks havent given up yet!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:05]  Latif Khalifa: i was advertising the OH xD&amp;lt;br&amp;gt;&lt;br /&gt;
[13:05]  Arcane Laval: :)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:05]  Dedric Mauriac: we are all just bots&amp;lt;br&amp;gt;&lt;br /&gt;
[13:05]  Latif Khalifa: long time no see :)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:06]  Enus Linden: have you an agenda in advertising today latif?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:06]  Latif Khalifa: erm, no&amp;lt;br&amp;gt;&lt;br /&gt;
[13:06]  Enus Linden: crap, so i need to have one&amp;lt;br&amp;gt;&lt;br /&gt;
[13:06]  Enus Linden: ;)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:06]  Latif Khalifa: i could&#039;ve made one had i known it was required&amp;lt;br&amp;gt;&lt;br /&gt;
[13:06]  Enus Linden: i&#039;ve a couple of things on the mind...&amp;lt;br&amp;gt;&lt;br /&gt;
[13:06]  Ardy Lay: Ah.. well, if you are not getting anything out of them then I don&#039;t see there is much point. I know I don&#039;t have much to offer you. I was just hoping to learn a little more about what&#039;s going on in SL.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:07]  Enus Linden: one is pyogp, which should start moving again soon&amp;lt;br&amp;gt;&lt;br /&gt;
[13:07]  Enus Linden: another is in regards to the automation team&amp;lt;br&amp;gt;&lt;br /&gt;
[13:07]  Enus Linden: and we&#039;ll see where things go from there&amp;lt;br&amp;gt;&lt;br /&gt;
[13:07]  Latif Khalifa: perhaps some would be interested to hear about automated load testing using Amazon EC2 cloud&amp;lt;br&amp;gt;&lt;br /&gt;
[13:07]  Enus Linden: aye latif&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Latif Khalifa: i know i would xD&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Enus Linden: i&#039;ll cover that&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Morgaine Dinova: Me too&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Dedric Mauriac: interesting&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Enus Linden: awesome&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Enus Linden: well, thanks all for coming&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Enus Linden: hi rakesh!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Dedric Mauriac: will there be a white paper about it?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Rakesh Linden: hi Enus&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Enus Linden: dedric, maybe?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Rakesh Linden: there is no voice&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Latif Khalifa: hello Rakesh&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Enus Linden: OH is in text&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Enus Linden: to many languages&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Enus Linden: to listen clearly&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Rakesh Linden: i c.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Youri Ashton: friendly hello&#039;s!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:09]  Rakesh Linden: hi everyone&amp;lt;br&amp;gt;&lt;br /&gt;
[13:09]  Enus Linden: plus text requires minimal moderation&amp;lt;br&amp;gt;&lt;br /&gt;
[13:09]  Enus Linden: hey youri&amp;lt;br&amp;gt;&lt;br /&gt;
[13:09]  Morgaine Dinova: Enus, what would you like to see on your part, that would make these meetings more useful to you, beyond just &amp;quot;community contact&amp;quot;?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:09]  Enus Linden: so pyogp lib work update really quicly&amp;lt;br&amp;gt;&lt;br /&gt;
[13:09]  Enus Linden: good ? morgaine&amp;lt;br&amp;gt;&lt;br /&gt;
[13:09]  Enus Linden: i&#039;ll take a note to discuss it&amp;lt;br&amp;gt;&lt;br /&gt;
[13:09]  Arcane Laval: I&#039;ll be right back!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:10]  Enus Linden: alright: pyogp&amp;lt;br&amp;gt;&lt;br /&gt;
[13:10]  Enus Linden: i have done nil with this for a couple of months&amp;lt;br&amp;gt;&lt;br /&gt;
[13:10]  Enus Linden: i ported to hg&amp;lt;br&amp;gt;&lt;br /&gt;
[13:10]  Enus Linden: did some dev, moved indra.base to llbase after pushing that to pypi&amp;lt;br&amp;gt;&lt;br /&gt;
[13:10]  Enus Linden: and it stalled&amp;lt;br&amp;gt;&lt;br /&gt;
[13:11]  Enus Linden: I&#039;m too busy to continue regularly, but...&amp;lt;br&amp;gt;&lt;br /&gt;
[13:11]  Enus Linden: i&#039;ll be handing off maintenance and further extension of the libs to some folks in QA here&amp;lt;br&amp;gt;&lt;br /&gt;
[13:11]  Enus Linden: OS folks are of course encouraged to collab as well&amp;lt;br&amp;gt;&lt;br /&gt;
[13:12]  Enus Linden: but that&#039;s been quiet for some time and i assume not much there&amp;lt;br&amp;gt;&lt;br /&gt;
[13:12]  Morgaine Dinova: Since it&#039;s the basis of your test platform (isn&#039;t it?), do you mean it&#039;s stalled because your current test stuff works and you have no incentive to touch it?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:12]  Enus Linden: i&#039;d love to see an ecosystem pop up around it again&amp;lt;br&amp;gt;&lt;br /&gt;
[13:12]  Eddi Decosta: hey Enus ㋡&amp;lt;br&amp;gt;&lt;br /&gt;
[13:12]  Enus Linden: should prolly start engageing in irc and the mailing list more agin&amp;lt;br&amp;gt;&lt;br /&gt;
[13:12]  Enus Linden: again&amp;lt;br&amp;gt;&lt;br /&gt;
[13:12]  Enus Linden: morgaine: it&#039;s still ramping up as the basis&amp;lt;br&amp;gt;&lt;br /&gt;
[13:13]  Enus Linden: Rakesh (and Ali, Vektor, Fisher, and others as time allows) will be driving it&#039;s evolution primarily now&amp;lt;br&amp;gt;&lt;br /&gt;
[13:13]  Youri Ashton: hey fisher!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:13]  Eddi Decosta: heya Fisher! ㋡&amp;lt;br&amp;gt;&lt;br /&gt;
[13:13]  Enus Linden: there is MUCh incentive to touch it: it&#039;s incomplete, amd not much testing is in place using it now&amp;lt;br&amp;gt;&lt;br /&gt;
[13:14]  Fisher Linden: Hey&amp;lt;br&amp;gt;&lt;br /&gt;
[13:14]  Enus Linden: that&#039;s going to cahnge this quarter&amp;lt;br&amp;gt;&lt;br /&gt;
[13:14]  Morgaine Dinova: Well I still hope to poke VWRAP bits into PyOGP, once we know what the hell to poke in. ;-) I&#039;m not in the slightest bit happy with Pixel&#039;s addition of OGP code into Snowglobe --- that&#039;s no way to test out protocol ideas, by hardwiring them into C++ code within a nightmare codebase.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:14]  Eddi Decosta: welcome to sl Rakesh lol ㋡&amp;lt;br&amp;gt;&lt;br /&gt;
[13:14]  Enus Linden: VWRAP is highly encouraged to leverage PyOGP&amp;lt;br&amp;gt;&lt;br /&gt;
[13:14]  Morgaine Dinova: :-)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:14]  Enus Linden: maybe a pyogp-vwrap fork is in order&amp;lt;br&amp;gt;&lt;br /&gt;
[13:15]  Enus Linden: in fact, we should make it so&amp;lt;br&amp;gt;&lt;br /&gt;
[13:15]  Rakesh Linden: thx Eddi&amp;lt;br&amp;gt;&lt;br /&gt;
[13:15]  Morgaine Dinova: Could happen. Although with Hg, a &amp;quot;fork&amp;quot; isn&#039;t necessary, just another repository, or several.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:15]  Ardy Lay: Ugh. Some uninitiated noob is closing my JIRA issues as &amp;quot;expected bahaviour&amp;quot;. I gotta go beat on them. Bye.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:15]  Enus Linden: i&#039;d suggest a fork of the lib packages&amp;lt;br&amp;gt;&lt;br /&gt;
[13:15]  Rakesh Linden: is VWRAP a standard yet?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:15]  Enus Linden: slightly more formal&amp;lt;br&amp;gt;&lt;br /&gt;
[13:15]  Morgaine Dinova: Lord no&amp;lt;br&amp;gt;&lt;br /&gt;
[13:16]  Latif Khalifa: there is nothing to fork over for yet&amp;lt;br&amp;gt;&lt;br /&gt;
[13:16]  Enus Linden: it&#039;s a theory&amp;lt;br&amp;gt;&lt;br /&gt;
[13:16]  Rakesh Linden: I thought it is still a proposal&amp;lt;br&amp;gt;&lt;br /&gt;
[13:16]  Latif Khalifa: no implementation exists yet&amp;lt;br&amp;gt;&lt;br /&gt;
[13:16]  Latif Khalifa: so talking about vwrap fork is premature imhp&amp;lt;br&amp;gt;&lt;br /&gt;
[13:16]  Latif Khalifa: o even&amp;lt;br&amp;gt;&lt;br /&gt;
[13:16]  Enus Linden: yep&amp;lt;br&amp;gt;&lt;br /&gt;
[13:16]  Morgaine Dinova: VWRAP is currently at the 5% reached initial draft stage, if that. And not even that 5% is well examined yet, let alone agreed. Early days.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:17]  Enus Linden: i&#039;ll support pyogp as a test bed when timing dictates it&amp;lt;br&amp;gt;&lt;br /&gt;
[13:17]  Rakesh Linden: i agree with Latif&amp;lt;br&amp;gt;&lt;br /&gt;
[13:17]  Enus Linden: so sometime next week i&#039;ll set up a roadmap and walkthrough for qa to grab pyogp and make it go as a server side test source&amp;lt;br&amp;gt;&lt;br /&gt;
[13:18]  Enus Linden: they&#039;ve been tinkering, but we&#039;re all busy&amp;lt;br&amp;gt;&lt;br /&gt;
[13:18]  Morgaine Dinova: That&#039;s cool&amp;lt;br&amp;gt;&lt;br /&gt;
[13:18]  Sea Urchin beanbag: Going to next texture.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:18]  Sea Urchin beanbag: Going to next texture.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:18]  Sea Urchin beanbag: Going to next texture.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:18]  Enus Linden: their work will complement the work of the automation team as it spins up&amp;lt;br&amp;gt;&lt;br /&gt;
[13:19]  Enus Linden: the automation team is Spider, Ray, Xandix, and the not yet started but hired Scobu&amp;lt;br&amp;gt;&lt;br /&gt;
[13:19]  Enus Linden: Cassandra = PM&amp;lt;br&amp;gt;&lt;br /&gt;
[13:19]  Enus Linden: i&#039;m in the mix in some ways, mostly high level&amp;lt;br&amp;gt;&lt;br /&gt;
[13:19]  Morgaine Dinova: Project Manager&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[13:19]  Morgaine Dinova: ?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:19]  Enus Linden: yep Morgaine&amp;lt;br&amp;gt;&lt;br /&gt;
[13:19]  Morgaine Dinova: kk&amp;lt;br&amp;gt;&lt;br /&gt;
[13:19]  Enus Linden: Spider = Lead&amp;lt;br&amp;gt;&lt;br /&gt;
[13:19]  Latif Khalifa: is automatio team all about services, sims, and the backend?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:20]  Enus Linden: not onlt latif&amp;lt;br&amp;gt;&lt;br /&gt;
[13:20]  Enus Linden: will cover Viewer and Web as well&amp;lt;br&amp;gt;&lt;br /&gt;
[13:20]  Latif Khalifa: interesting&amp;lt;br&amp;gt;&lt;br /&gt;
[13:20]  Morgaine Dinova: Viewer? In what respect?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:20]  Dedric Mauriac: click button, verify something happens&amp;lt;br&amp;gt;&lt;br /&gt;
[13:20]  Enus Linden: cannot share details w/o consent at this time&amp;lt;br&amp;gt;&lt;br /&gt;
[13:21]  Enus Linden: GUI automation would be great, but isnt part of the picture right now&amp;lt;br&amp;gt;&lt;br /&gt;
[13:21]  Enus Linden: pixel based testing isn&#039;t our idea of fun yet&amp;lt;br&amp;gt;&lt;br /&gt;
[13:21]  Morgaine Dinova: But that&#039;s GUI QA.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:21]  Dedric Mauriac: unit testing&amp;lt;br&amp;gt;&lt;br /&gt;
[13:21]  Morgaine Dinova: Hmm. Can you explain the diff btn automation and QA teams?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:21]  Enus Linden: functional automation against the viewer is being worked on now though&amp;lt;br&amp;gt;&lt;br /&gt;
[13:21]  Enus Linden: yeah morgaine&amp;lt;br&amp;gt;&lt;br /&gt;
[13:22]  Enus Linden: Automation team&#039;s charter is to build frameworks and environments to support testing&amp;lt;br&amp;gt;&lt;br /&gt;
[13:22]  Dedric Mauriac: qa is people with eyes verifying manually&amp;lt;br&amp;gt;&lt;br /&gt;
[13:22]  Morgaine Dinova: Jeez no Dedric, or I hope not&amp;lt;br&amp;gt;&lt;br /&gt;
[13:22]  Enus Linden: their work will initially be setting up a harness that handles code and enironments to test in, running existing unit tests and functional tests, and enabling more to be run via enrionemnts and such&amp;lt;br&amp;gt;&lt;br /&gt;
[13:22]  Dedric Mauriac: automation supports qa&amp;lt;br&amp;gt;&lt;br /&gt;
[13:23]  Enus Linden: QA = test engineers&amp;lt;br&amp;gt;&lt;br /&gt;
[13:23]  Enus Linden: test planning, risk assessmnet, test execution,&amp;lt;br&amp;gt;&lt;br /&gt;
[13:23]  Enus Linden: QA and Dev write autoamted test cases&amp;lt;br&amp;gt;&lt;br /&gt;
[13:23]  Enus Linden: automation team makes sure they are run and reported on&amp;lt;br&amp;gt;&lt;br /&gt;
[13:24]  Enus Linden: once there is sufficient framework coverage, the automation team can certainly help with test writing&amp;lt;br&amp;gt;&lt;br /&gt;
[13:24]  Enus Linden: but that is not their responsibility atm&amp;lt;br&amp;gt;&lt;br /&gt;
[13:24]  Morgaine Dinova: You mean QA team &amp;quot;makes sure they are run and reported on&amp;quot;, right?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:25]  Widget Whiteberry slips away&amp;lt;br&amp;gt;&lt;br /&gt;
[13:25]  Enus Linden: in a way morgaine, it&#039;s the auto team facilitating the running and reporting. QA uses the data as part of test plan validation&amp;lt;br&amp;gt;&lt;br /&gt;
[13:25]  Morgaine Dinova chuckles&amp;lt;br&amp;gt;&lt;br /&gt;
[13:26]  Enus Linden: so the 30000 foot view of the automatin team roadmap as we know it:&amp;lt;br&amp;gt;&lt;br /&gt;
[13:26]  Enus Linden: provide a test harness&amp;lt;br&amp;gt;&lt;br /&gt;
[13:26]  Morgaine Dinova: I&#039;m confused, but don&#039;t worry about it. The way I make sense of it is Autom == make test infrastructure, QA == use it. But I guess that&#039;s wrong.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:26]  Dedric Mauriac: that&#039;s a lot of feet&amp;lt;br&amp;gt;&lt;br /&gt;
[13:26]  Enus Linden: hook existing automated tests in (ours, third party libs, w/e)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:26]  Enus Linden: morgaine, that&#039;s right&amp;lt;br&amp;gt;&lt;br /&gt;
[13:27]  Morgaine Dinova: Uh, OK ^_^&amp;lt;br&amp;gt;&lt;br /&gt;
[13:27]  Enus Linden: 3000 ft cont: extend the harness with test beds in the form of dedicated hardware and EC2 virtual environments&amp;lt;br&amp;gt;&lt;br /&gt;
[13:27]  Enus Linden: missed a 0 there ;)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:27]  Morgaine Dinova: UDP loss&amp;lt;br&amp;gt;&lt;br /&gt;
[13:28]  Enus Linden: work on facilitating load tests in real and virtual envs&amp;lt;br&amp;gt;&lt;br /&gt;
[13:28]  Enus Linden: report on all of it&amp;lt;br&amp;gt;&lt;br /&gt;
[13:28]  Enus Linden: build libs to support test case state setting and execution&amp;lt;br&amp;gt;&lt;br /&gt;
[13:28]  Enus Linden: etc etc etc&amp;lt;br&amp;gt;&lt;br /&gt;
[13:28]  Enus Linden: we&#039;ve sketched out plans for the year, given info we know, as of this week&amp;lt;br&amp;gt;&lt;br /&gt;
[13:28]  Enus Linden: we start real work monday&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Enus Linden: wheeeee&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Sea Urchin beanbag: Going to next texture.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Morgaine Dinova: Wheee indeed :-)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Latif Khalifa: sounds some awesome QA juice on the way :D&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Fisher Linden: Wheeee indeed&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Sea Urchin beanbag: Going to next texture.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Morgaine Dinova: About time. You can&#039;t afford to do the grunt work manually, really can&#039;t.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Sea Urchin beanbag: Going to next texture.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Sea Urchin beanbag: Going to next texture.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Sea Urchin beanbag: Going to next texture.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Enus Linden: agreed morgaine&amp;lt;br&amp;gt;&lt;br /&gt;
[13:30]  Dedric Mauriac: oh, i think they can afford it, but wouldn&#039;t make sense though&amp;lt;br&amp;gt;&lt;br /&gt;
[13:30]  Enus Linden: QA folks are going to start getting more direction toward automation in many ways&amp;lt;br&amp;gt;&lt;br /&gt;
[13:30]  Enus Linden: for some, it&#039;s a natrual inclination&amp;lt;br&amp;gt;&lt;br /&gt;
[13:30]  Enus Linden: but as a team, we&#039;ve got to start heading that way more and more&amp;lt;br&amp;gt;&lt;br /&gt;
[13:31]  Morgaine Dinova: Will be brill to be able to say &amp;quot;1.23.9 is ready for RC1 release, passes all regression tests for 1.23.8&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:31]  Dedric Mauriac: with the use of automation, problems can be found quicker, as they happen in development, or newly discovered&amp;lt;br&amp;gt;&lt;br /&gt;
[13:31]  Enus Linden: test plans need to assert things like &amp;quot;100% unit tests coverage and 80% functinal test coverage&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
[13:31]  Enus Linden: we need to start budgeting time, and building up skill sets to enable it&amp;lt;br&amp;gt;&lt;br /&gt;
[13:31]  Latif Khalifa: hopefully with amazon and there diverse locations you could add some higher latency tests like connecting from europe etc. some network timing issues are known to slip by if you test from the same country :)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:31]  Enus Linden: so will improve over the upcoming months&amp;lt;br&amp;gt;&lt;br /&gt;
[13:31]  Fisher Linden: Entrance and exit criteria, Enus&amp;lt;br&amp;gt;&lt;br /&gt;
[13:32]  Dedric Mauriac: are you using things like nunit/nmock/nhibernate/log4net and such?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:32]  Morgaine Dinova: Oooh, coverage analysis, need. Even if the coverage assignment is largely handwaved, it&#039;s still helpful.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:32]  Morgaine Dinova: neat*&amp;lt;br&amp;gt;&lt;br /&gt;
[13:32]  Enus Linden: Fisher will do a lot of the grunt work :P&amp;lt;br&amp;gt;&lt;br /&gt;
[13:32]  Fisher Linden: lol...yummy!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:32]  Fisher Linden: We love coverage analysis too&amp;lt;br&amp;gt;&lt;br /&gt;
[13:32]  Enus Linden: latif: latency tests YES&amp;lt;br&amp;gt;&lt;br /&gt;
[13:32]  Morgaine Dinova gives Fisher a cookie&amp;lt;br&amp;gt;&lt;br /&gt;
[13:32]  Fisher Linden: nomnomnom&amp;lt;br&amp;gt;&lt;br /&gt;
[13:33]  Morgaine Dinova: lol&amp;lt;br&amp;gt;&lt;br /&gt;
[13:33]  Enus Linden: so perf/load/benchmark testing....&amp;lt;br&amp;gt;&lt;br /&gt;
[13:33]  Enus Linden: all part of the same equation&amp;lt;br&amp;gt;&lt;br /&gt;
[13:33]  Enus Linden: we&#039;ve talked about my intent to use pyogp on ec2 against a test env before&amp;lt;br&amp;gt;&lt;br /&gt;
[13:33]  Dedric Mauriac: don&#039;t the methods in theLSL language already have automated testing in them wiht each build?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:33]  Enus Linden: that&#039;s on the automation team&#039;s roadmap to facilitate&amp;lt;br&amp;gt;&lt;br /&gt;
[13:34]  Enus Linden: and i need to plug it into QA&#039;s&amp;lt;br&amp;gt;&lt;br /&gt;
[13:34]  Enus Linden: tbh, I need to hire someone to drive it. I can only drive it so much&amp;lt;br&amp;gt;&lt;br /&gt;
[13:34]  Enus Linden: i&#039;ve started. I have test pyogp debs for our system image&amp;lt;br&amp;gt;&lt;br /&gt;
[13:34]  Latif Khalifa: you can do some serious ddos with ec2. i mean load testing :P&amp;lt;br&amp;gt;&lt;br /&gt;
[13:34]  Morgaine Dinova: haha&amp;lt;br&amp;gt;&lt;br /&gt;
[13:34]  Enus Linden: latif: yeah&amp;lt;br&amp;gt;&lt;br /&gt;
[13:34]  Enus Linden: 1st goal: simulate peak concurrency on a grid&amp;lt;br&amp;gt;&lt;br /&gt;
[13:34]  Fisher Linden: Really looking forward to ec2 testing&amp;lt;br&amp;gt;&lt;br /&gt;
[13:35]  Rakesh Linden: ec2 will definitely play a big part in future at Linden&amp;lt;br&amp;gt;&lt;br /&gt;
[13:35]  Dedric Mauriac: I would attempt to simulate more than the peak. mabe 150% peak&amp;lt;br&amp;gt;&lt;br /&gt;
[13:35]  Enus Linden: 2nd goal: 2x peak&amp;lt;br&amp;gt;&lt;br /&gt;
[13:35]  Enus Linden: then 4x&amp;lt;br&amp;gt;&lt;br /&gt;
[13:35]  Dedric Mauriac: ah, good goals&amp;lt;br&amp;gt;&lt;br /&gt;
[13:35]  Enus Linden: and then til stuff falls apart and i break the whole grid&amp;lt;br&amp;gt;&lt;br /&gt;
[13:35]  Latif Khalifa: with libomv you could do prolly 200-300 clients per instance&amp;lt;br&amp;gt;&lt;br /&gt;
[13:35]  Enus Linden: latif: on windows yeas&amp;lt;br&amp;gt;&lt;br /&gt;
[13:35]  Latif Khalifa: don&#039;t know how much pyogp can scale&amp;lt;br&amp;gt;&lt;br /&gt;
[13:35]  Fisher Linden: We will see!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Enus Linden: pyogp can handle 80&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Enus Linden: becaus eof eventlet&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Dedric Mauriac: try simulating 1500 people in one sim. lol&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Enus Linden: eventlet grabs 75% of a cpu&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Enus Linden: and that&#039;s it&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Latif Khalifa: ah&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Enus Linden: could easily run on multiple cpus&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Rakesh Linden: so libomv doesn&#039;t work w Mono?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Latif Khalifa: Rakesh it sure does&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Enus Linden: libomv does work well under mono&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Enus Linden: but mono adds resource overhead&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Enus Linden: at least on our eniacs i can only run 100 clients&amp;lt;br&amp;gt;&lt;br /&gt;
[13:37]  Enus Linden: on my windows desktop i easily run 400&amp;lt;br&amp;gt;&lt;br /&gt;
[13:37]  Rakesh Linden: i c&amp;lt;br&amp;gt;&lt;br /&gt;
[13:37]  Enus Linden: 9eanic = dev box w/ system image like that of a prod host)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:37]  Latif Khalifa: Enus mono 2.6 got a lot better. some memleaks and cpu usage problems we had disappeared&amp;lt;br&amp;gt;&lt;br /&gt;
[13:37]  Enus Linden: ooohhh&amp;lt;br&amp;gt;&lt;br /&gt;
[13:37]  Enus Linden: we still only have 1.9&amp;lt;br&amp;gt;&lt;br /&gt;
[13:37]  Enus Linden: will re-investigate&amp;lt;br&amp;gt;&lt;br /&gt;
[13:37]  Latif Khalifa: if you ever want to test it, go with 2.6&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Latif Khalifa: i&#039;ve seen significant improvements&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Enus Linden: easy to add a new version to a host, but wont update the sys image package anytime soon&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Enus Linden: thanks for the tip&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Rakesh Linden: esp since we use Mono for LSL interpreter&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Dedric Mauriac: so besides havok, we now need to upgrade mono. heh.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Morgaine Dinova: That&#039;s extremely bad news if eventlet only scales that far. Stackless scales massively according to EVE, but I don&#039;t know what &amp;quot;massively&amp;quot; translates to for SL work. Hmmmm ... :-(&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Latif Khalifa: my test with 20 clients went from 60% cpu to 7%&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Enus Linden: woah&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Enus Linden: eventlet is odd in that way morgaine&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Dedric Mauriac looks for a JITA region&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Latif Khalifa: and memory usage was flat&amp;lt;br&amp;gt;&lt;br /&gt;
[13:39]  Enus Linden: so, back to distributed load testing&amp;lt;br&amp;gt;&lt;br /&gt;
[13:39]  Morgaine Dinova: Latif, can&#039;t the Mono thread pool be extended to hundreds and thousands?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:39]  Enus Linden: vision: test automation harness (we&#039;re going to use TeamCity, will get url in a sec) to spawn a bajillion test agent hosts on ECS, distributed in various hosting facilities in Europe, Aisie, NA, etc&amp;lt;br&amp;gt;&lt;br /&gt;
[13:40]  Morgaine Dinova: s/can&#039;t/can/&amp;lt;br&amp;gt;&lt;br /&gt;
[13:40]  Enus Linden: those agents can be driven via a web hook to run specific tests using specific accounts against a staging env that very closely matches agni&amp;lt;br&amp;gt;&lt;br /&gt;
[13:40]  Dedric Mauriac: http://www.jetbrains.com/teamcity/&amp;lt;br&amp;gt;&lt;br /&gt;
[13:40]  Enus Linden: this staging env is also in the works, but is a separate team&#039;s deliverable&amp;lt;br&amp;gt;&lt;br /&gt;
[13:41]  Enus Linden: the agents shoudl act very very similar to real agents in world&amp;lt;br&amp;gt;&lt;br /&gt;
[13:41]  Dedric Mauriac: real scripted agents&amp;lt;br&amp;gt;&lt;br /&gt;
[13:41]  Enus Linden: and we should see cimilar metrics of various kinds to what we see in production&amp;lt;br&amp;gt;&lt;br /&gt;
[13:41]  Enus Linden: similar*&amp;lt;br&amp;gt;&lt;br /&gt;
[13:41]  Enus Linden: ty for the link dedric&amp;lt;br&amp;gt;&lt;br /&gt;
[13:42]  Enus Linden: once we are happy that we ahve a useful test config, we ramp it up&amp;lt;br&amp;gt;&lt;br /&gt;
[13:42]  Dedric Mauriac: i&#039;ve used ccnet in the past, but have had someone else recommend team city to me as well.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:42]  Latif Khalifa: we also use teamcity for automated testing in libomv (on a much lower scale of course) :)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:42]  Enus Linden: and watch things fall over&amp;lt;br&amp;gt;&lt;br /&gt;
[13:42]  Enus Linden: fix&amp;lt;br&amp;gt;&lt;br /&gt;
[13:42]  Enus Linden: repeat&amp;lt;br&amp;gt;&lt;br /&gt;
[13:43]  Enus Linden: it&#039;s not just this sort of testing we&#039;re targetting tho&amp;lt;br&amp;gt;&lt;br /&gt;
[13:43]  Enus Linden: it&#039;s far simpler to enable testing susystems&amp;lt;br&amp;gt;&lt;br /&gt;
[13:43]  Enus Linden: sub*&amp;lt;br&amp;gt;&lt;br /&gt;
[13:43]  Enus Linden: web services, util.agni services, web apps, etc&amp;lt;br&amp;gt;&lt;br /&gt;
[13:44]  Enus Linden: they will come first. it&#039;s kind of nice, seeing the roadmap and it&#039;s building blocks&amp;lt;br&amp;gt;&lt;br /&gt;
[13:44]  Dedric Mauriac: most awesome app - http://www.avatarsunited.com/apps/helloworld&amp;lt;br&amp;gt;&lt;br /&gt;
[13:44]  Latif Khalifa: i could imagine. it woudl still be helpful to have a way to test things on production level loads. things have a nasty habit of breaeking at high load that work well under subsystem test&amp;lt;br&amp;gt;&lt;br /&gt;
[13:45]  Enus Linden: latif: absolutely&amp;lt;br&amp;gt;&lt;br /&gt;
[13:45]  Enus Linden: case in point: I laod testing avatars unites&amp;lt;br&amp;gt;&lt;br /&gt;
[13:45]  Enus Linden: we all know how well that worked out&amp;lt;br&amp;gt;&lt;br /&gt;
[13:45]  Latif Khalifa: hehehe&amp;lt;br&amp;gt;&lt;br /&gt;
[13:45]  Enus Linden: due to timing, could only test from a handful of angles&amp;lt;br&amp;gt;&lt;br /&gt;
[13:45]  Enus Linden: we *did* see the breaking point&amp;lt;br&amp;gt;&lt;br /&gt;
[13:45]  Enus Linden: called it out&amp;lt;br&amp;gt;&lt;br /&gt;
[13:45]  Latif Khalifa: is it RoR?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:46]  Enus Linden: and simply didnt expect the uptake to be what it was&amp;lt;br&amp;gt;&lt;br /&gt;
[13:46]  Dedric Mauriac: I log in and see about 100 bithdays every day on the home page now&amp;lt;br&amp;gt;&lt;br /&gt;
[13:47]  Enus Linden: being able to test comprehensively is what this year will be all about&amp;lt;br&amp;gt;&lt;br /&gt;
[13:47]  Dedric Mauriac: Enus, i&#039;m proud that you are moving in that direction.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:47]  Morgaine Dinova: Dedric: AU&#039;s webite work pretty poorly. Your URL is another that fails -- I just get the general app/ directory&amp;lt;br&amp;gt;&lt;br /&gt;
[13:47]  Sea Urchin beanbag: Going to next texture.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:47]  Enus Linden: unit, functional, subsystem, end to end, at scale, for every product and app we handle&amp;lt;br&amp;gt;&lt;br /&gt;
[13:47]  Dedric Mauriac: ah, i didn&#039;t publish the app yet. maybe that is why&amp;lt;br&amp;gt;&lt;br /&gt;
[13:47]  Enus Linden: such a cynic morgaine ;)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:47]  Dedric Mauriac: it&#039;s just me testing a very simple &amp;quot;hello world&amp;quot; app&amp;lt;br&amp;gt;&lt;br /&gt;
[13:47]  Morgaine Dinova: Me? Never!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:47]  Enus Linden: well, 70 should have been 60&amp;lt;br&amp;gt;&lt;br /&gt;
[13:48]  Enus Linden: oops, ww&amp;lt;br&amp;gt;&lt;br /&gt;
[13:48]  Al Sonic: Hello, United Avatars!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:48]  Dedric Mauriac: ah yea, i should upgrade it to say that instead. heh.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:48]  Enus Linden: i wonder if this OH should shift to a more general QA and Automation orientation&amp;lt;br&amp;gt;&lt;br /&gt;
[13:49]  Dedric Mauriac: :)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:49]  Enus Linden: getting back to morgaine&#039;s question about it&#039;s usefulness&amp;lt;br&amp;gt;&lt;br /&gt;
[13:49]  Enus Linden: it was a vehicle for pyogp convos and ogp convos for a wihle&amp;lt;br&amp;gt;&lt;br /&gt;
[13:49]  Enus Linden: while&amp;lt;br&amp;gt;&lt;br /&gt;
[13:49]  Enus Linden: perhaps it&#039;s time to re-orient things&amp;lt;br&amp;gt;&lt;br /&gt;
[13:49]  Dedric Mauriac: Has anything became apparent using automated testing that you would have never found on your own?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:50]  Enus Linden: some bottlenecks in load testing i&#039;ve done is surprising&amp;lt;br&amp;gt;&lt;br /&gt;
[13:50]  Enus Linden: the way sims work (or dont) is often surprising&amp;lt;br&amp;gt;&lt;br /&gt;
[13:50]  Enus Linden: libomv knows all about that&amp;lt;br&amp;gt;&lt;br /&gt;
[13:50]  Enus Linden: ;)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:50]  Dedric Mauriac: the nameless delagger is Enus&amp;lt;br&amp;gt;&lt;br /&gt;
[13:50]  Latif Khalifa: ;)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:51]  Morgaine Dinova: Resi&#039;s are beyond surprise. ;-) [Working on that cynicism here :P]&amp;lt;br&amp;gt;&lt;br /&gt;
[13:51]  Dedric Mauriac: or is it, delagulator&amp;lt;br&amp;gt;&lt;br /&gt;
[13:51]  Latif Khalifa: i actually often wonder what makes sim choke with over 50-60 agents. is it cpu, io saturation, etc&amp;lt;br&amp;gt;&lt;br /&gt;
[13:51]  Enus Linden: right now, the focus w/in automation will be building regression test suites, and automation coverage on new projects&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Enus Linden: latif: io and then cpu (script time often)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Dedric Mauriac: with automated testing, i&#039;m sure you can make charts to help identify what happens&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Fisher Linden: hmm....charts ....&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Enus Linden: dedric: we&#039;ll have thousands of pretty charts&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Enus Linden: literally&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Latif Khalifa: Enus, script time should be throttled&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Enus Linden: maybe tens of them&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Enus Linden: latif, should be, is, still sucks&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Enus Linden: WIP&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Dedric Mauriac: you sould let us see some - even if they are really old. us geeks need eye candy.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Latif Khalifa: i mean mono gets it&#039;s time slice and that&#039;s it&amp;lt;br&amp;gt;&lt;br /&gt;
[13:53]  Enus Linden: dedric, in progress.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:53]  Enus Linden: I plan to publish publicly&amp;lt;br&amp;gt;&lt;br /&gt;
[13:53]  Enus Linden: at least some things&amp;lt;br&amp;gt;&lt;br /&gt;
[13:53]  Latif Khalifa: but i could imagine doing high bandwidth network with 60+ clients can be resource intensive on the sim&amp;lt;br&amp;gt;&lt;br /&gt;
[13:53]  Dedric Mauriac: The article about the MySQL upgrade was the most intriging thing I saw this year on the blogs.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:53]  Enus Linden: in fact, will start to talk to the auto team abuot building OS style collab on test case authoring and input&amp;lt;br&amp;gt;&lt;br /&gt;
[13:54]  Enus Linden: derric: that was rad. loved it&amp;lt;br&amp;gt;&lt;br /&gt;
[13:54]  Enus Linden: it was clearly well received&amp;lt;br&amp;gt;&lt;br /&gt;
[13:54]  Morgaine Dinova: Did you see this Enus? Was very interesting reading -- http://arstechnica.com/business/data-centers/2010/02/what-second-life-can-teach-all-companies-about-scaling-web-apps.ars&amp;lt;br&amp;gt;&lt;br /&gt;
[13:54]  Enus Linden: i glanced at page 2 morgaine XD&amp;lt;br&amp;gt;&lt;br /&gt;
[13:54]  Enus Linden: it&#039;s open and pending a read&amp;lt;br&amp;gt;&lt;br /&gt;
[13:54]  Morgaine Dinova: Hehe&amp;lt;br&amp;gt;&lt;br /&gt;
[13:55]  Enus Linden: (first link i got to it was to page 2)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:55]  Youri Ashton: thanks for the meeting enus!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:55]  Youri Ashton: bye bye all&amp;lt;br&amp;gt;&lt;br /&gt;
[13:55]  Enus Linden: my pleasure!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:55]  Enus Linden: ciao youri&amp;lt;br&amp;gt;&lt;br /&gt;
[13:55]  Enus Linden: see ya laters&amp;lt;br&amp;gt;&lt;br /&gt;
[13:55]  Morgaine Dinova: Cyu Youri :-)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:55]  Latif Khalifa: it was interesting to read how people scale up things&amp;lt;br&amp;gt;&lt;br /&gt;
[13:56]  Latif Khalifa: like handling enourmous read loads&amp;lt;br&amp;gt;&lt;br /&gt;
[13:56]  Enus Linden: scaling is a focal point here atm. last year we spent a lot of time re-architecting things, with good impact&amp;lt;br&amp;gt;&lt;br /&gt;
[13:56]  Latif Khalifa: a lot of it seems to be, use db&#039;s as key value store&amp;lt;br&amp;gt;&lt;br /&gt;
[13:56]  Latif Khalifa: and memcache the hell out of it&amp;lt;br&amp;gt;&lt;br /&gt;
[13:56]  Latif Khalifa: joins will kill you&amp;lt;br&amp;gt;&lt;br /&gt;
[13:56]  Enus Linden: amen latif, is a good model in many cases&amp;lt;br&amp;gt;&lt;br /&gt;
[13:57]  Enus Linden: (AU would benefit there)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:57]  Morgaine Dinova: Hmmmm ... not &amp;quot;with good impact&amp;quot; from the resi&#039;s PoV, Enus. And that&#039;s not cynicism I&#039;m afraid.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:57]  Latif Khalifa: read a but about facebook infrastructure&amp;lt;br&amp;gt;&lt;br /&gt;
[13:57]  Enus Linden: Morgaine: think back to last january&amp;lt;br&amp;gt;&lt;br /&gt;
[13:57]  Enus Linden: and the months leading up&amp;lt;br&amp;gt;&lt;br /&gt;
[13:57]  Latif Khalifa: they handle 150k pageviews a sec&amp;lt;br&amp;gt;&lt;br /&gt;
[13:57]  Latif Khalifa: and they have 35TB memcached cluster&amp;lt;br&amp;gt;&lt;br /&gt;
[13:57]  Morgaine Dinova: Yeah, Facebook is great with articles and presentations on their internals.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:57]  Latif Khalifa: which they have hacked to use UDP&amp;lt;br&amp;gt;&lt;br /&gt;
[13:57]  Enus Linden: we fell over at 3pm PSt 3 out of every 7 days&amp;lt;br&amp;gt;&lt;br /&gt;
[13:58]  Latif Khalifa: since it&#039;s all iternal net, and ultra low latency&amp;lt;br&amp;gt;&lt;br /&gt;
[13:58]  Latif Khalifa: they claim to get &amp;lt;1ms latency from memcached over udp on local net&amp;lt;br&amp;gt;&lt;br /&gt;
[13:58]  Latif Khalifa: which is pretty awesome&amp;lt;br&amp;gt;&lt;br /&gt;
[13:58]  Morgaine Dinova: Latif: notice that though they went back to UDP, they had to create their own reliability layer on top of it, and they said that was utter murder.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Enus Linden: eep, almost 2. i gotta run.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Enus Linden: THANKS everyone&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Morgaine Dinova: KK, Cyu Enus, take care :-)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Rakesh Linden: ty Enus&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Fisher Linden: Thanks, Enus. :-)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Dedric Mauriac: Thanks enus.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Enus Linden: note: next week I will miss this time slot&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Latif Khalifa: take care enus&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Enus Linden: i hope to have a stand in&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Enus Linden: this was a nice caht&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Fisher Linden: Spider!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Enus Linden: maybe i&#039;ll get the auto team to front someone to talk more&amp;lt;br&amp;gt;&lt;br /&gt;
[14:00]  Morgaine Dinova: woot!&amp;lt;br&amp;gt;&lt;br /&gt;
[14:00]  Enus Linden: exactly fisher&amp;lt;br&amp;gt;&lt;br /&gt;
[14:00]  Dedric Mauriac: have an ajenda next time&amp;lt;br&amp;gt;&lt;br /&gt;
[14:00]  Enus Linden: this went well w/o&amp;lt;br&amp;gt;&lt;br /&gt;
[14:00]  Enus Linden: ;)&amp;lt;br&amp;gt;&lt;br /&gt;
[14:00]  Enus Linden: will try&amp;lt;br&amp;gt;&lt;br /&gt;
[14:00]  Enus Linden: ciao!&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Enus_Linden/Office_Hours/2010_February_05&amp;diff=722593</id>
		<title>User:Enus Linden/Office Hours/2010 February 05</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Enus_Linden/Office_Hours/2010_February_05&amp;diff=722593"/>
		<updated>2010-02-05T23:47:18Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: Created page with &amp;#039;[13:02]  Latif Khalifa: perhaps enus will grace us with his presence this year&amp;lt;br&amp;gt; [13:02]  Latif Khalifa: :P&amp;lt;br&amp;gt; [13:02]  Dedric Mauriac: if anyone would like a free bear, let m...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[13:02]  Latif Khalifa: perhaps enus will grace us with his presence this year&amp;lt;br&amp;gt;&lt;br /&gt;
[13:02]  Latif Khalifa: :P&amp;lt;br&amp;gt;&lt;br /&gt;
[13:02]  Dedric Mauriac: if anyone would like a free bear, let me know and i&#039;ll send you mine.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:02]  Ardy Lay: Nice lag-walk there Enus.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:02]  Enus Linden: it&#039;s punishment latif&amp;lt;br&amp;gt;&lt;br /&gt;
[13:03]  Latif Khalifa: speaking of the...&amp;lt;br&amp;gt;&lt;br /&gt;
[13:03]  Latif Khalifa: lol&amp;lt;br&amp;gt;&lt;br /&gt;
[13:03]  Enus Linden: tz ardy, i&#039;ve been working on perfecting it!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:03]  Enus Linden: tx*&amp;lt;br&amp;gt;&lt;br /&gt;
[13:03]  Latif Khalifa: judging by how often you come, you sure must feel like it&#039;s punishment :P&amp;lt;br&amp;gt;&lt;br /&gt;
[13:04]  Enus Linden: tbh, i&#039;ve been wrestling with the idea of 1. stopping my OH or 2. sharing the mc responsibilities&amp;lt;br&amp;gt;&lt;br /&gt;
[13:04]  Enus Linden: its not getting any easier to make time, and that sucks&amp;lt;br&amp;gt;&lt;br /&gt;
[13:04]  Enus Linden: i dont want to stop em&amp;lt;br&amp;gt;&lt;br /&gt;
[13:04]  Enus Linden: but do want them to be mutually useful&amp;lt;br&amp;gt;&lt;br /&gt;
[13:05]  Enus Linden: nice to see that folks havent given up yet!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:05]  Latif Khalifa: i was advertising the OH xD&amp;lt;br&amp;gt;&lt;br /&gt;
[13:05]  Arcane Laval: :)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:05]  Dedric Mauriac: we are all just bots&amp;lt;br&amp;gt;&lt;br /&gt;
[13:05]  Latif Khalifa: long time no see :)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:06]  Enus Linden: have you an agenda in advertising today latif?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:06]  Latif Khalifa: erm, no&amp;lt;br&amp;gt;&lt;br /&gt;
[13:06]  Enus Linden: crap, so i need to have one&amp;lt;br&amp;gt;&lt;br /&gt;
[13:06]  Enus Linden: ;)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:06]  Latif Khalifa: i could&#039;ve made one had i known it was required&amp;lt;br&amp;gt;&lt;br /&gt;
[13:06]  Enus Linden: i&#039;ve a couple of things on the mind...&amp;lt;br&amp;gt;&lt;br /&gt;
[13:06]  Ardy Lay: Ah.. well, if you are not getting anything out of them then I don&#039;t see there is much point. I know I don&#039;t have much to offer you. I was just hoping to learn a little more about what&#039;s going on in SL.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:07]  Enus Linden: one is pyogp, which should start moving again soon&amp;lt;br&amp;gt;&lt;br /&gt;
[13:07]  Enus Linden: another is in regards to the automation team&amp;lt;br&amp;gt;&lt;br /&gt;
[13:07]  Enus Linden: and we&#039;ll see where things go from there&amp;lt;br&amp;gt;&lt;br /&gt;
[13:07]  Latif Khalifa: perhaps some would be interested to hear about automated load testing using Amazon EC2 cloud&amp;lt;br&amp;gt;&lt;br /&gt;
[13:07]  Enus Linden: aye latif&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Latif Khalifa: i know i would xD&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Enus Linden: i&#039;ll cover that&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Morgaine Dinova: Me too&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Dedric Mauriac: interesting&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Enus Linden: awesome&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Enus Linden: well, thanks all for coming&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Enus Linden: hi rakesh!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Dedric Mauriac: will there be a white paper about it?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Rakesh Linden: hi Enus&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Enus Linden: dedric, maybe?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Rakesh Linden: there is no voice&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Latif Khalifa: hello Rakesh&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Enus Linden: OH is in text&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Enus Linden: to many languages&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Enus Linden: to listen clearly&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Rakesh Linden: i c.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:08]  Youri Ashton: friendly hello&#039;s!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:09]  Rakesh Linden: hi everyone&amp;lt;br&amp;gt;&lt;br /&gt;
[13:09]  Enus Linden: plus text requires minimal moderation&amp;lt;br&amp;gt;&lt;br /&gt;
[13:09]  Enus Linden: hey youri&amp;lt;br&amp;gt;&lt;br /&gt;
[13:09]  Morgaine Dinova: Enus, what would you like to see on your part, that would make these meetings more useful to you, beyond just &amp;quot;community contact&amp;quot;?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:09]  Enus Linden: so pyogp lib work update really quicly&amp;lt;br&amp;gt;&lt;br /&gt;
[13:09]  Enus Linden: good ? morgaine&amp;lt;br&amp;gt;&lt;br /&gt;
[13:09]  Enus Linden: i&#039;ll take a note to discuss it&amp;lt;br&amp;gt;&lt;br /&gt;
[13:09]  Arcane Laval: I&#039;ll be right back!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:10]  Enus Linden: alright: pyogp&amp;lt;br&amp;gt;&lt;br /&gt;
[13:10]  Enus Linden: i have done nil with this for a couple of months&amp;lt;br&amp;gt;&lt;br /&gt;
[13:10]  Enus Linden: i ported to hg&amp;lt;br&amp;gt;&lt;br /&gt;
[13:10]  Enus Linden: did some dev, moved indra.base to llbase after pushing that to pypi&amp;lt;br&amp;gt;&lt;br /&gt;
[13:10]  Enus Linden: and it stalled&amp;lt;br&amp;gt;&lt;br /&gt;
[13:11]  Enus Linden: I&#039;m too busy to continue regularly, but...&amp;lt;br&amp;gt;&lt;br /&gt;
[13:11]  Enus Linden: i&#039;ll be handing off maintenance and further extension of the libs to some folks in QA here&amp;lt;br&amp;gt;&lt;br /&gt;
[13:11]  Enus Linden: OS folks are of course encouraged to collab as well&amp;lt;br&amp;gt;&lt;br /&gt;
[13:12]  Enus Linden: but that&#039;s been quiet for some time and i assume not much there&amp;lt;br&amp;gt;&lt;br /&gt;
[13:12]  Morgaine Dinova: Since it&#039;s the basis of your test platform (isn&#039;t it?), do you mean it&#039;s stalled because your current test stuff works and you have no incentive to touch it?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:12]  Enus Linden: i&#039;d love to see an ecosystem pop up around it again&amp;lt;br&amp;gt;&lt;br /&gt;
[13:12]  Eddi Decosta: hey Enus ㋡&amp;lt;br&amp;gt;&lt;br /&gt;
[13:12]  Enus Linden: should prolly start engageing in irc and the mailing list more agin&amp;lt;br&amp;gt;&lt;br /&gt;
[13:12]  Enus Linden: again&amp;lt;br&amp;gt;&lt;br /&gt;
[13:12]  Enus Linden: morgaine: it&#039;s still ramping up as the basis&amp;lt;br&amp;gt;&lt;br /&gt;
[13:13]  Enus Linden: Rakesh (and Ali, Vektor, Fisher, and others as time allows) will be driving it&#039;s evolution primarily now&amp;lt;br&amp;gt;&lt;br /&gt;
[13:13]  Youri Ashton: hey fisher!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:13]  Eddi Decosta: heya Fisher! ㋡&amp;lt;br&amp;gt;&lt;br /&gt;
[13:13]  Enus Linden: there is MUCh incentive to touch it: it&#039;s incomplete, amd not much testing is in place using it now&amp;lt;br&amp;gt;&lt;br /&gt;
[13:14]  Fisher Linden: Hey&amp;lt;br&amp;gt;&lt;br /&gt;
[13:14]  Enus Linden: that&#039;s going to cahnge this quarter&amp;lt;br&amp;gt;&lt;br /&gt;
[13:14]  Morgaine Dinova: Well I still hope to poke VWRAP bits into PyOGP, once we know what the hell to poke in. ;-) I&#039;m not in the slightest bit happy with Pixel&#039;s addition of OGP code into Snowglobe --- that&#039;s no way to test out protocol ideas, by hardwiring them into C++ code within a nightmare codebase.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:14]  Eddi Decosta: welcome to sl Rakesh lol ㋡&amp;lt;br&amp;gt;&lt;br /&gt;
[13:14]  Enus Linden: VWRAP is highly encouraged to leverage PyOGP&amp;lt;br&amp;gt;&lt;br /&gt;
[13:14]  Morgaine Dinova: :-)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:14]  Enus Linden: maybe a pyogp-vwrap fork is in order&amp;lt;br&amp;gt;&lt;br /&gt;
[13:15]  Enus Linden: in fact, we should make it so&amp;lt;br&amp;gt;&lt;br /&gt;
[13:15]  Rakesh Linden: thx Eddi&amp;lt;br&amp;gt;&lt;br /&gt;
[13:15]  Morgaine Dinova: Could happen. Although with Hg, a &amp;quot;fork&amp;quot; isn&#039;t necessary, just another repository, or several.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:15]  Ardy Lay: Ugh. Some uninitiated noob is closing my JIRA issues as &amp;quot;expected bahaviour&amp;quot;. I gotta go beat on them. Bye.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:15]  Enus Linden: i&#039;d suggest a fork of the lib packages&amp;lt;br&amp;gt;&lt;br /&gt;
[13:15]  Rakesh Linden: is VWRAP a standard yet?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:15]  Enus Linden: slightly more formal&amp;lt;br&amp;gt;&lt;br /&gt;
[13:15]  Morgaine Dinova: Lord no&amp;lt;br&amp;gt;&lt;br /&gt;
[13:16]  Latif Khalifa: there is nothing to fork over for yet&amp;lt;br&amp;gt;&lt;br /&gt;
[13:16]  Enus Linden: it&#039;s a theory&amp;lt;br&amp;gt;&lt;br /&gt;
[13:16]  Rakesh Linden: I thought it is still a proposal&amp;lt;br&amp;gt;&lt;br /&gt;
[13:16]  Latif Khalifa: no implementation exists yet&amp;lt;br&amp;gt;&lt;br /&gt;
[13:16]  Latif Khalifa: so talking about vwrap fork is premature imhp&amp;lt;br&amp;gt;&lt;br /&gt;
[13:16]  Latif Khalifa: o even&amp;lt;br&amp;gt;&lt;br /&gt;
[13:16]  Enus Linden: yep&amp;lt;br&amp;gt;&lt;br /&gt;
[13:16]  Morgaine Dinova: VWRAP is currently at the 5% reached initial draft stage, if that. And not even that 5% is well examined yet, let alone agreed. Early days.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:17]  Enus Linden: i&#039;ll support pyogp as a test bed when timing dictates it&amp;lt;br&amp;gt;&lt;br /&gt;
[13:17]  Rakesh Linden: i agree with Latif&amp;lt;br&amp;gt;&lt;br /&gt;
[13:17]  Enus Linden: so sometime next week i&#039;ll set up a roadmap and walkthrough for qa to grab pyogp and make it go as a server side test source&amp;lt;br&amp;gt;&lt;br /&gt;
[13:18]  Enus Linden: they&#039;ve been tinkering, but we&#039;re all busy&amp;lt;br&amp;gt;&lt;br /&gt;
[13:18]  Morgaine Dinova: That&#039;s cool&amp;lt;br&amp;gt;&lt;br /&gt;
[13:18]  Sea Urchin beanbag: Going to next texture.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:18]  Sea Urchin beanbag: Going to next texture.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:18]  Sea Urchin beanbag: Going to next texture.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:18]  Enus Linden: their work will complement the work of the automation team as it spins up&amp;lt;br&amp;gt;&lt;br /&gt;
[13:19]  Enus Linden: the automation team is Spider, Ray, Xandix, and the not yet started but hired Scobu&amp;lt;br&amp;gt;&lt;br /&gt;
[13:19]  Enus Linden: Cassandra = PM&amp;lt;br&amp;gt;&lt;br /&gt;
[13:19]  Enus Linden: i&#039;m in the mix in some ways, mostly high level&amp;lt;br&amp;gt;&lt;br /&gt;
[13:19]  Morgaine Dinova: Project Manager&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[13:19]  Morgaine Dinova: ?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:19]  Enus Linden: yep Morgaine&amp;lt;br&amp;gt;&lt;br /&gt;
[13:19]  Morgaine Dinova: kk&amp;lt;br&amp;gt;&lt;br /&gt;
[13:19]  Enus Linden: Spider = Lead&amp;lt;br&amp;gt;&lt;br /&gt;
[13:19]  Latif Khalifa: is automatio team all about services, sims, and the backend?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:20]  Enus Linden: not onlt latif&amp;lt;br&amp;gt;&lt;br /&gt;
[13:20]  Enus Linden: will cover Viewer and Web as well&amp;lt;br&amp;gt;&lt;br /&gt;
[13:20]  Latif Khalifa: interesting&amp;lt;br&amp;gt;&lt;br /&gt;
[13:20]  Morgaine Dinova: Viewer? In what respect?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:20]  Dedric Mauriac: click button, verify something happens&amp;lt;br&amp;gt;&lt;br /&gt;
[13:20]  Enus Linden: cannot share details w/o consent at this time&amp;lt;br&amp;gt;&lt;br /&gt;
[13:21]  Enus Linden: GUI automation would be great, but isnt part of the picture right now&amp;lt;br&amp;gt;&lt;br /&gt;
[13:21]  Enus Linden: pixel based testing isn&#039;t our idea of fun yet&amp;lt;br&amp;gt;&lt;br /&gt;
[13:21]  Morgaine Dinova: But that&#039;s GUI QA.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:21]  Dedric Mauriac: unit testing&amp;lt;br&amp;gt;&lt;br /&gt;
[13:21]  Morgaine Dinova: Hmm. Can you explain the diff btn automation and QA teams?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:21]  Enus Linden: functional automation against the viewer is being worked on now though&amp;lt;br&amp;gt;&lt;br /&gt;
[13:21]  Enus Linden: yeah morgaine&amp;lt;br&amp;gt;&lt;br /&gt;
[13:22]  Enus Linden: Automation team&#039;s charter is to build frameworks and environments to support testing&amp;lt;br&amp;gt;&lt;br /&gt;
[13:22]  Dedric Mauriac: qa is people with eyes verifying manually&amp;lt;br&amp;gt;&lt;br /&gt;
[13:22]  Morgaine Dinova: Jeez no Dedric, or I hope not&amp;lt;br&amp;gt;&lt;br /&gt;
[13:22]  Enus Linden: their work will initially be setting up a harness that handles code and enironments to test in, running existing unit tests and functional tests, and enabling more to be run via enrionemnts and such&amp;lt;br&amp;gt;&lt;br /&gt;
[13:22]  Dedric Mauriac: automation supports qa&amp;lt;br&amp;gt;&lt;br /&gt;
[13:23]  Enus Linden: QA = test engineers&amp;lt;br&amp;gt;&lt;br /&gt;
[13:23]  Enus Linden: test planning, risk assessmnet, test execution,&amp;lt;br&amp;gt;&lt;br /&gt;
[13:23]  Enus Linden: QA and Dev write autoamted test cases&amp;lt;br&amp;gt;&lt;br /&gt;
[13:23]  Enus Linden: automation team makes sure they are run and reported on&amp;lt;br&amp;gt;&lt;br /&gt;
[13:24]  Enus Linden: once there is sufficient framework coverage, the automation team can certainly help with test writing&amp;lt;br&amp;gt;&lt;br /&gt;
[13:24]  Enus Linden: but that is not their responsibility atm&amp;lt;br&amp;gt;&lt;br /&gt;
[13:24]  Morgaine Dinova: You mean QA team &amp;quot;makes sure they are run and reported on&amp;quot;, right?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:25]  Widget Whiteberry slips away&amp;lt;br&amp;gt;&lt;br /&gt;
[13:25]  Enus Linden: in a way morgaine, it&#039;s the auto team facilitating the running and reporting. QA uses the data as part of test plan validation&amp;lt;br&amp;gt;&lt;br /&gt;
[13:25]  Morgaine Dinova chuckles&amp;lt;br&amp;gt;&lt;br /&gt;
[13:26]  Enus Linden: so the 30000 foot view of the automatin team roadmap as we know it:&amp;lt;br&amp;gt;&lt;br /&gt;
[13:26]  Enus Linden: provide a test harness&amp;lt;br&amp;gt;&lt;br /&gt;
[13:26]  Morgaine Dinova: I&#039;m confused, but don&#039;t worry about it. The way I make sense of it is Autom == make test infrastructure, QA == use it. But I guess that&#039;s wrong.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:26]  Dedric Mauriac: that&#039;s a lot of feet&amp;lt;br&amp;gt;&lt;br /&gt;
[13:26]  Enus Linden: hook existing automated tests in (ours, third party libs, w/e)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:26]  Enus Linden: morgaine, that&#039;s right&amp;lt;br&amp;gt;&lt;br /&gt;
[13:27]  Morgaine Dinova: Uh, OK ^_^&amp;lt;br&amp;gt;&lt;br /&gt;
[13:27]  Enus Linden: 3000 ft cont: extend the harness with test beds in the form of dedicated hardware and EC2 virtual environments&amp;lt;br&amp;gt;&lt;br /&gt;
[13:27]  Enus Linden: missed a 0 there ;)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:27]  Morgaine Dinova: UDP loss&amp;lt;br&amp;gt;&lt;br /&gt;
[13:28]  Enus Linden: work on facilitating load tests in real and virtual envs&amp;lt;br&amp;gt;&lt;br /&gt;
[13:28]  Enus Linden: report on all of it&amp;lt;br&amp;gt;&lt;br /&gt;
[13:28]  Enus Linden: build libs to support test case state setting and execution&amp;lt;br&amp;gt;&lt;br /&gt;
[13:28]  Enus Linden: etc etc etc&amp;lt;br&amp;gt;&lt;br /&gt;
[13:28]  Enus Linden: we&#039;ve sketched out plans for the year, given info we know, as of this week&amp;lt;br&amp;gt;&lt;br /&gt;
[13:28]  Enus Linden: we start real work monday&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Enus Linden: wheeeee&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Sea Urchin beanbag: Going to next texture.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Morgaine Dinova: Wheee indeed :-)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Latif Khalifa: sounds some awesome QA juice on the way :D&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Fisher Linden: Wheeee indeed&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Sea Urchin beanbag: Going to next texture.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Morgaine Dinova: About time. You can&#039;t afford to do the grunt work manually, really can&#039;t.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Sea Urchin beanbag: Going to next texture.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Sea Urchin beanbag: Going to next texture.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Sea Urchin beanbag: Going to next texture.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:29]  Enus Linden: agreed morgaine&amp;lt;br&amp;gt;&lt;br /&gt;
[13:30]  Dedric Mauriac: oh, i think they can afford it, but wouldn&#039;t make sense though&amp;lt;br&amp;gt;&lt;br /&gt;
[13:30]  Enus Linden: QA folks are going to start getting more direction toward automation in many ways&amp;lt;br&amp;gt;&lt;br /&gt;
[13:30]  Enus Linden: for some, it&#039;s a natrual inclination&amp;lt;br&amp;gt;&lt;br /&gt;
[13:30]  Enus Linden: but as a team, we&#039;ve got to start heading that way more and more&amp;lt;br&amp;gt;&lt;br /&gt;
[13:31]  Morgaine Dinova: Will be brill to be able to say &amp;quot;1.23.9 is ready for RC1 release, passes all regression tests for 1.23.8&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:31]  Dedric Mauriac: with the use of automation, problems can be found quicker, as they happen in development, or newly discovered&amp;lt;br&amp;gt;&lt;br /&gt;
[13:31]  Enus Linden: test plans need to assert things like &amp;quot;100% unit tests coverage and 80% functinal test coverage&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
[13:31]  Enus Linden: we need to start budgeting time, and building up skill sets to enable it&amp;lt;br&amp;gt;&lt;br /&gt;
[13:31]  Latif Khalifa: hopefully with amazon and there diverse locations you could add some higher latency tests like connecting from europe etc. some network timing issues are known to slip by if you test from the same country :)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:31]  Enus Linden: so will improve over the upcoming months&amp;lt;br&amp;gt;&lt;br /&gt;
[13:31]  Fisher Linden: Entrance and exit criteria, Enus&amp;lt;br&amp;gt;&lt;br /&gt;
[13:32]  Dedric Mauriac: are you using things like nunit/nmock/nhibernate/log4net and such?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:32]  Morgaine Dinova: Oooh, coverage analysis, need. Even if the coverage assignment is largely handwaved, it&#039;s still helpful.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:32]  Morgaine Dinova: neat*&amp;lt;br&amp;gt;&lt;br /&gt;
[13:32]  Enus Linden: Fisher will do a lot of the grunt work :P&amp;lt;br&amp;gt;&lt;br /&gt;
[13:32]  Fisher Linden: lol...yummy!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:32]  Fisher Linden: We love coverage analysis too&amp;lt;br&amp;gt;&lt;br /&gt;
[13:32]  Enus Linden: latif: latency tests YES&amp;lt;br&amp;gt;&lt;br /&gt;
[13:32]  Morgaine Dinova gives Fisher a cookie&amp;lt;br&amp;gt;&lt;br /&gt;
[13:32]  Fisher Linden: nomnomnom&amp;lt;br&amp;gt;&lt;br /&gt;
[13:33]  Morgaine Dinova: lol&amp;lt;br&amp;gt;&lt;br /&gt;
[13:33]  Enus Linden: so perf/load/benchmark testing....&amp;lt;br&amp;gt;&lt;br /&gt;
[13:33]  Enus Linden: all part of the same equation&amp;lt;br&amp;gt;&lt;br /&gt;
[13:33]  Enus Linden: we&#039;ve talked about my intent to use pyogp on ec2 against a test env before&amp;lt;br&amp;gt;&lt;br /&gt;
[13:33]  Dedric Mauriac: don&#039;t the methods in theLSL language already have automated testing in them wiht each build?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:33]  Enus Linden: that&#039;s on the automation team&#039;s roadmap to facilitate&amp;lt;br&amp;gt;&lt;br /&gt;
[13:34]  Enus Linden: and i need to plug it into QA&#039;s&amp;lt;br&amp;gt;&lt;br /&gt;
[13:34]  Enus Linden: tbh, I need to hire someone to drive it. I can only drive it so much&amp;lt;br&amp;gt;&lt;br /&gt;
[13:34]  Enus Linden: i&#039;ve started. I have test pyogp debs for our system image&amp;lt;br&amp;gt;&lt;br /&gt;
[13:34]  Latif Khalifa: you can do some serious ddos with ec2. i mean load testing :P&amp;lt;br&amp;gt;&lt;br /&gt;
[13:34]  Morgaine Dinova: haha&amp;lt;br&amp;gt;&lt;br /&gt;
[13:34]  Enus Linden: latif: yeah&amp;lt;br&amp;gt;&lt;br /&gt;
[13:34]  Enus Linden: 1st goal: simulate peak concurrency on a grid&amp;lt;br&amp;gt;&lt;br /&gt;
[13:34]  Fisher Linden: Really looking forward to ec2 testing&amp;lt;br&amp;gt;&lt;br /&gt;
[13:35]  Rakesh Linden: ec2 will definitely play a big part in future at Linden&amp;lt;br&amp;gt;&lt;br /&gt;
[13:35]  Dedric Mauriac: I would attempt to simulate more than the peak. mabe 150% peak&amp;lt;br&amp;gt;&lt;br /&gt;
[13:35]  Enus Linden: 2nd goal: 2x peak&amp;lt;br&amp;gt;&lt;br /&gt;
[13:35]  Enus Linden: then 4x&amp;lt;br&amp;gt;&lt;br /&gt;
[13:35]  Dedric Mauriac: ah, good goals&amp;lt;br&amp;gt;&lt;br /&gt;
[13:35]  Enus Linden: and then til stuff falls apart and i break the whole grid&amp;lt;br&amp;gt;&lt;br /&gt;
[13:35]  Latif Khalifa: with libomv you could do prolly 200-300 clients per instance&amp;lt;br&amp;gt;&lt;br /&gt;
[13:35]  Enus Linden: latif: on windows yeas&amp;lt;br&amp;gt;&lt;br /&gt;
[13:35]  Latif Khalifa: don&#039;t know how much pyogp can scale&amp;lt;br&amp;gt;&lt;br /&gt;
[13:35]  Fisher Linden: We will see!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Enus Linden: pyogp can handle 80&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Enus Linden: becaus eof eventlet&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Dedric Mauriac: try simulating 1500 people in one sim. lol&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Enus Linden: eventlet grabs 75% of a cpu&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Enus Linden: and that&#039;s it&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Latif Khalifa: ah&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Enus Linden: could easily run on multiple cpus&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Rakesh Linden: so libomv doesn&#039;t work w Mono?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Latif Khalifa: Rakesh it sure does&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Enus Linden: libomv does work well under mono&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Enus Linden: but mono adds resource overhead&amp;lt;br&amp;gt;&lt;br /&gt;
[13:36]  Enus Linden: at least on our eniacs i can only run 100 clients&amp;lt;br&amp;gt;&lt;br /&gt;
[13:37]  Enus Linden: on my windows desktop i easily run 400&amp;lt;br&amp;gt;&lt;br /&gt;
[13:37]  Rakesh Linden: i c&amp;lt;br&amp;gt;&lt;br /&gt;
[13:37]  Enus Linden: 9eanic = dev box w/ system image like that of a prod host)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:37]  Latif Khalifa: Enus mono 2.6 got a lot better. some memleaks and cpu usage problems we had disappeared&amp;lt;br&amp;gt;&lt;br /&gt;
[13:37]  Enus Linden: ooohhh&amp;lt;br&amp;gt;&lt;br /&gt;
[13:37]  Enus Linden: we still only have 1.9&amp;lt;br&amp;gt;&lt;br /&gt;
[13:37]  Enus Linden: will re-investigate&amp;lt;br&amp;gt;&lt;br /&gt;
[13:37]  Latif Khalifa: if you ever want to test it, go with 2.6&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Latif Khalifa: i&#039;ve seen significant improvements&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Enus Linden: easy to add a new version to a host, but wont update the sys image package anytime soon&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Enus Linden: thanks for the tip&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Rakesh Linden: esp since we use Mono for LSL interpreter&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Dedric Mauriac: so besides havok, we now need to upgrade mono. heh.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Morgaine Dinova: That&#039;s extremely bad news if eventlet only scales that far. Stackless scales massively according to EVE, but I don&#039;t know what &amp;quot;massively&amp;quot; translates to for SL work. Hmmmm ... :-(&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Latif Khalifa: my test with 20 clients went from 60% cpu to 7%&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Enus Linden: woah&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Enus Linden: eventlet is odd in that way morgaine&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Dedric Mauriac looks for a JITA region&amp;lt;br&amp;gt;&lt;br /&gt;
[13:38]  Latif Khalifa: and memory usage was flat&amp;lt;br&amp;gt;&lt;br /&gt;
[13:39]  Enus Linden: so, back to distributed load testing&amp;lt;br&amp;gt;&lt;br /&gt;
[13:39]  Morgaine Dinova: Latif, can&#039;t the Mono thread pool be extended to hundreds and thousands?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:39]  Enus Linden: vision: test automation harness (we&#039;re going to use TeamCity, will get url in a sec) to spawn a bajillion test agent hosts on ECS, distributed in various hosting facilities in Europe, Aisie, NA, etc&amp;lt;br&amp;gt;&lt;br /&gt;
[13:40]  Morgaine Dinova: s/can&#039;t/can/&amp;lt;br&amp;gt;&lt;br /&gt;
[13:40]  Enus Linden: those agents can be driven via a web hook to run specific tests using specific accounts against a staging env that very closely matches agni&amp;lt;br&amp;gt;&lt;br /&gt;
[13:40]  Dedric Mauriac: http://www.jetbrains.com/teamcity/&amp;lt;br&amp;gt;&lt;br /&gt;
[13:40]  Enus Linden: this staging env is also in the works, but is a separate team&#039;s deliverable&amp;lt;br&amp;gt;&lt;br /&gt;
[13:41]  Enus Linden: the agents shoudl act very very similar to real agents in world&amp;lt;br&amp;gt;&lt;br /&gt;
[13:41]  Dedric Mauriac: real scripted agents&amp;lt;br&amp;gt;&lt;br /&gt;
[13:41]  Enus Linden: and we should see cimilar metrics of various kinds to what we see in production&amp;lt;br&amp;gt;&lt;br /&gt;
[13:41]  Enus Linden: similar*&amp;lt;br&amp;gt;&lt;br /&gt;
[13:41]  Enus Linden: ty for the link dedric&amp;lt;br&amp;gt;&lt;br /&gt;
[13:42]  Enus Linden: once we are happy that we ahve a useful test config, we ramp it up&amp;lt;br&amp;gt;&lt;br /&gt;
[13:42]  Dedric Mauriac: i&#039;ve used ccnet in the past, but have had someone else recommend team city to me as well.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:42]  Latif Khalifa: we also use teamcity for automated testing in libomv (on a much lower scale of course) :)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:42]  Enus Linden: and watch things fall over&amp;lt;br&amp;gt;&lt;br /&gt;
[13:42]  Enus Linden: fix&amp;lt;br&amp;gt;&lt;br /&gt;
[13:42]  Enus Linden: repeat&amp;lt;br&amp;gt;&lt;br /&gt;
[13:43]  Enus Linden: it&#039;s not just this sort of testing we&#039;re targetting tho&amp;lt;br&amp;gt;&lt;br /&gt;
[13:43]  Enus Linden: it&#039;s far simpler to enable testing susystems&amp;lt;br&amp;gt;&lt;br /&gt;
[13:43]  Enus Linden: sub*&amp;lt;br&amp;gt;&lt;br /&gt;
[13:43]  Enus Linden: web services, util.agni services, web apps, etc&amp;lt;br&amp;gt;&lt;br /&gt;
[13:44]  Enus Linden: they will come first. it&#039;s kind of nice, seeing the roadmap and it&#039;s building blocks&amp;lt;br&amp;gt;&lt;br /&gt;
[13:44]  Dedric Mauriac: most awesome app - http://www.avatarsunited.com/apps/helloworld&amp;lt;br&amp;gt;&lt;br /&gt;
[13:44]  Latif Khalifa: i could imagine. it woudl still be helpful to have a way to test things on production level loads. things have a nasty habit of breaeking at high load that work well under subsystem test&amp;lt;br&amp;gt;&lt;br /&gt;
[13:45]  Enus Linden: latif: absolutely&amp;lt;br&amp;gt;&lt;br /&gt;
[13:45]  Enus Linden: case in point: I laod testing avatars unites&amp;lt;br&amp;gt;&lt;br /&gt;
[13:45]  Enus Linden: we all know how well that worked out&amp;lt;br&amp;gt;&lt;br /&gt;
[13:45]  Latif Khalifa: hehehe&amp;lt;br&amp;gt;&lt;br /&gt;
[13:45]  Enus Linden: due to timing, could only test from a handful of angles&amp;lt;br&amp;gt;&lt;br /&gt;
[13:45]  Enus Linden: we *did* see the breaking point&amp;lt;br&amp;gt;&lt;br /&gt;
[13:45]  Enus Linden: called it out&amp;lt;br&amp;gt;&lt;br /&gt;
[13:45]  Latif Khalifa: is it RoR?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:46]  Enus Linden: and simply didnt expect the uptake to be what it was&amp;lt;br&amp;gt;&lt;br /&gt;
[13:46]  Dedric Mauriac: I log in and see about 100 bithdays every day on the home page now&amp;lt;br&amp;gt;&lt;br /&gt;
[13:47]  Enus Linden: being able to test comprehensively is what this year will be all about&amp;lt;br&amp;gt;&lt;br /&gt;
[13:47]  Dedric Mauriac: Enus, i&#039;m proud that you are moving in that direction.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:47]  Morgaine Dinova: Dedric: AU&#039;s webite work pretty poorly. Your URL is another that fails -- I just get the general app/ directory&amp;lt;br&amp;gt;&lt;br /&gt;
[13:47]  Sea Urchin beanbag: Going to next texture.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:47]  Enus Linden: unit, functional, subsystem, end to end, at scale, for every product and app we handle&amp;lt;br&amp;gt;&lt;br /&gt;
[13:47]  Dedric Mauriac: ah, i didn&#039;t publish the app yet. maybe that is why&amp;lt;br&amp;gt;&lt;br /&gt;
[13:47]  Enus Linden: such a cynic morgaine ;)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:47]  Dedric Mauriac: it&#039;s just me testing a very simple &amp;quot;hello world&amp;quot; app&amp;lt;br&amp;gt;&lt;br /&gt;
[13:47]  Morgaine Dinova: Me? Never!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:47]  Enus Linden: well, 70 should have been 60&amp;lt;br&amp;gt;&lt;br /&gt;
[13:48]  Enus Linden: oops, ww&amp;lt;br&amp;gt;&lt;br /&gt;
[13:48]  Al Sonic: Hello, United Avatars!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:48]  Dedric Mauriac: ah yea, i should upgrade it to say that instead. heh.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:48]  Enus Linden: i wonder if this OH should shift to a more general QA and Automation orientation&amp;lt;br&amp;gt;&lt;br /&gt;
[13:49]  Dedric Mauriac: :)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:49]  Enus Linden: getting back to morgaine&#039;s question about it&#039;s usefulness&amp;lt;br&amp;gt;&lt;br /&gt;
[13:49]  Enus Linden: it was a vehicle for pyogp convos and ogp convos for a wihle&amp;lt;br&amp;gt;&lt;br /&gt;
[13:49]  Enus Linden: while&amp;lt;br&amp;gt;&lt;br /&gt;
[13:49]  Enus Linden: perhaps it&#039;s time to re-orient things&amp;lt;br&amp;gt;&lt;br /&gt;
[13:49]  Dedric Mauriac: Has anything became apparent using automated testing that you would have never found on your own?&amp;lt;br&amp;gt;&lt;br /&gt;
[13:50]  Enus Linden: some bottlenecks in load testing i&#039;ve done is surprising&amp;lt;br&amp;gt;&lt;br /&gt;
[13:50]  Enus Linden: the way sims work (or dont) is often surprising&amp;lt;br&amp;gt;&lt;br /&gt;
[13:50]  Enus Linden: libomv knows all about that&amp;lt;br&amp;gt;&lt;br /&gt;
[13:50]  Enus Linden: ;)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:50]  Dedric Mauriac: the nameless delagger is Enus&amp;lt;br&amp;gt;&lt;br /&gt;
[13:50]  Latif Khalifa: ;)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:51]  Morgaine Dinova: Resi&#039;s are beyond surprise. ;-) [Working on that cynicism here :P]&amp;lt;br&amp;gt;&lt;br /&gt;
[13:51]  Dedric Mauriac: or is it, delagulator&amp;lt;br&amp;gt;&lt;br /&gt;
[13:51]  Latif Khalifa: i actually often wonder what makes sim choke with over 50-60 agents. is it cpu, io saturation, etc&amp;lt;br&amp;gt;&lt;br /&gt;
[13:51]  Enus Linden: right now, the focus w/in automation will be building regression test suites, and automation coverage on new projects&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Enus Linden: latif: io and then cpu (script time often)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Dedric Mauriac: with automated testing, i&#039;m sure you can make charts to help identify what happens&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Fisher Linden: hmm....charts ....&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Enus Linden: dedric: we&#039;ll have thousands of pretty charts&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Enus Linden: literally&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Latif Khalifa: Enus, script time should be throttled&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Enus Linden: maybe tens of them&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Enus Linden: latif, should be, is, still sucks&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Enus Linden: WIP&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Dedric Mauriac: you sould let us see some - even if they are really old. us geeks need eye candy.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:52]  Latif Khalifa: i mean mono gets it&#039;s time slice and that&#039;s it&amp;lt;br&amp;gt;&lt;br /&gt;
[13:53]  Enus Linden: dedric, in progress.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:53]  Enus Linden: I plan to publish publicly&amp;lt;br&amp;gt;&lt;br /&gt;
[13:53]  Enus Linden: at least some things&amp;lt;br&amp;gt;&lt;br /&gt;
[13:53]  Latif Khalifa: but i could imagine doing high bandwidth network with 60+ clients can be resource intensive on the sim&amp;lt;br&amp;gt;&lt;br /&gt;
[13:53]  Dedric Mauriac: The article about the MySQL upgrade was the most intriging thing I saw this year on the blogs.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:53]  Enus Linden: in fact, will start to talk to the auto team abuot building OS style collab on test case authoring and input&amp;lt;br&amp;gt;&lt;br /&gt;
[13:54]  Enus Linden: derric: that was rad. loved it&amp;lt;br&amp;gt;&lt;br /&gt;
[13:54]  Enus Linden: it was clearly well received&amp;lt;br&amp;gt;&lt;br /&gt;
[13:54]  Morgaine Dinova: Did you see this Enus? Was very interesting reading -- http://arstechnica.com/business/data-centers/2010/02/what-second-life-can-teach-all-companies-about-scaling-web-apps.ars&amp;lt;br&amp;gt;&lt;br /&gt;
[13:54]  Enus Linden: i glanced at page 2 morgaine XD&amp;lt;br&amp;gt;&lt;br /&gt;
[13:54]  Enus Linden: it&#039;s open and pending a read&amp;lt;br&amp;gt;&lt;br /&gt;
[13:54]  Morgaine Dinova: Hehe&amp;lt;br&amp;gt;&lt;br /&gt;
[13:55]  Enus Linden: (first link i got to it was to page 2)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:55]  Youri Ashton: thanks for the meeting enus!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:55]  Youri Ashton: bye bye all&amp;lt;br&amp;gt;&lt;br /&gt;
[13:55]  Enus Linden: my pleasure!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:55]  Enus Linden: ciao youri&amp;lt;br&amp;gt;&lt;br /&gt;
[13:55]  Enus Linden: see ya laters&amp;lt;br&amp;gt;&lt;br /&gt;
[13:55]  Morgaine Dinova: Cyu Youri :-)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:55]  Latif Khalifa: it was interesting to read how people scale up things&amp;lt;br&amp;gt;&lt;br /&gt;
[13:56]  Latif Khalifa: like handling enourmous read loads&amp;lt;br&amp;gt;&lt;br /&gt;
[13:56]  Enus Linden: scaling is a focal point here atm. last year we spent a lot of time re-architecting things, with good impact&amp;lt;br&amp;gt;&lt;br /&gt;
[13:56]  Latif Khalifa: a lot of it seems to be, use db&#039;s as key value store&amp;lt;br&amp;gt;&lt;br /&gt;
[13:56]  Latif Khalifa: and memcache the hell out of it&amp;lt;br&amp;gt;&lt;br /&gt;
[13:56]  Latif Khalifa: joins will kill you&amp;lt;br&amp;gt;&lt;br /&gt;
[13:56]  Enus Linden: amen latif, is a good model in many cases&amp;lt;br&amp;gt;&lt;br /&gt;
[13:57]  Enus Linden: (AU would benefit there)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:57]  Morgaine Dinova: Hmmmm ... not &amp;quot;with good impact&amp;quot; from the resi&#039;s PoV, Enus. And that&#039;s not cynicism I&#039;m afraid.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:57]  Latif Khalifa: read a but about facebook infrastructure&amp;lt;br&amp;gt;&lt;br /&gt;
[13:57]  Enus Linden: Morgaine: think back to last january&amp;lt;br&amp;gt;&lt;br /&gt;
[13:57]  Enus Linden: and the months leading up&amp;lt;br&amp;gt;&lt;br /&gt;
[13:57]  Latif Khalifa: they handle 150k pageviews a sec&amp;lt;br&amp;gt;&lt;br /&gt;
[13:57]  Latif Khalifa: and they have 35TB memcached cluster&amp;lt;br&amp;gt;&lt;br /&gt;
[13:57]  Morgaine Dinova: Yeah, Facebook is great with articles and presentations on their internals.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:57]  Latif Khalifa: which they have hacked to use UDP&amp;lt;br&amp;gt;&lt;br /&gt;
[13:57]  Enus Linden: we fell over at 3pm PSt 3 out of every 7 days&amp;lt;br&amp;gt;&lt;br /&gt;
[13:58]  Latif Khalifa: since it&#039;s all iternal net, and ultra low latency&amp;lt;br&amp;gt;&lt;br /&gt;
[13:58]  Latif Khalifa: they claim to get &amp;lt;1ms latency from memcached over udp on local net&amp;lt;br&amp;gt;&lt;br /&gt;
[13:58]  Latif Khalifa: which is pretty awesome&amp;lt;br&amp;gt;&lt;br /&gt;
[13:58]  Morgaine Dinova: Latif: notice that though they went back to UDP, they had to create their own reliability layer on top of it, and they said that was utter murder.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Enus Linden: eep, almost 2. i gotta run.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Enus Linden: THANKS everyone&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Morgaine Dinova: KK, Cyu Enus, take care :-)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Rakesh Linden: ty Enus&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Fisher Linden: Thanks, Enus. :-)&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Dedric Mauriac: Thanks enus.&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Enus Linden: note: next week I will miss this time slot&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Latif Khalifa: take care enus&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Enus Linden: i hope to have a stand in&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Enus Linden: this was a nice caht&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Fisher Linden: Spider!&amp;lt;br&amp;gt;&lt;br /&gt;
[13:59]  Enus Linden: maybe i&#039;ll get the auto team to front someone to talk more&amp;lt;br&amp;gt;&lt;br /&gt;
[14:00]  Morgaine Dinova: woot!&amp;lt;br&amp;gt;&lt;br /&gt;
[14:00]  Enus Linden: exactly fisher&amp;lt;br&amp;gt;&lt;br /&gt;
[14:00]  Dedric Mauriac: have an ajenda next time&amp;lt;br&amp;gt;&lt;br /&gt;
[14:00]  Enus Linden: this went well w/o&amp;lt;br&amp;gt;&lt;br /&gt;
[14:00]  Enus Linden: ;)&amp;lt;br&amp;gt;&lt;br /&gt;
[14:00]  Enus Linden: will try&amp;lt;br&amp;gt;&lt;br /&gt;
[14:00]  Enus Linden: ciao!&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=698653</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=698653"/>
		<updated>2010-01-06T17:32:01Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* Install Method 2: setup.py */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&lt;br /&gt;
We&#039;re migrating to [[Mercurial_repositories|Mercurial]]... Please check back soon for updated docs.&lt;br /&gt;
&lt;br /&gt;
PyOGP package install instructions need some work... stay tuned. Feel free to follow the buildout directions to use the Subversion repositories for now.&lt;br /&gt;
&lt;br /&gt;
=== Repositories ===&lt;br /&gt;
&lt;br /&gt;
Need some work before they are ready as installed packages. In the meantime, just add the path to &amp;quot;pyogp.{package}&amp;quot; to your PYTHONPATH to use the libs, assuming you have the other dependencies.&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Needs updates to work:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x (fails on 2.6 currently and untested on 3.0)&lt;br /&gt;
* pyopenssl http://sourceforge.net/projects/pyopenssl/files/pyopenssl-win/0.8a1/pyOpenSSL-0.8a1.winxp32-py2.5.msi/download (Windows 32-bit)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a reinstall of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Buildout does not yet support subversion 1.6, only 1.4.4-1.5.x.&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix distribution ===&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
==== easy_install ====&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
==== virtualenv ====&lt;br /&gt;
&lt;br /&gt;
One may choose to create an isolated python instance on your host, to be able to work with PyOGP without installing packages to your base Python install on your host. &lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
== Install methods ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways...&lt;br /&gt;
&lt;br /&gt;
=== Install Method 1: buildout [Defunct] ===&lt;br /&gt;
&lt;br /&gt;
We use zc.buildout to automatically setup a development environment. buildout gives you the ability to install packages only locally instead of your global python installation. It&#039;s sort of a local python installation which helps you avoiding version conflicts of packages.&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
 svn co http://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/trunk/ libdev&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;(Optional)&#039;&#039;&#039; Now turn this directory into a virtual python environment which is independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd libdev&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter (if installed. If not, use your system&#039;s python.):&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp which is a python interpreter which contains all the installed packaged and the pyogp library and related projects.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Give your Avatar name and it will ask for a password. Then it tries to login to the Preview Grid.&lt;br /&gt;
&lt;br /&gt;
=== Install Method 2: setup.py ===&lt;br /&gt;
&lt;br /&gt;
How to check out packages and using them independently of buildout.&lt;br /&gt;
&lt;br /&gt;
If you are comfortable, feel free to use setup.py (with or without a dedicated virtualenv) in any of the following repos: &lt;br /&gt;
&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Each of the repos already has eggs embedded, and pyogp.apps has the appropriate dependency on pyogp.lib.base configured, which can be checked out and installed in isolation.&lt;br /&gt;
&lt;br /&gt;
1.  Check out the repository of your choice&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/{pyogp package}/&lt;br /&gt;
&lt;br /&gt;
2. Run setup.py&lt;br /&gt;
 cd &amp;lt;your pyogp dir&amp;gt;&lt;br /&gt;
 python setup.py install&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Client_Library#Pyogp_Unit_Tests]] for details...&lt;br /&gt;
&lt;br /&gt;
== The structure of the sandbox ==&lt;br /&gt;
&lt;br /&gt;
You now might wonder what all those directories are good for. To learn more about this check out the [[Pyogp/Filesystem_Structure|Filesystem Structure]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=679612</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=679612"/>
		<updated>2009-12-03T23:49:05Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* Install Method 1: buildout [Defunct] */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&lt;br /&gt;
We&#039;re migrating to [[Mercurial_repositories|Mercurial]]... Please check back soon for updated docs.&lt;br /&gt;
&lt;br /&gt;
PyOGP package install instructions need some work... stay tuned. Feel free to follow the buildout directions to use the Subversion repositories for now.&lt;br /&gt;
&lt;br /&gt;
=== Repositories ===&lt;br /&gt;
&lt;br /&gt;
Need some work before they are ready as installed packages. In the meantime, just add the path to &amp;quot;pyogp.{package}&amp;quot; to your PYTHONPATH to use the libs, assuming you have the other dependencies.&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Needs updates to work:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x (fails on 2.6 currently and untested on 3.0)&lt;br /&gt;
* pyopenssl http://sourceforge.net/projects/pyopenssl/files/pyopenssl-win/0.8a1/pyOpenSSL-0.8a1.winxp32-py2.5.msi/download (Windows 32-bit)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a reinstall of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Buildout does not yet support subversion 1.6, only 1.4.4-1.5.x.&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix distribution ===&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
==== easy_install ====&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
==== virtualenv ====&lt;br /&gt;
&lt;br /&gt;
One may choose to create an isolated python instance on your host, to be able to work with PyOGP without installing packages to your base Python install on your host. &lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
== Install methods ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways...&lt;br /&gt;
&lt;br /&gt;
=== Install Method 1: buildout [Defunct] ===&lt;br /&gt;
&lt;br /&gt;
We use zc.buildout to automatically setup a development environment. buildout gives you the ability to install packages only locally instead of your global python installation. It&#039;s sort of a local python installation which helps you avoiding version conflicts of packages.&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
 svn co http://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/trunk/ libdev&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;(Optional)&#039;&#039;&#039; Now turn this directory into a virtual python environment which is independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd libdev&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter (if installed. If not, use your system&#039;s python.):&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp which is a python interpreter which contains all the installed packaged and the pyogp library and related projects.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Give your Avatar name and it will ask for a password. Then it tries to login to the Preview Grid.&lt;br /&gt;
&lt;br /&gt;
=== Install Method 2: setup.py ===&lt;br /&gt;
&lt;br /&gt;
How to check out packages and using them independently of buildout.&lt;br /&gt;
&lt;br /&gt;
If you are comfortable, feel free to use setup.py (with or without a dedicated virtualenv) in any of the following repos: &lt;br /&gt;
&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Each of the repos already has eggs embedded, and pyogp.apps has the appropriate dependency on pyogp.lib.base configured, which can be checked out and installed in isolation.&lt;br /&gt;
&lt;br /&gt;
1.  Check out the repository of your choice&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/{pyogp package}/&lt;br /&gt;
&lt;br /&gt;
2. Run setup.py&lt;br /&gt;
 cd &amp;lt;your pyogp dir&amp;gt;&lt;br /&gt;
 python setup.py&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Client_Library#Pyogp_Unit_Tests]] for details...&lt;br /&gt;
&lt;br /&gt;
== The structure of the sandbox ==&lt;br /&gt;
&lt;br /&gt;
You now might wonder what all those directories are good for. To learn more about this check out the [[Pyogp/Filesystem_Structure|Filesystem Structure]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=679592</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=679592"/>
		<updated>2009-12-03T23:48:23Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* Install Method 2: setup.py */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&lt;br /&gt;
We&#039;re migrating to [[Mercurial_repositories|Mercurial]]... Please check back soon for updated docs.&lt;br /&gt;
&lt;br /&gt;
PyOGP package install instructions need some work... stay tuned. Feel free to follow the buildout directions to use the Subversion repositories for now.&lt;br /&gt;
&lt;br /&gt;
=== Repositories ===&lt;br /&gt;
&lt;br /&gt;
Need some work before they are ready as installed packages. In the meantime, just add the path to &amp;quot;pyogp.{package}&amp;quot; to your PYTHONPATH to use the libs, assuming you have the other dependencies.&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Needs updates to work:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x (fails on 2.6 currently and untested on 3.0)&lt;br /&gt;
* pyopenssl http://sourceforge.net/projects/pyopenssl/files/pyopenssl-win/0.8a1/pyOpenSSL-0.8a1.winxp32-py2.5.msi/download (Windows 32-bit)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a reinstall of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Buildout does not yet support subversion 1.6, only 1.4.4-1.5.x.&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix distribution ===&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
==== easy_install ====&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
==== virtualenv ====&lt;br /&gt;
&lt;br /&gt;
One may choose to create an isolated python instance on your host, to be able to work with PyOGP without installing packages to your base Python install on your host. &lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
== Install methods ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways...&lt;br /&gt;
&lt;br /&gt;
=== Install Method 1: buildout [Defunct] ===&lt;br /&gt;
&lt;br /&gt;
We use zc.buildout to automatically setup a development environment. buildout gives you the ability to install packages only locally instead of your global python installation. It&#039;s sort of a local python installation which helps you avoiding version conflicts of packages.&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
 svn co http://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/trunk/ libdev&lt;br /&gt;
&lt;br /&gt;
For those who are interested, tagged and stable version of buildout (with pinned versions on externals) is available at https://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/tags/0.1/.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;(Optional)&#039;&#039;&#039; Now turn this directory into a virtual python environment which is independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd libdev&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter (if installed. If not, use your system&#039;s python.):&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp which is a python interpreter which contains all the installed packaged and the pyogp library and related projects.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Give your Avatar name and it will ask for a password. Then it tries to login to the Preview Grid.&lt;br /&gt;
&lt;br /&gt;
=== Install Method 2: setup.py ===&lt;br /&gt;
&lt;br /&gt;
How to check out packages and using them independently of buildout.&lt;br /&gt;
&lt;br /&gt;
If you are comfortable, feel free to use setup.py (with or without a dedicated virtualenv) in any of the following repos: &lt;br /&gt;
&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Each of the repos already has eggs embedded, and pyogp.apps has the appropriate dependency on pyogp.lib.base configured, which can be checked out and installed in isolation.&lt;br /&gt;
&lt;br /&gt;
1.  Check out the repository of your choice&lt;br /&gt;
 hg clone https://enus_linden@bitbucket.org/enus_linden/{pyogp package}/&lt;br /&gt;
&lt;br /&gt;
2. Run setup.py&lt;br /&gt;
 cd &amp;lt;your pyogp dir&amp;gt;&lt;br /&gt;
 python setup.py&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Client_Library#Pyogp_Unit_Tests]] for details...&lt;br /&gt;
&lt;br /&gt;
== The structure of the sandbox ==&lt;br /&gt;
&lt;br /&gt;
You now might wonder what all those directories are good for. To learn more about this check out the [[Pyogp/Filesystem_Structure|Filesystem Structure]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=679582</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=679582"/>
		<updated>2009-12-03T23:47:39Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* Repositories */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&lt;br /&gt;
We&#039;re migrating to [[Mercurial_repositories|Mercurial]]... Please check back soon for updated docs.&lt;br /&gt;
&lt;br /&gt;
PyOGP package install instructions need some work... stay tuned. Feel free to follow the buildout directions to use the Subversion repositories for now.&lt;br /&gt;
&lt;br /&gt;
=== Repositories ===&lt;br /&gt;
&lt;br /&gt;
Need some work before they are ready as installed packages. In the meantime, just add the path to &amp;quot;pyogp.{package}&amp;quot; to your PYTHONPATH to use the libs, assuming you have the other dependencies.&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Needs updates to work:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x (fails on 2.6 currently and untested on 3.0)&lt;br /&gt;
* pyopenssl http://sourceforge.net/projects/pyopenssl/files/pyopenssl-win/0.8a1/pyOpenSSL-0.8a1.winxp32-py2.5.msi/download (Windows 32-bit)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a reinstall of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Buildout does not yet support subversion 1.6, only 1.4.4-1.5.x.&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix distribution ===&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
==== easy_install ====&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
==== virtualenv ====&lt;br /&gt;
&lt;br /&gt;
One may choose to create an isolated python instance on your host, to be able to work with PyOGP without installing packages to your base Python install on your host. &lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
== Install methods ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways...&lt;br /&gt;
&lt;br /&gt;
=== Install Method 1: buildout [Defunct] ===&lt;br /&gt;
&lt;br /&gt;
We use zc.buildout to automatically setup a development environment. buildout gives you the ability to install packages only locally instead of your global python installation. It&#039;s sort of a local python installation which helps you avoiding version conflicts of packages.&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
 svn co http://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/trunk/ libdev&lt;br /&gt;
&lt;br /&gt;
For those who are interested, tagged and stable version of buildout (with pinned versions on externals) is available at https://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/tags/0.1/.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;(Optional)&#039;&#039;&#039; Now turn this directory into a virtual python environment which is independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd libdev&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter (if installed. If not, use your system&#039;s python.):&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp which is a python interpreter which contains all the installed packaged and the pyogp library and related projects.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Give your Avatar name and it will ask for a password. Then it tries to login to the Preview Grid.&lt;br /&gt;
&lt;br /&gt;
=== Install Method 2: setup.py ===&lt;br /&gt;
&lt;br /&gt;
How to check out packages and using them independently of buildout.&lt;br /&gt;
&lt;br /&gt;
If you are comfortable, feel free to use setup.py (with or without a dedicated virtualenv) in any of the following repos: &lt;br /&gt;
&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Each of the repos already has eggs embedded, and pyogp.apps has the appropriate dependency on pyogp.lib.base configured, which can be checked out and installed in isolation.&lt;br /&gt;
&lt;br /&gt;
1.  Check out the repository of your choice&lt;br /&gt;
 svn co https://svn.secondlife.com/svn/linden/projects/2008/pyogp/&amp;lt;the repo you wanted&amp;gt;/trunk &amp;lt;your pyogp dir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Run setup.py&lt;br /&gt;
 cd &amp;lt;your pyogp dir&amp;gt;&lt;br /&gt;
 python setup.py&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Client_Library#Pyogp_Unit_Tests]] for details...&lt;br /&gt;
&lt;br /&gt;
== The structure of the sandbox ==&lt;br /&gt;
&lt;br /&gt;
You now might wonder what all those directories are good for. To learn more about this check out the [[Pyogp/Filesystem_Structure|Filesystem Structure]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=679572</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=679572"/>
		<updated>2009-12-03T23:47:15Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* Repositories */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&lt;br /&gt;
We&#039;re migrating to [[Mercurial_repositories|Mercurial]]... Please check back soon for updated docs.&lt;br /&gt;
&lt;br /&gt;
PyOGP package install instructions need some work... stay tuned. Feel free to follow the buildout directions to use the Subversion repositories for now.&lt;br /&gt;
&lt;br /&gt;
=== Repositories ===&lt;br /&gt;
&lt;br /&gt;
Need some work before they are ready as installed packages. In the meantime, just add the path to &amp;quot;pyogp.{package} to your PYTHONPATH to use the libs.&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Needs updates to work:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x (fails on 2.6 currently and untested on 3.0)&lt;br /&gt;
* pyopenssl http://sourceforge.net/projects/pyopenssl/files/pyopenssl-win/0.8a1/pyOpenSSL-0.8a1.winxp32-py2.5.msi/download (Windows 32-bit)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a reinstall of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Buildout does not yet support subversion 1.6, only 1.4.4-1.5.x.&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix distribution ===&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
==== easy_install ====&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
==== virtualenv ====&lt;br /&gt;
&lt;br /&gt;
One may choose to create an isolated python instance on your host, to be able to work with PyOGP without installing packages to your base Python install on your host. &lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
== Install methods ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways...&lt;br /&gt;
&lt;br /&gt;
=== Install Method 1: buildout [Defunct] ===&lt;br /&gt;
&lt;br /&gt;
We use zc.buildout to automatically setup a development environment. buildout gives you the ability to install packages only locally instead of your global python installation. It&#039;s sort of a local python installation which helps you avoiding version conflicts of packages.&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
 svn co http://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/trunk/ libdev&lt;br /&gt;
&lt;br /&gt;
For those who are interested, tagged and stable version of buildout (with pinned versions on externals) is available at https://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/tags/0.1/.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;(Optional)&#039;&#039;&#039; Now turn this directory into a virtual python environment which is independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd libdev&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter (if installed. If not, use your system&#039;s python.):&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp which is a python interpreter which contains all the installed packaged and the pyogp library and related projects.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Give your Avatar name and it will ask for a password. Then it tries to login to the Preview Grid.&lt;br /&gt;
&lt;br /&gt;
=== Install Method 2: setup.py ===&lt;br /&gt;
&lt;br /&gt;
How to check out packages and using them independently of buildout.&lt;br /&gt;
&lt;br /&gt;
If you are comfortable, feel free to use setup.py (with or without a dedicated virtualenv) in any of the following repos: &lt;br /&gt;
&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Each of the repos already has eggs embedded, and pyogp.apps has the appropriate dependency on pyogp.lib.base configured, which can be checked out and installed in isolation.&lt;br /&gt;
&lt;br /&gt;
1.  Check out the repository of your choice&lt;br /&gt;
 svn co https://svn.secondlife.com/svn/linden/projects/2008/pyogp/&amp;lt;the repo you wanted&amp;gt;/trunk &amp;lt;your pyogp dir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Run setup.py&lt;br /&gt;
 cd &amp;lt;your pyogp dir&amp;gt;&lt;br /&gt;
 python setup.py&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Client_Library#Pyogp_Unit_Tests]] for details...&lt;br /&gt;
&lt;br /&gt;
== The structure of the sandbox ==&lt;br /&gt;
&lt;br /&gt;
You now might wonder what all those directories are good for. To learn more about this check out the [[Pyogp/Filesystem_Structure|Filesystem Structure]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=679562</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=679562"/>
		<updated>2009-12-03T23:46:25Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* Note */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&lt;br /&gt;
We&#039;re migrating to [[Mercurial_repositories|Mercurial]]... Please check back soon for updated docs.&lt;br /&gt;
&lt;br /&gt;
PyOGP package install instructions need some work... stay tuned. Feel free to follow the buildout directions to use the Subversion repositories for now.&lt;br /&gt;
&lt;br /&gt;
=== Repositories ===&lt;br /&gt;
&lt;br /&gt;
Should work just fine as installed packages:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Needs updates to work:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x (fails on 2.6 currently and untested on 3.0)&lt;br /&gt;
* pyopenssl http://sourceforge.net/projects/pyopenssl/files/pyopenssl-win/0.8a1/pyOpenSSL-0.8a1.winxp32-py2.5.msi/download (Windows 32-bit)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a reinstall of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Buildout does not yet support subversion 1.6, only 1.4.4-1.5.x.&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix distribution ===&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
==== easy_install ====&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
==== virtualenv ====&lt;br /&gt;
&lt;br /&gt;
One may choose to create an isolated python instance on your host, to be able to work with PyOGP without installing packages to your base Python install on your host. &lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
== Install methods ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways...&lt;br /&gt;
&lt;br /&gt;
=== Install Method 1: buildout [Defunct] ===&lt;br /&gt;
&lt;br /&gt;
We use zc.buildout to automatically setup a development environment. buildout gives you the ability to install packages only locally instead of your global python installation. It&#039;s sort of a local python installation which helps you avoiding version conflicts of packages.&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
 svn co http://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/trunk/ libdev&lt;br /&gt;
&lt;br /&gt;
For those who are interested, tagged and stable version of buildout (with pinned versions on externals) is available at https://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/tags/0.1/.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;(Optional)&#039;&#039;&#039; Now turn this directory into a virtual python environment which is independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd libdev&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter (if installed. If not, use your system&#039;s python.):&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp which is a python interpreter which contains all the installed packaged and the pyogp library and related projects.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Give your Avatar name and it will ask for a password. Then it tries to login to the Preview Grid.&lt;br /&gt;
&lt;br /&gt;
=== Install Method 2: setup.py ===&lt;br /&gt;
&lt;br /&gt;
How to check out packages and using them independently of buildout.&lt;br /&gt;
&lt;br /&gt;
If you are comfortable, feel free to use setup.py (with or without a dedicated virtualenv) in any of the following repos: &lt;br /&gt;
&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Each of the repos already has eggs embedded, and pyogp.apps has the appropriate dependency on pyogp.lib.base configured, which can be checked out and installed in isolation.&lt;br /&gt;
&lt;br /&gt;
1.  Check out the repository of your choice&lt;br /&gt;
 svn co https://svn.secondlife.com/svn/linden/projects/2008/pyogp/&amp;lt;the repo you wanted&amp;gt;/trunk &amp;lt;your pyogp dir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Run setup.py&lt;br /&gt;
 cd &amp;lt;your pyogp dir&amp;gt;&lt;br /&gt;
 python setup.py&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Client_Library#Pyogp_Unit_Tests]] for details...&lt;br /&gt;
&lt;br /&gt;
== The structure of the sandbox ==&lt;br /&gt;
&lt;br /&gt;
You now might wonder what all those directories are good for. To learn more about this check out the [[Pyogp/Filesystem_Structure|Filesystem Structure]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=679382</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=679382"/>
		<updated>2009-12-03T21:56:03Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* Note */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&lt;br /&gt;
We&#039;re migrating to Mercurial... Please check back soon for updated docs.&lt;br /&gt;
&lt;br /&gt;
Feel free t follow the buildout and Subversion related directions below for now...&lt;br /&gt;
&lt;br /&gt;
=== Repositories ===&lt;br /&gt;
&lt;br /&gt;
Should work just fine as installed packages:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Needs updates to work:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x (fails on 2.6 currently and untested on 3.0)&lt;br /&gt;
* pyopenssl http://sourceforge.net/projects/pyopenssl/files/pyopenssl-win/0.8a1/pyOpenSSL-0.8a1.winxp32-py2.5.msi/download (Windows 32-bit)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a reinstall of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Buildout does not yet support subversion 1.6, only 1.4.4-1.5.x.&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix distribution ===&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
==== easy_install ====&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
==== virtualenv ====&lt;br /&gt;
&lt;br /&gt;
One may choose to create an isolated python instance on your host, to be able to work with PyOGP without installing packages to your base Python install on your host. &lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
== Install methods ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways...&lt;br /&gt;
&lt;br /&gt;
=== Install Method 1: buildout [Defunct] ===&lt;br /&gt;
&lt;br /&gt;
We use zc.buildout to automatically setup a development environment. buildout gives you the ability to install packages only locally instead of your global python installation. It&#039;s sort of a local python installation which helps you avoiding version conflicts of packages.&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
 svn co http://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/trunk/ libdev&lt;br /&gt;
&lt;br /&gt;
For those who are interested, tagged and stable version of buildout (with pinned versions on externals) is available at https://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/tags/0.1/.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;(Optional)&#039;&#039;&#039; Now turn this directory into a virtual python environment which is independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd libdev&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter (if installed. If not, use your system&#039;s python.):&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp which is a python interpreter which contains all the installed packaged and the pyogp library and related projects.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Give your Avatar name and it will ask for a password. Then it tries to login to the Preview Grid.&lt;br /&gt;
&lt;br /&gt;
=== Install Method 2: setup.py ===&lt;br /&gt;
&lt;br /&gt;
How to check out packages and using them independently of buildout.&lt;br /&gt;
&lt;br /&gt;
If you are comfortable, feel free to use setup.py (with or without a dedicated virtualenv) in any of the following repos: &lt;br /&gt;
&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Each of the repos already has eggs embedded, and pyogp.apps has the appropriate dependency on pyogp.lib.base configured, which can be checked out and installed in isolation.&lt;br /&gt;
&lt;br /&gt;
1.  Check out the repository of your choice&lt;br /&gt;
 svn co https://svn.secondlife.com/svn/linden/projects/2008/pyogp/&amp;lt;the repo you wanted&amp;gt;/trunk &amp;lt;your pyogp dir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Run setup.py&lt;br /&gt;
 cd &amp;lt;your pyogp dir&amp;gt;&lt;br /&gt;
 python setup.py&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Client_Library#Pyogp_Unit_Tests]] for details...&lt;br /&gt;
&lt;br /&gt;
== The structure of the sandbox ==&lt;br /&gt;
&lt;br /&gt;
You now might wonder what all those directories are good for. To learn more about this check out the [[Pyogp/Filesystem_Structure|Filesystem Structure]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=679292</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=679292"/>
		<updated>2009-12-03T21:30:14Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&lt;br /&gt;
We&#039;re migrating to Mercurial... Please check back soon for updated docs.&lt;br /&gt;
&lt;br /&gt;
=== Repositories ===&lt;br /&gt;
&lt;br /&gt;
Should work just fine as installed packages:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Needs updates to work:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/&lt;br /&gt;
&lt;br /&gt;
Defunct until someone picks them up and fixes them:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/&lt;br /&gt;
&lt;br /&gt;
== Browse the Code ==&lt;br /&gt;
&lt;br /&gt;
If all you want to do is glance at the source code, use the bitbucket source browser:&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.apps/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.buildout/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.interop/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.agentdomain/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.base/src/&lt;br /&gt;
* http://bitbucket.org/enus_linden/pyogp.lib.client/src/&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x (fails on 2.6 currently and untested on 3.0)&lt;br /&gt;
* pyopenssl http://sourceforge.net/projects/pyopenssl/files/pyopenssl-win/0.8a1/pyOpenSSL-0.8a1.winxp32-py2.5.msi/download (Windows 32-bit)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a reinstall of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Buildout does not yet support subversion 1.6, only 1.4.4-1.5.x.&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix distribution ===&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
==== easy_install ====&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
==== virtualenv ====&lt;br /&gt;
&lt;br /&gt;
One may choose to create an isolated python instance on your host, to be able to work with PyOGP without installing packages to your base Python install on your host. &lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
== Install methods ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways...&lt;br /&gt;
&lt;br /&gt;
=== Install Method 1: buildout [Defunct] ===&lt;br /&gt;
&lt;br /&gt;
We use zc.buildout to automatically setup a development environment. buildout gives you the ability to install packages only locally instead of your global python installation. It&#039;s sort of a local python installation which helps you avoiding version conflicts of packages.&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
 svn co http://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/trunk/ libdev&lt;br /&gt;
&lt;br /&gt;
For those who are interested, tagged and stable version of buildout (with pinned versions on externals) is available at https://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/tags/0.1/.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;(Optional)&#039;&#039;&#039; Now turn this directory into a virtual python environment which is independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd libdev&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter (if installed. If not, use your system&#039;s python.):&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp which is a python interpreter which contains all the installed packaged and the pyogp library and related projects.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Give your Avatar name and it will ask for a password. Then it tries to login to the Preview Grid.&lt;br /&gt;
&lt;br /&gt;
=== Install Method 2: setup.py ===&lt;br /&gt;
&lt;br /&gt;
How to check out packages and using them independently of buildout.&lt;br /&gt;
&lt;br /&gt;
If you are comfortable, feel free to use setup.py (with or without a dedicated virtualenv) in any of the following repos: &lt;br /&gt;
&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.apps/&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.base/&lt;br /&gt;
: hg clone https://enus_linden@bitbucket.org/enus_linden/pyogp.lib.client/&lt;br /&gt;
&lt;br /&gt;
Each of the repos already has eggs embedded, and pyogp.apps has the appropriate dependency on pyogp.lib.base configured, which can be checked out and installed in isolation.&lt;br /&gt;
&lt;br /&gt;
1.  Check out the repository of your choice&lt;br /&gt;
 svn co https://svn.secondlife.com/svn/linden/projects/2008/pyogp/&amp;lt;the repo you wanted&amp;gt;/trunk &amp;lt;your pyogp dir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Run setup.py&lt;br /&gt;
 cd &amp;lt;your pyogp dir&amp;gt;&lt;br /&gt;
 python setup.py&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Client_Library#Pyogp_Unit_Tests]] for details...&lt;br /&gt;
&lt;br /&gt;
== The structure of the sandbox ==&lt;br /&gt;
&lt;br /&gt;
You now might wonder what all those directories are good for. To learn more about this check out the [[Pyogp/Filesystem_Structure|Filesystem Structure]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=679222</id>
		<title>PyOGP Client Library Development Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library_Development_Sandbox&amp;diff=679222"/>
		<updated>2009-12-03T21:18:11Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* Prerequisites */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
We will first run down the general explanation and add platform specific notes later.&lt;br /&gt;
&lt;br /&gt;
==Browse the Code==&lt;br /&gt;
If all you want to do is glance at the source code, use the [http://svn.secondlife.com/trac/linden/browser/projects/2008/pyogp browser link to the repository]&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
You must have the following installed:&lt;br /&gt;
* Mercurial - 1.3 or greater&lt;br /&gt;
* Python 2.4.4, 2.5.x (fails on 2.6 currently and untested on 3.0)&lt;br /&gt;
* pyopenssl http://sourceforge.net/projects/pyopenssl/files/pyopenssl-win/0.8a1/pyOpenSSL-0.8a1.winxp32-py2.5.msi/download (Windows 32-bit)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Snow Leopard upgrades require a reinstall of XCode, in this case to accommodate gcc (and greenlet).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Buildout does not yet support subversion 1.6, only 1.4.4-1.5.x.&lt;br /&gt;
&lt;br /&gt;
== Environment Preparation ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setuptools&#039;&#039;&#039; and &#039;&#039;&#039;easy_install&#039;&#039;&#039; are Python standard means for installing modules. For more info, start here: http://pypi.python.org/pypi/setuptools.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtualenv&#039;&#039;&#039; is a method which allows you to create isolated Python environments, separate from your base install if you so prefer. For more, see here: http://pypi.python.org/pypi/virtualenv.&lt;br /&gt;
&lt;br /&gt;
Your distribution may have Python&#039;s &#039;&#039;&#039;setuptools&#039;&#039;&#039; and &#039;&#039;&#039;virtualenv&#039;&#039;&#039; packages in its package repository.  If so, it is probably best to use your normal package installation procedures (see below for information on specific Linux distributions).  If the packages are not available then follow these generic instructions.&lt;br /&gt;
&lt;br /&gt;
=== Generic *nix distribution ===&lt;br /&gt;
In order to install Python Packages and creating a development sandbox you have to do the following:&lt;br /&gt;
&lt;br /&gt;
==== easy_install ====&lt;br /&gt;
&lt;br /&gt;
Download ez_setup.py and run it with your Python interpreter. You can find it here: http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
&lt;br /&gt;
Eventually you have to be root to do this depending on your system (mostly non-windows). It should look like this on a unix based machine:&lt;br /&gt;
&lt;br /&gt;
 wget http://peak.telecommunity.com/dist/ez_setup.py&lt;br /&gt;
 sudo python ez_setup.py&lt;br /&gt;
&lt;br /&gt;
==== virtualenv ====&lt;br /&gt;
&lt;br /&gt;
One may choose to create an isolated python instance on your host, to be able to work with PyOGP without installing packages to your base Python install on your host. &lt;br /&gt;
&lt;br /&gt;
To use a dedicated python installation in your host, install virtualenv like this:&lt;br /&gt;
&lt;br /&gt;
 easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
Or, if you need to be root something like this:&lt;br /&gt;
&lt;br /&gt;
 sudo easy_install virtualenv&lt;br /&gt;
&lt;br /&gt;
On windows, you may need a different path to easy_install&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\easy_install.exe virtualenv&lt;br /&gt;
&lt;br /&gt;
== Install methods ==&lt;br /&gt;
&lt;br /&gt;
Python modules can be installed in a variety of ways...&lt;br /&gt;
&lt;br /&gt;
=== Install Method 1: buildout ===&lt;br /&gt;
&lt;br /&gt;
We use zc.buildout to automatically setup a development environment. buildout gives you the ability to install packages only locally instead of your global python installation. It&#039;s sort of a local python installation which helps you avoiding version conflicts of packages.&lt;br /&gt;
&lt;br /&gt;
1. First check out the buildout into a directory of your choice:&lt;br /&gt;
&lt;br /&gt;
 svn co http://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/trunk/ libdev&lt;br /&gt;
&lt;br /&gt;
For those who are interested, tagged and stable version of buildout (with pinned versions on externals) is available at https://svn.secondlife.com/svn/linden/projects/2008/pyogp/buildouts/libdev/tags/0.1/.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;(Optional)&#039;&#039;&#039; Now turn this directory into a virtual python environment which is independent of your normal Python installation:&lt;br /&gt;
&lt;br /&gt;
 cd libdev&lt;br /&gt;
 virtualenv . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
on windows, you may need to specify the path&lt;br /&gt;
&lt;br /&gt;
 c:\Python25\Scripts\virtualenv.exe . --no-site-packages&lt;br /&gt;
&lt;br /&gt;
3. Now run the bootstrap.py file with the newly created local Python interpreter (if installed. If not, use your system&#039;s python.):&lt;br /&gt;
&lt;br /&gt;
 bin/python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  Scripts\python bootstrap.py&lt;br /&gt;
&lt;br /&gt;
4. This creates a bunch of directories and the bin/buildout script (bin\buildout.exe on windows). We now run this:&lt;br /&gt;
&lt;br /&gt;
  bin/buildout -v&lt;br /&gt;
&lt;br /&gt;
or on Windows:&lt;br /&gt;
&lt;br /&gt;
  bin\buildout.exe -v&lt;br /&gt;
&lt;br /&gt;
5. The development sandbox is ready. There now is a bin/pyogp which is a python interpreter which contains all the installed packaged and the pyogp library and related projects.&lt;br /&gt;
&lt;br /&gt;
6. Test the buildout installation. To test this installation you can (at least at this stage of the project) try the following:&lt;br /&gt;
&lt;br /&gt;
  bin/region_connect &amp;lt;firstname&amp;gt; &amp;lt;lastname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Give your Avatar name and it will ask for a password. Then it tries to login to the Preview Grid.&lt;br /&gt;
&lt;br /&gt;
=== Install Method 2: setup.py ===&lt;br /&gt;
&lt;br /&gt;
How to check out packages and using them independently of buildout.&lt;br /&gt;
&lt;br /&gt;
If you are comfortable, feel free to use setup.py (with or without a dedicated virtualenv) in any of the following repos: &lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Dev&#039;&#039;&#039;: https://svn.secondlife.com/svn/linden/projects/2008/pyogp/pyogp.apps/trunk&lt;br /&gt;
: &#039;&#039;&#039;Dev&#039;&#039;&#039;: https://svn.secondlife.com/svn/linden/projects/2008/pyogp/pyogp.lib.base/trunk/&lt;br /&gt;
: &#039;&#039;&#039;Dev&#039;&#039;&#039;: https://svn.secondlife.com/svn/linden/projects/2008/pyogp/pyogp.lib.client/trunk/&lt;br /&gt;
&lt;br /&gt;
Each of the repos already has eggs embedded, and pyogp.apps has the appropriate dependency on pyogp.lib.base configured, which can be checked out and installed in isolation.&lt;br /&gt;
&lt;br /&gt;
1.  Check out the repository of your choice&lt;br /&gt;
 svn co https://svn.secondlife.com/svn/linden/projects/2008/pyogp/&amp;lt;the repo you wanted&amp;gt;/trunk &amp;lt;your pyogp dir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Run setup.py&lt;br /&gt;
 cd &amp;lt;your pyogp dir&amp;gt;&lt;br /&gt;
 python setup.py&lt;br /&gt;
&lt;br /&gt;
== Run the tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Client_Library#Pyogp_Unit_Tests]] for details...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The structure of the sandbox ==&lt;br /&gt;
&lt;br /&gt;
You now might wonder what all those directories are good for. To learn more about this check out the [[Pyogp/Filesystem_Structure|Filesystem Structure]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP&amp;diff=679192</id>
		<title>PyOGP</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP&amp;diff=679192"/>
		<updated>2009-12-03T21:15:28Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* How To Contribute */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
=== What Is It? ===&lt;br /&gt;
&lt;br /&gt;
Pyogp is an open source project between Linden Lab and the [[AWG|Architecture Working Group (AWG)]] to support testing the [[Open Grid Protocol|Open Grid Protocol (OGP)]]. Written in Python, Pyogp will consist initially of a [[Pyogp/Documentation/Specification/pyogp.lib.base|client library]] and [[Pyogp/Documentation/Specification/pyogp.interop|test functionality]] to enable testing OGP-enabled virtual worlds such as Second Life and compatible OpenSim implementations. These components will expand as the effort matures.&lt;br /&gt;
&lt;br /&gt;
PyOGP could be useful for:&lt;br /&gt;
* checking your software&#039;s compliance with the OGP&lt;br /&gt;
* quickly writing tests for software which communicates using LLMessageSystem-like messages&lt;br /&gt;
* demonstrating protocol proposals&lt;br /&gt;
&lt;br /&gt;
=== Getting Started ===&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP Client Library Development Sandbox]] for instructions on how to starting using Pyogp.&lt;br /&gt;
See also [[PyOGP Client Library]] for a more up-to-date page.&lt;br /&gt;
&lt;br /&gt;
=== How To Contribute ===&lt;br /&gt;
* Source: [[Pyogp/Client_Lib/The_Development_Sandbox | Checkout Instructions]]. See the [[Open_Source_Portal|Open Source Portal]] for details on being a contributor&lt;br /&gt;
* in-world group: pyogp (open enrollement)&lt;br /&gt;
* IRC: irc://irc.freenode.com/#pyogp&lt;br /&gt;
* Mailing list: https://lists.secondlife.com/cgi-bin/mailman/listinfo/pyogp, pyogp@lists.secondlife.com&lt;br /&gt;
* Jira: http://jira.secondlife.com/browse/PYO&lt;br /&gt;
* Related Meetings&lt;br /&gt;
** Enus Linden&#039;s office hours: Friday @ 1:00 http://slurl.com/secondlife/Longfellow/99/97/28&lt;br /&gt;
&lt;br /&gt;
== Project Status ==&lt;br /&gt;
&lt;br /&gt;
PyOGP is moving to bitbucket! http://bitbucket.org/enus_linden/ &lt;br /&gt;
&lt;br /&gt;
Thanks for the patience as we make this transition.&lt;br /&gt;
&lt;br /&gt;
Keep track of progress on the list: https://lists.secondlife.com/cgi-bin/mailman/listinfo/pyogp.&lt;br /&gt;
&lt;br /&gt;
== Pic of the Moment ==&lt;br /&gt;
[[Image:355571.jpg|900x835px|the EnusBots are coming!]]&lt;br /&gt;
&lt;br /&gt;
Image used with permission. Taken by [[User:Opensource_Obscure|Opensource Obscure]]. (thanks oo! &amp;lt;3)&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
Contributions to Pyogp are subject to Linden Lab&#039;s [http://secondlifegrid.net/programs/open_source/submission contributor agreement]. The Pyogp open source code is made available subject to the Apache v2 license. Read more at [http://opensource.org/licenses/apache2.0.php opensource.org] and [http://www.apache.org/licenses/LICENSE-2.0 apache.org].&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;excerpt&amp;gt;&lt;br /&gt;
  Copyright 2008, Linden Research, Inc.&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
  you may not use this file except in compliance with the License.&lt;br /&gt;
  You may obtain a copy of the License at&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
  distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
  See the License for the specific language governing permissions and&lt;br /&gt;
  limitations under the License.&lt;br /&gt;
  &amp;lt;/excerpt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Linden Lab and the [[AWG]] ([[AW_Groupies|in-world discussion group page]]) are working together to develop a set of open protocols called the [[Open Grid Protocol]] that can be used to create a virtual world where regions are independently operated (not only by Linden Lab). The project is aiming to allow people (organizations, individuals, and the like) to host their own regions in the virtual world and be able to interact and communicate with people in regions hosted elsewhere. In essence, the project&#039;s goal is to allow open-source region hosting.&lt;br /&gt;
&lt;br /&gt;
AWG and Linden Lab plan to share the effort in writing a test harness that executes tests against implementations of the Open Grid Protocol. &lt;br /&gt;
&lt;br /&gt;
The intent is not to test SL or OpenSim (or gridX) themselves. Rather, the desire is to create a framework where the implementations of the protocols can be tested in any virtual environment implemented per the Open Grid Protocols as documented. The goal is to use the test harness to test the implementations to make sure that the virtual environment is interoperable with the other virtual environments that have implemented the OGP. However, we also plan to test the current SL protocols (the Legacy protocols). We plan to be able to test at the smallest functional level possible, akin to unit testing, and to have the ability to use the framework to sequence steps to enable state specific tests to be run.&lt;br /&gt;
&lt;br /&gt;
The longer-term vision is essentially a [[Pyogp_Client_Lib|client library]], capable of navigating the grid and interacting with the various hosts, sitting next to a testing framework, happily running along telling us what works where, and where something needs a little attention to work according to specification...&lt;br /&gt;
&lt;br /&gt;
For more detail on OGP, see a visual representation of the upcoming [[Open Grid Platform Projects Q2-Q3|projects]] and a general [[Structural Design Overview|introduction]].&lt;br /&gt;
&lt;br /&gt;
=== Notes from the kickoff meeting ===&lt;br /&gt;
&lt;br /&gt;
At the AWG meeting held April 29, 2008, we discussed what a test harness could look like that would be used to test the agent-domain, rez-avatar, and overall work being done implementing the open grid protocols. I&#039;d like to summarize, and continue the discussion on the mailing list, in-world, and on the wiki. See [[AWGroupies-2008-04-29|meeting chat log]].&lt;br /&gt;
&lt;br /&gt;
How do we start?&lt;br /&gt;
&lt;br /&gt;
Let&#039;s work on defining the test harness components (from the meeting):&lt;br /&gt;
# Login&lt;br /&gt;
# Caps (and while it&#039;s around the UDP pipe)&lt;br /&gt;
# Message Handlers (see chttp)&lt;br /&gt;
# Basic web server parts for the Agent, Region and grid bits (ideally a snap in framework)&lt;br /&gt;
# Test framework&lt;br /&gt;
# Test data (I put this here, not really as a component of the harness, more as a &amp;quot;i&#039;m not telling you my test account&#039;s password and what are we gonna do about it&amp;quot; thing)&lt;br /&gt;
&lt;br /&gt;
Python seems to be the flavor of choice here, with a requirement that it accommodate non-python components as needed. The repository for the code is proposed to be maintained by Linden Lab, distributed as an open source export, under the Apache v2 License (see http://opensource.org/licenses/apache2.0.php). The process and details here are tentative, and need more attention...&lt;br /&gt;
&lt;br /&gt;
There is plenty to be figured out. How to start, who wants to play, details are all TBD. My role is primarily intended as one who will facilitate dialogue and contribute as much as possible, but this is intended as a joint effort.&lt;br /&gt;
&lt;br /&gt;
-- Enus Linden&lt;br /&gt;
&lt;br /&gt;
[[Category:Architecture Working Group]]&lt;br /&gt;
[[Category:Grid_Interoperability]]&lt;br /&gt;
[[Category: Pyogp|*]]&lt;br /&gt;
[[Category:Pyogp_Kitchen_Sink]]&lt;br /&gt;
[[Category: AW Groupies]]&lt;br /&gt;
[[Category:Automated Testing]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP&amp;diff=679172</id>
		<title>PyOGP</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP&amp;diff=679172"/>
		<updated>2009-12-03T21:13:50Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* Project Status */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
=== What Is It? ===&lt;br /&gt;
&lt;br /&gt;
Pyogp is an open source project between Linden Lab and the [[AWG|Architecture Working Group (AWG)]] to support testing the [[Open Grid Protocol|Open Grid Protocol (OGP)]]. Written in Python, Pyogp will consist initially of a [[Pyogp/Documentation/Specification/pyogp.lib.base|client library]] and [[Pyogp/Documentation/Specification/pyogp.interop|test functionality]] to enable testing OGP-enabled virtual worlds such as Second Life and compatible OpenSim implementations. These components will expand as the effort matures.&lt;br /&gt;
&lt;br /&gt;
PyOGP could be useful for:&lt;br /&gt;
* checking your software&#039;s compliance with the OGP&lt;br /&gt;
* quickly writing tests for software which communicates using LLMessageSystem-like messages&lt;br /&gt;
* demonstrating protocol proposals&lt;br /&gt;
&lt;br /&gt;
=== Getting Started ===&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP Client Library Development Sandbox]] for instructions on how to starting using Pyogp.&lt;br /&gt;
See also [[PyOGP Client Library]] for a more up-to-date page.&lt;br /&gt;
&lt;br /&gt;
=== How To Contribute ===&lt;br /&gt;
* Source: [[Pyogp/Client_Lib/The_Development_Sandbox | Checkout Instructions]]. See the [[Open_Source_Portal|Open Source Portal]] for details on being a contributor&lt;br /&gt;
** If all you want to do is glance at the source code, use the [https://svn.secondlife.com/svn/linden/projects/2008/pyogp/ browser link to the repository]&lt;br /&gt;
* in-world group: pyogp (open enrollement)&lt;br /&gt;
* IRC: irc://irc.freenode.com/#pyogp&lt;br /&gt;
* Mailing list: https://lists.secondlife.com/cgi-bin/mailman/listinfo/pyogp, pyogp@lists.secondlife.com&lt;br /&gt;
* Jira: http://jira.secondlife.com/browse/PYO&lt;br /&gt;
* Related Meetings&lt;br /&gt;
** Enus Linden&#039;s office hours: Friday @ 1:00 http://slurl.com/secondlife/Longfellow/99/97/28&lt;br /&gt;
&lt;br /&gt;
== Project Status ==&lt;br /&gt;
&lt;br /&gt;
PyOGP is moving to bitbucket! http://bitbucket.org/enus_linden/ &lt;br /&gt;
&lt;br /&gt;
Thanks for the patience as we make this transition.&lt;br /&gt;
&lt;br /&gt;
Keep track of progress on the list: https://lists.secondlife.com/cgi-bin/mailman/listinfo/pyogp.&lt;br /&gt;
&lt;br /&gt;
== Pic of the Moment ==&lt;br /&gt;
[[Image:355571.jpg|900x835px|the EnusBots are coming!]]&lt;br /&gt;
&lt;br /&gt;
Image used with permission. Taken by [[User:Opensource_Obscure|Opensource Obscure]]. (thanks oo! &amp;lt;3)&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
Contributions to Pyogp are subject to Linden Lab&#039;s [http://secondlifegrid.net/programs/open_source/submission contributor agreement]. The Pyogp open source code is made available subject to the Apache v2 license. Read more at [http://opensource.org/licenses/apache2.0.php opensource.org] and [http://www.apache.org/licenses/LICENSE-2.0 apache.org].&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;excerpt&amp;gt;&lt;br /&gt;
  Copyright 2008, Linden Research, Inc.&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
  you may not use this file except in compliance with the License.&lt;br /&gt;
  You may obtain a copy of the License at&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
  distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
  See the License for the specific language governing permissions and&lt;br /&gt;
  limitations under the License.&lt;br /&gt;
  &amp;lt;/excerpt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Linden Lab and the [[AWG]] ([[AW_Groupies|in-world discussion group page]]) are working together to develop a set of open protocols called the [[Open Grid Protocol]] that can be used to create a virtual world where regions are independently operated (not only by Linden Lab). The project is aiming to allow people (organizations, individuals, and the like) to host their own regions in the virtual world and be able to interact and communicate with people in regions hosted elsewhere. In essence, the project&#039;s goal is to allow open-source region hosting.&lt;br /&gt;
&lt;br /&gt;
AWG and Linden Lab plan to share the effort in writing a test harness that executes tests against implementations of the Open Grid Protocol. &lt;br /&gt;
&lt;br /&gt;
The intent is not to test SL or OpenSim (or gridX) themselves. Rather, the desire is to create a framework where the implementations of the protocols can be tested in any virtual environment implemented per the Open Grid Protocols as documented. The goal is to use the test harness to test the implementations to make sure that the virtual environment is interoperable with the other virtual environments that have implemented the OGP. However, we also plan to test the current SL protocols (the Legacy protocols). We plan to be able to test at the smallest functional level possible, akin to unit testing, and to have the ability to use the framework to sequence steps to enable state specific tests to be run.&lt;br /&gt;
&lt;br /&gt;
The longer-term vision is essentially a [[Pyogp_Client_Lib|client library]], capable of navigating the grid and interacting with the various hosts, sitting next to a testing framework, happily running along telling us what works where, and where something needs a little attention to work according to specification...&lt;br /&gt;
&lt;br /&gt;
For more detail on OGP, see a visual representation of the upcoming [[Open Grid Platform Projects Q2-Q3|projects]] and a general [[Structural Design Overview|introduction]].&lt;br /&gt;
&lt;br /&gt;
=== Notes from the kickoff meeting ===&lt;br /&gt;
&lt;br /&gt;
At the AWG meeting held April 29, 2008, we discussed what a test harness could look like that would be used to test the agent-domain, rez-avatar, and overall work being done implementing the open grid protocols. I&#039;d like to summarize, and continue the discussion on the mailing list, in-world, and on the wiki. See [[AWGroupies-2008-04-29|meeting chat log]].&lt;br /&gt;
&lt;br /&gt;
How do we start?&lt;br /&gt;
&lt;br /&gt;
Let&#039;s work on defining the test harness components (from the meeting):&lt;br /&gt;
# Login&lt;br /&gt;
# Caps (and while it&#039;s around the UDP pipe)&lt;br /&gt;
# Message Handlers (see chttp)&lt;br /&gt;
# Basic web server parts for the Agent, Region and grid bits (ideally a snap in framework)&lt;br /&gt;
# Test framework&lt;br /&gt;
# Test data (I put this here, not really as a component of the harness, more as a &amp;quot;i&#039;m not telling you my test account&#039;s password and what are we gonna do about it&amp;quot; thing)&lt;br /&gt;
&lt;br /&gt;
Python seems to be the flavor of choice here, with a requirement that it accommodate non-python components as needed. The repository for the code is proposed to be maintained by Linden Lab, distributed as an open source export, under the Apache v2 License (see http://opensource.org/licenses/apache2.0.php). The process and details here are tentative, and need more attention...&lt;br /&gt;
&lt;br /&gt;
There is plenty to be figured out. How to start, who wants to play, details are all TBD. My role is primarily intended as one who will facilitate dialogue and contribute as much as possible, but this is intended as a joint effort.&lt;br /&gt;
&lt;br /&gt;
-- Enus Linden&lt;br /&gt;
&lt;br /&gt;
[[Category:Architecture Working Group]]&lt;br /&gt;
[[Category:Grid_Interoperability]]&lt;br /&gt;
[[Category: Pyogp|*]]&lt;br /&gt;
[[Category:Pyogp_Kitchen_Sink]]&lt;br /&gt;
[[Category: AW Groupies]]&lt;br /&gt;
[[Category:Automated Testing]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP&amp;diff=679162</id>
		<title>PyOGP</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP&amp;diff=679162"/>
		<updated>2009-12-03T21:13:35Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* Project Status */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
=== What Is It? ===&lt;br /&gt;
&lt;br /&gt;
Pyogp is an open source project between Linden Lab and the [[AWG|Architecture Working Group (AWG)]] to support testing the [[Open Grid Protocol|Open Grid Protocol (OGP)]]. Written in Python, Pyogp will consist initially of a [[Pyogp/Documentation/Specification/pyogp.lib.base|client library]] and [[Pyogp/Documentation/Specification/pyogp.interop|test functionality]] to enable testing OGP-enabled virtual worlds such as Second Life and compatible OpenSim implementations. These components will expand as the effort matures.&lt;br /&gt;
&lt;br /&gt;
PyOGP could be useful for:&lt;br /&gt;
* checking your software&#039;s compliance with the OGP&lt;br /&gt;
* quickly writing tests for software which communicates using LLMessageSystem-like messages&lt;br /&gt;
* demonstrating protocol proposals&lt;br /&gt;
&lt;br /&gt;
=== Getting Started ===&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP Client Library Development Sandbox]] for instructions on how to starting using Pyogp.&lt;br /&gt;
See also [[PyOGP Client Library]] for a more up-to-date page.&lt;br /&gt;
&lt;br /&gt;
=== How To Contribute ===&lt;br /&gt;
* Source: [[Pyogp/Client_Lib/The_Development_Sandbox | Checkout Instructions]]. See the [[Open_Source_Portal|Open Source Portal]] for details on being a contributor&lt;br /&gt;
** If all you want to do is glance at the source code, use the [https://svn.secondlife.com/svn/linden/projects/2008/pyogp/ browser link to the repository]&lt;br /&gt;
* in-world group: pyogp (open enrollement)&lt;br /&gt;
* IRC: irc://irc.freenode.com/#pyogp&lt;br /&gt;
* Mailing list: https://lists.secondlife.com/cgi-bin/mailman/listinfo/pyogp, pyogp@lists.secondlife.com&lt;br /&gt;
* Jira: http://jira.secondlife.com/browse/PYO&lt;br /&gt;
* Related Meetings&lt;br /&gt;
** Enus Linden&#039;s office hours: Friday @ 1:00 http://slurl.com/secondlife/Longfellow/99/97/28&lt;br /&gt;
&lt;br /&gt;
== Project Status ==&lt;br /&gt;
&lt;br /&gt;
PyOGP is moving to bitbucket! http://bitbucket.org/enus_linden/ Thanks for the patience as we make this transition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Keep track of progress on the list: https://lists.secondlife.com/cgi-bin/mailman/listinfo/pyogp.&lt;br /&gt;
&lt;br /&gt;
== Pic of the Moment ==&lt;br /&gt;
[[Image:355571.jpg|900x835px|the EnusBots are coming!]]&lt;br /&gt;
&lt;br /&gt;
Image used with permission. Taken by [[User:Opensource_Obscure|Opensource Obscure]]. (thanks oo! &amp;lt;3)&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
Contributions to Pyogp are subject to Linden Lab&#039;s [http://secondlifegrid.net/programs/open_source/submission contributor agreement]. The Pyogp open source code is made available subject to the Apache v2 license. Read more at [http://opensource.org/licenses/apache2.0.php opensource.org] and [http://www.apache.org/licenses/LICENSE-2.0 apache.org].&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;excerpt&amp;gt;&lt;br /&gt;
  Copyright 2008, Linden Research, Inc.&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
  you may not use this file except in compliance with the License.&lt;br /&gt;
  You may obtain a copy of the License at&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
  &amp;lt;br&amp;gt;&lt;br /&gt;
  Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
  distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
  See the License for the specific language governing permissions and&lt;br /&gt;
  limitations under the License.&lt;br /&gt;
  &amp;lt;/excerpt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
Linden Lab and the [[AWG]] ([[AW_Groupies|in-world discussion group page]]) are working together to develop a set of open protocols called the [[Open Grid Protocol]] that can be used to create a virtual world where regions are independently operated (not only by Linden Lab). The project is aiming to allow people (organizations, individuals, and the like) to host their own regions in the virtual world and be able to interact and communicate with people in regions hosted elsewhere. In essence, the project&#039;s goal is to allow open-source region hosting.&lt;br /&gt;
&lt;br /&gt;
AWG and Linden Lab plan to share the effort in writing a test harness that executes tests against implementations of the Open Grid Protocol. &lt;br /&gt;
&lt;br /&gt;
The intent is not to test SL or OpenSim (or gridX) themselves. Rather, the desire is to create a framework where the implementations of the protocols can be tested in any virtual environment implemented per the Open Grid Protocols as documented. The goal is to use the test harness to test the implementations to make sure that the virtual environment is interoperable with the other virtual environments that have implemented the OGP. However, we also plan to test the current SL protocols (the Legacy protocols). We plan to be able to test at the smallest functional level possible, akin to unit testing, and to have the ability to use the framework to sequence steps to enable state specific tests to be run.&lt;br /&gt;
&lt;br /&gt;
The longer-term vision is essentially a [[Pyogp_Client_Lib|client library]], capable of navigating the grid and interacting with the various hosts, sitting next to a testing framework, happily running along telling us what works where, and where something needs a little attention to work according to specification...&lt;br /&gt;
&lt;br /&gt;
For more detail on OGP, see a visual representation of the upcoming [[Open Grid Platform Projects Q2-Q3|projects]] and a general [[Structural Design Overview|introduction]].&lt;br /&gt;
&lt;br /&gt;
=== Notes from the kickoff meeting ===&lt;br /&gt;
&lt;br /&gt;
At the AWG meeting held April 29, 2008, we discussed what a test harness could look like that would be used to test the agent-domain, rez-avatar, and overall work being done implementing the open grid protocols. I&#039;d like to summarize, and continue the discussion on the mailing list, in-world, and on the wiki. See [[AWGroupies-2008-04-29|meeting chat log]].&lt;br /&gt;
&lt;br /&gt;
How do we start?&lt;br /&gt;
&lt;br /&gt;
Let&#039;s work on defining the test harness components (from the meeting):&lt;br /&gt;
# Login&lt;br /&gt;
# Caps (and while it&#039;s around the UDP pipe)&lt;br /&gt;
# Message Handlers (see chttp)&lt;br /&gt;
# Basic web server parts for the Agent, Region and grid bits (ideally a snap in framework)&lt;br /&gt;
# Test framework&lt;br /&gt;
# Test data (I put this here, not really as a component of the harness, more as a &amp;quot;i&#039;m not telling you my test account&#039;s password and what are we gonna do about it&amp;quot; thing)&lt;br /&gt;
&lt;br /&gt;
Python seems to be the flavor of choice here, with a requirement that it accommodate non-python components as needed. The repository for the code is proposed to be maintained by Linden Lab, distributed as an open source export, under the Apache v2 License (see http://opensource.org/licenses/apache2.0.php). The process and details here are tentative, and need more attention...&lt;br /&gt;
&lt;br /&gt;
There is plenty to be figured out. How to start, who wants to play, details are all TBD. My role is primarily intended as one who will facilitate dialogue and contribute as much as possible, but this is intended as a joint effort.&lt;br /&gt;
&lt;br /&gt;
-- Enus Linden&lt;br /&gt;
&lt;br /&gt;
[[Category:Architecture Working Group]]&lt;br /&gt;
[[Category:Grid_Interoperability]]&lt;br /&gt;
[[Category: Pyogp|*]]&lt;br /&gt;
[[Category:Pyogp_Kitchen_Sink]]&lt;br /&gt;
[[Category: AW Groupies]]&lt;br /&gt;
[[Category:Automated Testing]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library&amp;diff=609083</id>
		<title>PyOGP Client Library</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library&amp;diff=609083"/>
		<updated>2009-10-20T07:17:57Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* Goals */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
PyOGP is a young, open source, python client library which provides an interface to an agent (client) of a Second Life grid. The code aims to enable automated testing of Second Life grids, to encourage and enable exploration into the client/server relationship and related protocols of Second Life, and to make possible simple prototyping of various client applications.&lt;br /&gt;
&lt;br /&gt;
Hosted on svn.secondlife.com, it does require a contributor&#039;s agreement for commit access, and currently has a few contributors from the Second Life open source community.&lt;br /&gt;
&lt;br /&gt;
P.S. We&#039;ll likely be moving to hg relatively soon...&lt;br /&gt;
&lt;br /&gt;
* mailing list: pyogp@lists.secondlife.com&lt;br /&gt;
* irc: irc://irc.freenode.com/#pyogp&lt;br /&gt;
* wiki: http://wiki.secondlife.com/wiki/Pyogp&lt;br /&gt;
* licensing: Apache 2.0 license, copyright Linden Lab&lt;br /&gt;
&lt;br /&gt;
=== Goals ===&lt;br /&gt;
&lt;br /&gt;
In the very near future, we can have tests available to be run as soon as a deploy is completed that exercise a simulator/grid in the same way we do a smoke test. We will use these as automated tests run at build time, post deploy validation, and regression testing of simulators and backend systems.&lt;br /&gt;
&lt;br /&gt;
This provides early feedback on code quality. QA is then able to dive deeper in testing the changes specific to a branch. &lt;br /&gt;
&lt;br /&gt;
Having this library available also allows us to test potential changes before we have finalized design and are ready to submit to QA. Not sure how something will play out? Try it, and test it with PyOGP....&lt;br /&gt;
&lt;br /&gt;
=== A Brief History ===&lt;br /&gt;
&lt;br /&gt;
PyOGP was originally created as a tool for testing [[OGP]] related changes to the Second Life grid. By the end of the summer in 2008, the &#039;&#039;&#039;pyogp.lib.base&#039;&#039;&#039; package provided a skeleton messaging system and was able to test Linden Lab&#039;s first implementation of an agent domain and the related changes in an agent&#039;s region handoff and teleport. As the development effort around OGP waned, we started to extend pyogp by adding higher level client related functionality. Recently, this functionality was split out into a separate python package (&#039;&#039;&#039;pyogp.lib.client&#039;&#039;&#039;), and sample scripts (and future apps) were moved into &#039;&#039;&#039;pyogp.apps&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Architecture Overview==&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
&lt;br /&gt;
PyOGP is comprised of three python packages. The library consists of pyogp.lib.base and pyogp.lib.client, while sample scripts, and in time applications, live in pyogp.apps. &lt;br /&gt;
:&#039;&#039;&#039;pyogp.lib.base&#039;&#039;&#039; - consists of basic networking, messaging systems (UDP and event queue) and capabilities, custom datatypes, and a low level message related event system&lt;br /&gt;
:&#039;&#039;&#039;pyogp.lib.client&#039;&#039;&#039; - consists of &#039;convenience&#039; classes mapping methods and handlers to specific messages (e.g. Agent().say(msg) tells the client to send the ChatFromViewer message to the host region). Raises application oriented events based on processing of messages (these are currently sparsely implemented)&lt;br /&gt;
:&#039;&#039;&#039;pyogp.apps&#039;&#039;&#039; - sample scripts and works in progress, the scripts here generally illustrate simple usage of classes as related to in world interactions by an agent of a Second Life grid&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
==== Platform / Python version compatibility ====&lt;br /&gt;
&lt;br /&gt;
PyOGP aims to be compatible across platforms, though there are known problems with various environments. We&#039;ll be focusing on ensuring better compatibility soon.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Known good configurations&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:Windows XP + Python 2.5&lt;br /&gt;
:Mac + Python 2.5, 2.6&lt;br /&gt;
:Linux + Python 2.4, 2.5, 2.6 (Linden hosts fall into this group) &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Known bad configurations&#039;&#039;&#039;&lt;br /&gt;
:Windows Vista + Python 2.6&lt;br /&gt;
:Windows 7 + Python 2.6&lt;br /&gt;
&lt;br /&gt;
There have been challenges in ensuring compatibility between the various dependencies, largely due to greenlet, eventlet, and pyopenssl. Please report bugs on [http://jira.secondlife.com/browse/PYO pJira]&lt;br /&gt;
&lt;br /&gt;
==== Python module dependencies ====&lt;br /&gt;
&lt;br /&gt;
The packages that make up PyOGP have some dependencies on python modules not included in a standard install, or sometimes not available on an older Python distribution.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;pyogp.lib.base dependencies:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;  #from setup.py&lt;br /&gt;
  &lt;br /&gt;
     install_requires=[&lt;br /&gt;
         &#039;setuptools&#039;,&lt;br /&gt;
         # -*- Extra requirements: -*-&lt;br /&gt;
         &#039;uuid&#039;,&lt;br /&gt;
         &#039;elementtree&#039;,&lt;br /&gt;
         &#039;indra.base&#039;,&lt;br /&gt;
         &#039;WebOb&#039;,&lt;br /&gt;
         &#039;wsgiref&#039;,&lt;br /&gt;
         &#039;eventlet==0.8.14&#039;&lt;br /&gt;
         ]&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;pyogp.lib.client dependencies:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;     install_requires=[&lt;br /&gt;
         &#039;setuptools&#039;,&lt;br /&gt;
         # -*- Extra requirements: -*-&lt;br /&gt;
         &#039;pyogp.lib.base&#039;&lt;br /&gt;
         ] &amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;pyogp.apps dependencies:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;     install_requires=[&lt;br /&gt;
         &#039;setuptools&#039;,&lt;br /&gt;
         &#039;pyogp.lib.client&#039;&lt;br /&gt;
         ]&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== How to install ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Lindens can see internal documentation for more specific guidance. https://wiki.lindenlab.com/wiki/Pyogp#How_to_Install&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Standalone dev environment using buildout ====&lt;br /&gt;
&lt;br /&gt;
Buildout is a type of Python development environment, organizing and configuring various components and their dependencies. On a desktop, one may checkout such an environment for working with PyOGP. One may optionally use a virtualenv Python environment to isolate the development code and it&#039;s runtime environment on one&#039;s host.&lt;br /&gt;
&lt;br /&gt;
Dependencies: buildout takes care of everything, grabbing needed modules etc.&lt;br /&gt;
&lt;br /&gt;
Wiki instructions: https://wiki.secondlife.com/wiki/Pyogp/Client_Lib/The_Development_Sandbox&lt;br /&gt;
&lt;br /&gt;
==== Installing the PyOGP packages ====&lt;br /&gt;
&lt;br /&gt;
Each of the PyOGP package may be installed to one&#039;s Python install or to a [http://pypi.python.org/pypi/virtualenv virtualenv]. &#039;&#039;&#039;Buyer beware&#039;&#039;&#039; if installing into your system&#039;s install: you&#039;ll want to be able to uninstall manually, as we haven&#039;t hooked up the uninstall. PyOGP is still coming up to speed with respect to distutils and pypi and the like, but it&#039;s relatively close now.&lt;br /&gt;
&lt;br /&gt;
To install a package, simply run &#039;python setup.py install&#039; in a package&#039;s root.&lt;br /&gt;
&lt;br /&gt;
==== Referencing PyOGP packages via the PATH ====&lt;br /&gt;
&lt;br /&gt;
Source code can be referenced directly if one simply ensures that a package, and it&#039;s dependencies, are available in the PYTHONPATH environmental variable.&lt;br /&gt;
&lt;br /&gt;
== Current functional coverage ==&lt;br /&gt;
&lt;br /&gt;
Anything not listed as covered is probably not yet covered.&lt;br /&gt;
&lt;br /&gt;
pyogp.lib.base:&lt;br /&gt;
:* base udp messaging system (message.*)&lt;br /&gt;
:** UDP serialization/deserialization&lt;br /&gt;
:** message_template.msg parsing &lt;br /&gt;
:* base event queue messaging system (event_queue.EventQueueClient())&lt;br /&gt;
:* capabilities and their methods. Seed capabilities are a special case. (caps.Capability())&lt;br /&gt;
:* Message-based events (message.message_handler)&lt;br /&gt;
&lt;br /&gt;
pyogp.lib.client:&lt;br /&gt;
:* agents (agent.Agent())&lt;br /&gt;
:** L$ balance request, friending, and walk/fly/sit/stand actions...&lt;br /&gt;
:* OGP agentdomain (agentdomain.AgentDomain())&lt;br /&gt;
:* application level events (event_system.AppEventsHandler())&lt;br /&gt;
:* some object handling (objects.*)&lt;br /&gt;
:** edit name, description, next-owner permissions and more&lt;br /&gt;
:** object creation is possible&lt;br /&gt;
:* some inventory handling (inventory.*)&lt;br /&gt;
:** login inv skeletons&lt;br /&gt;
:** fetching inventory, including AIS (caps based Agent Inventory Services))&lt;br /&gt;
:** some creating of new inventory items (LSL scripts, notecards)&lt;br /&gt;
:* regions (region.Region())&lt;br /&gt;
:** host and neighboring regions are handled slightly differently&lt;br /&gt;
:** udp and event queue connections are optionally enabled for each case&lt;br /&gt;
:** currently only pulling caps available to the agent via the seed cap (plus using the inventory related caps in the AIS context)&lt;br /&gt;
:* some appearance handling (appearance.AppearanceManager), &lt;br /&gt;
:* parcels&lt;br /&gt;
:* chat&lt;br /&gt;
:* some ImprovedInstantMessage handling&lt;br /&gt;
:** raises events on received instant messages&lt;br /&gt;
:** can deal with inventory offers/accepts/declines&lt;br /&gt;
:** other cases in this message are currently only logged&lt;br /&gt;
:* groups&lt;br /&gt;
:* group chat&lt;br /&gt;
:* LSL script uploading&lt;br /&gt;
&lt;br /&gt;
=== Sample Scripts ===&lt;br /&gt;
&lt;br /&gt;
There are a variety of scripted examples that have been used to exercise and test functionality as it is added to the library. These persist as coded documentation.&lt;br /&gt;
&lt;br /&gt;
The source code is available in https://svn.secondlife.com/svn/linden/projects/2008/pyogp/pyogp.apps/trunk/pyogp/apps/examples/.&lt;br /&gt;
&lt;br /&gt;
The following refers to a buildout context. If one installs pyogp.apps vi setup.py, these scripts will exist in the python environment&#039;s bin/ directory. In the buildout context, these scripts are available in {buildout root}/bin.&lt;br /&gt;
&lt;br /&gt;
The scripts are derived from a package&#039;s &#039;setup.py&#039; via the entry_points parameter, and essentially build executable Python scripts configured to run in the correct environment with the proper dependencies added the the path used by the script. These scripts are currently just simple illustrations of some uses of the PyOGP codebase.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;  #the current entry_points in setup.py og pyogp.apps:&lt;br /&gt;
  &lt;br /&gt;
     entry_points={&lt;br /&gt;
         &#039;console_scripts&#039;: [&lt;br /&gt;
             &#039;AIS_inventory_handling = pyogp.apps.examples.AIS_inventory_handling:main&#039;,&lt;br /&gt;
             &#039;agent_login = pyogp.apps.examples.agent_login:main&#039;,&lt;br /&gt;
             &#039;agent_manager = pyogp.apps.examples.agent_manager:main&#039;,&lt;br /&gt;
             &#039;appearance_management = pyogp.apps.examples.appearance_management:main&#039;,&lt;br /&gt;
             &#039;chat_and_instant_messaging = pyogp.apps.examples.chat_and_instant_messaging:main&#039;,&lt;br /&gt;
             &#039;group_chat = pyogp.apps.examples.group_chat:main&#039;,&lt;br /&gt;
             &#039;group_creation = pyogp.apps.examples.group_creation:main&#039;,&lt;br /&gt;
             &#039;inventory_handling = pyogp.apps.examples.inventory_handling:main&#039;,&lt;br /&gt;
             &#039;inventory_transfer = pyogp.apps.examples.inventory_transfer:main&#039;,&lt;br /&gt;
             &#039;inventory_transfer_specify_agent = pyogp.apps.examples.inventory_transfer_specify_agent:main&#039;,&lt;br /&gt;
             &#039;login = pyogp.apps.examples.login:main&#039;,&lt;br /&gt;
             &#039;multi_region_connect = pyogp.apps.examples.multi_region_connect:main&#039;,&lt;br /&gt;
             &#039;object_create_edit = pyogp.apps.examples.object_create_edit:main&#039;,&lt;br /&gt;
             &#039;object_create_permissions = pyogp.apps.examples.object_create_permissions:main&#039;,&lt;br /&gt;
             &#039;object_create_rez_script = pyogp.apps.examples.object_create_rez_script:main&#039;,&lt;br /&gt;
             &#039;object_creation = pyogp.apps.examples.object_creation:main&#039;,&lt;br /&gt;
             &#039;object_properties = pyogp.apps.examples.object_properties:main&#039;,&lt;br /&gt;
             &#039;object_tracking = pyogp.apps.examples.object_tracking:main&#039;,&lt;br /&gt;
             &#039;parcel_management = pyogp.apps.examples.parcel_management:main&#039;,&lt;br /&gt;
             &#039;parse_packets = pyogp.apps.examples.parse_packets:main&#039;,&lt;br /&gt;
             &#039;region_connect = pyogp.apps.examples.region_connect:main&#039;,&lt;br /&gt;
             &#039;smoke_test = pyogp.apps.examples.smoke_test:main&#039;,&lt;br /&gt;
             &#039;chat = pyogp.apps.examples.chat_interface:main&#039;,&lt;br /&gt;
             ]&lt;br /&gt;
        }&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How it Works (High Level) ==&lt;br /&gt;
&lt;br /&gt;
=== Eventlet ===&lt;br /&gt;
&lt;br /&gt;
PyOGP use [[Eventlet]] to run coroutines to handle multiple &#039;concurrent&#039; processes, rather than threads or multiple processes. Each client agent instance will spawn a handful of coroutines to handles e.g. the UDP pipe, the Event Queue, various monitors, while yielding time to the parent process which should ensure it yields to the other routines as well.&lt;br /&gt;
&lt;br /&gt;
PyOGP uses eventlet in very elementary ways at this point, but will perhaps start to use blocking queues in some cases, so that the coroutine only is allocated processing time if there is work for it to do.&lt;br /&gt;
&lt;br /&gt;
=== pyogp.lib.base ===&lt;br /&gt;
&lt;br /&gt;
This package handles the protocols used when communicating with a Second Life grid. A high level perspective on the package reveals a MessageManager() (still in development) which provides an interface to the UDP and Event Queue connections, as well as basic networking with enables login and capabilities interactions. The base package also has a low level even system through which all messages are passed and sent to subscribers.&lt;br /&gt;
&lt;br /&gt;
Any subcomponent is available for direct interaction at any time, the MessageManager() and the MessageHandler() are the simple access points.&lt;br /&gt;
&lt;br /&gt;
==== Events &amp;amp; Callbacks ====&lt;br /&gt;
&lt;br /&gt;
The event implementation in pyogp follows the observer pattern, where observers subscribe to and are notified when an event occurs. Data is passed throughout the client instance via events. &lt;br /&gt;
&lt;br /&gt;
* MessageManager - is an attribute of a Region and every packet received/sent is filtered through here. subscriptions are by message name&lt;br /&gt;
** MessageHandler - is an attribute of MessageManager, and every categorized message received from the event queue or udp dispatcher is filtered through here. (message as defined in message_template.msg, or one of [&#039;ChatterBoxInvitation&#039;, &#039;ChatterBoxSessionEventReply&#039;, &#039;ChatterBoxSessionAgentListUpdates&#039;, &#039;ChatterBoxSessionStartReply&#039;, &#039;EstablishAgentCommunication&#039;]. There may be unhandled messages, I just haven&#039;t seen em yet :))&lt;br /&gt;
&lt;br /&gt;
===== Message Events =====&lt;br /&gt;
&lt;br /&gt;
In the most fundamental implementation of event usage, all packets are passed through a MessageManager() instance for evaluation. Observers may register to receive udp packets serialized into the form of Message() instances. The MessageHandler() is a consolidation point for subscribing to messages keyed by message name, and created on demand via subscription.&lt;br /&gt;
&lt;br /&gt;
See pyogp.lib.base.message.message_handler.MessageHandler() for more details.&lt;br /&gt;
&lt;br /&gt;
The pyogp agent&#039;s Region() instances each monitor their stream of packets (e.g. the host region: agent.region.message_manager.message_handler). (Perhaps this should be changed to a generalized Network() class where all packets (coupled to their originating regions) are evaluated.&lt;br /&gt;
&lt;br /&gt;
Event firing passes data on to a callback handler defined in the subscription, in the form of (handler, *args, **kwargs).&lt;br /&gt;
&lt;br /&gt;
The Agent class monitors the ImprovedInstantMessage packet:&lt;br /&gt;
&amp;lt;python&amp;gt;        onImprovedInstantMessage_received = self.region.message_handler.register(&#039;ImprovedInstantMessage&#039;)&lt;br /&gt;
        onImprovedInstantMessage_received.subscribe(self.onImprovedInstantMessage)&lt;br /&gt;
&lt;br /&gt;
    def onImprovedInstantMessage(self, packet):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot; handles the many cases of data being passed in this message &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        {code} # parse and handle the data...&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The messaging system then fires the event when an ImprovedInstantMessage message is received, which calls onImprovedInstantMessage method above to handle the message contents. Multiple subscribers may be listening for any message related event, and each would be notified of the same Message() instance.&lt;br /&gt;
&lt;br /&gt;
Unsubscribing from an event:&lt;br /&gt;
&amp;lt;python&amp;gt;        onImprovedInstantMessage_received.unsubscribe(self.onImprovedInstantMessage)&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are various event and callback implementations viewable in pyogp, poke around and help consolidate things if you like.&lt;br /&gt;
&lt;br /&gt;
=== pyogp.lib.client ===&lt;br /&gt;
&lt;br /&gt;
The client package generally provides a convenient interface to initiate or interpret interactions with host region (or neighboring regions). By listening to the messaging related event system in pyogp.lib.base, the client package interprets the messages that come in off the wire, and executes business logic in building responses. pyogp.lib.client also provides simple methods to enable the ending of messages to a grid.&lt;br /&gt;
&lt;br /&gt;
==== Events ====&lt;br /&gt;
&lt;br /&gt;
* EventsHandler - an attribute of an Agent, also able to be passed in, that is intended as the primary interface of a pyogp application into the internal state and data events within the lib. This system uses the same base classes as used by the MessageHandler() in the base package, and the descriptions about events and callbacks above apply here as well. The api for subscribing to these events is similar to the MessageHandler(), with an additional timeout parameter passed in the _register() method. When the specified timeout expires, the subscription returns None and expires the subscription.&lt;br /&gt;
&lt;br /&gt;
==== Agent Login (examples) ====&lt;br /&gt;
&lt;br /&gt;
===== Single Agent Login &amp;amp; Chat=====&lt;br /&gt;
&lt;br /&gt;
Spawn a client in a co-routine, allowing persistent presence until forcefully terminated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;from eventlet import api&lt;br /&gt;
&lt;br /&gt;
from pyogp.lib.client.agent import Agent&lt;br /&gt;
from pyogp.lib.client.settings import Settings&lt;br /&gt;
&lt;br /&gt;
settings = Settings()&lt;br /&gt;
&lt;br /&gt;
settings.ENABLE_INVENTORY_MANAGEMENT = True&lt;br /&gt;
settings.MULTIPLE_SIM_CONNECTIONS = False&lt;br /&gt;
&lt;br /&gt;
client = Agent(settings = settings)&lt;br /&gt;
&lt;br /&gt;
api.spawn(client.login, options.loginuri, &#039;first&#039;, &#039;last&#039;, &#039;password&#039;, start_location = options.region)&lt;br /&gt;
&lt;br /&gt;
# wait for the agent to connect to it&#039;s region&lt;br /&gt;
while client.connected == False:&lt;br /&gt;
    api.sleep(0)&lt;br /&gt;
&lt;br /&gt;
while client.region.connected == False:&lt;br /&gt;
    api.sleep(0)&lt;br /&gt;
&lt;br /&gt;
client.say(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# once connected, live until someone kills me&lt;br /&gt;
while client.running:&lt;br /&gt;
    api.sleep(0)&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Multiple Agent Login =====&lt;br /&gt;
&lt;br /&gt;
Each agent instance in logged in in a separate coroutine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;from pyogp.lib.client.agent import Agent&lt;br /&gt;
from pyogp.lib.client.agentmanager import AgentManager&lt;br /&gt;
&lt;br /&gt;
clients = [[&#039;agent1&#039;, &#039;lastname&#039;, &#039;password&#039;], [&#039;agent2&#039;, &#039;lastname&#039;, &#039;password&#039;]]&lt;br /&gt;
agents = []&lt;br /&gt;
&lt;br /&gt;
# prime the Agent instances&lt;br /&gt;
for params in clients:&lt;br /&gt;
    agents.append(Agent(settings, params[0], params[1], params[2]))&lt;br /&gt;
&lt;br /&gt;
agentmanager = AgentManager()&lt;br /&gt;
agentmanager.initialize(agents)&lt;br /&gt;
&lt;br /&gt;
# log them in&lt;br /&gt;
for key in agentmanager.agents:&lt;br /&gt;
    agentmanager.login(key, options.loginuri, options.region)&lt;br /&gt;
&lt;br /&gt;
# while they are connected, stay alive&lt;br /&gt;
while agentmanager.has_agents_running():&lt;br /&gt;
    api.sleep(0)&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extending Functionality ==&lt;br /&gt;
&lt;br /&gt;
While the implementations and structures in pyogp.lib.base can (and are in the process of) being refactored to improve performance or usability, it is a fairly complete package. &lt;br /&gt;
&lt;br /&gt;
The functional coverage PyOGP provides on the other hand is not complete, and there are a variety of needs to complete the implementation in pyogp.lib.base. We need to improve coverage of message handling (dealing with messages sent to the client), add more wrappers for sending various messages and performing multistep tasks (to simplify the initiation of interactions with the region), and we need to raise more application level events in the client package so that applications have easy access to incoming data. &lt;br /&gt;
&lt;br /&gt;
=== Sending Messages ===&lt;br /&gt;
&lt;br /&gt;
PyOGP, like the Viewer, communicates with the Second Life simulator by sending messages over UDP. &lt;br /&gt;
&lt;br /&gt;
In order to extend PyOGP, you&#039;ll build a representation of a new UDP message, and send it through the pyogp.lib.base modules for serialization and wire handling.&lt;br /&gt;
&lt;br /&gt;
=== Example: Sending an IM ===&lt;br /&gt;
&lt;br /&gt;
To send an IM to the simulator, send an ImprovedInstantMessage packet.  The base class for message packets is defined in &amp;lt;code&amp;gt;base/message/message.py&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Packets are assembled using a Message() instance which has the message name and Block() instances passed in through its constructor.  Similarly, Blocks are assembled by passing in the Block name and the value name and values for each of the Block values. (The ability to build Message() instances via an llsd payload is expected to be introduced soon.)&lt;br /&gt;
&lt;br /&gt;
Note: It is important that the message name, block name, and value names and types should match what is specified in the message template. (It is also possible to manipulate the representation of the stored template, or to use a custom message template.)&lt;br /&gt;
 &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;python&amp;gt;    def send_ImprovedInstantMessage(self, AgentID = None, SessionID = None, &lt;br /&gt;
                                FromGroup = None, ToAgentID = None, &lt;br /&gt;
                                ParentEstateID = None, RegionID = None, &lt;br /&gt;
                                Position = None, Offline = None, &lt;br /&gt;
                                Dialog = None, _ID = None, Timestamp = None, &lt;br /&gt;
                                FromAgentName = None, _Message = None, &lt;br /&gt;
                                BinaryBucket = None):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot; &lt;br /&gt;
        sends an instant message packet to ToAgentID. this is a &lt;br /&gt;
        multi-purpose message for inventory offer handling, im, group chat, &lt;br /&gt;
        and more &lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        packet = Message(&#039;ImprovedInstantMessage&#039;, &lt;br /&gt;
                         Block(&#039;AgentData&#039;, &lt;br /&gt;
                               AgentID = AgentID, &lt;br /&gt;
                               SessionID = SessionID), &lt;br /&gt;
                         Block(&#039;MessageBlock&#039;, &lt;br /&gt;
                               FromGroup = FromGroup, &lt;br /&gt;
                               ToAgentID = ToAgentID, &lt;br /&gt;
                               ParentEstateID = ParentEstateID, &lt;br /&gt;
                               RegionID = RegionID, &lt;br /&gt;
                               Position = Position, &lt;br /&gt;
                               Offline = Offline, &lt;br /&gt;
                               Dialog = Dialog, &lt;br /&gt;
                               ID = UUID(str(_ID)), &lt;br /&gt;
                               Timestamp = Timestamp, &lt;br /&gt;
                               FromAgentName = FromAgentName, &lt;br /&gt;
                               Message = _Message, &lt;br /&gt;
                               BinaryBucket = BinaryBucket))&lt;br /&gt;
&lt;br /&gt;
        # Send the message:&lt;br /&gt;
        self.region.enqueue_message(packet, True)&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling Incoming Messages and Raising an Event ===&lt;br /&gt;
&lt;br /&gt;
To listen for when messages of a particular type are sent to the client instance, subscribe to the MessageHandler() on the host region&#039;s MessageManager(), like the example that follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;        onImprovedInstantMessage_received = self.region.message_handler.register(&#039;ImprovedInstantMessage&#039;)&lt;br /&gt;
        onImprovedInstantMessage_received.subscribe(self.onImprovedInstantMessage)&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When the event is fired upon receipt of the message matching the name, the specified callback handles the data passed along, and in this case raises an event notifying observers of the &#039;InstantMessageReceived&#039; event in pyogp.lib.client of the important data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;    def onImprovedInstantMessage(self, packet):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot; callback handler for received ImprovedInstantMessage messages. much is passed in this message, and handling the data is only partially implemented &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        Dialog = packet.blocks[&#039;MessageBlock&#039;][0].get_variable(&#039;Dialog&#039;).data&lt;br /&gt;
        FromAgentID = packet.blocks[&#039;AgentData&#039;][0].get_variable(&#039;AgentID&#039;).data&lt;br /&gt;
&lt;br /&gt;
        if Dialog == ImprovedIMDialogue.InventoryOffered:&lt;br /&gt;
&lt;br /&gt;
            self.inventory.handle_inventory_offer(packet)&lt;br /&gt;
&lt;br /&gt;
        # ...&lt;br /&gt;
        # some of the Dialogue types this message can contain are handled, we are showing 2&lt;br /&gt;
        # ...&lt;br /&gt;
&lt;br /&gt;
        elif Dialog == ImprovedIMDialogue.FromAgent:&lt;br /&gt;
&lt;br /&gt;
            # ... code parses the data from the Message() instance ...&lt;br /&gt;
&lt;br /&gt;
            message = AppEvent(&#039;InstantMessageReceived&#039;, FromAgentID = FromAgentID, RegionID = RegionID, Position = Position, ID = ID, FromAgentName = FromAgentName, Message = _Message)&lt;br /&gt;
&lt;br /&gt;
            logger.info(&amp;quot;Received instant message from %s: %s&amp;quot; % (FromAgentName, _Message))&lt;br /&gt;
&lt;br /&gt;
            self.events_handler.handle(message)&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
&lt;br /&gt;
Uses python&#039;s standard logging module (http://docs.python.org/library/logging.html). The library defines logging events throughout, it is up to the application/script to determine the output.&lt;br /&gt;
&lt;br /&gt;
Hooking logging into a new module:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;from logging import getLogger&lt;br /&gt;
&lt;br /&gt;
# initialize logging&lt;br /&gt;
logger = getLogger(&#039;pyogp.lib.client.agent&#039;)&lt;br /&gt;
&lt;br /&gt;
class Agent(object):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot; our agent class &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, params):&lt;br /&gt;
&lt;br /&gt;
        self.params = params&lt;br /&gt;
&lt;br /&gt;
        logger.debug(&amp;quot;Initializing agent with params: %s&amp;quot; % (params))&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An application can then set up the logging output as follows (or any other way it pleases):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;console = logging.StreamHandler()&lt;br /&gt;
formatter = logging.Formatter(&#039;%(asctime)-30s%(name)-30s: %(levelname)-8s %(message)s&#039;)&lt;br /&gt;
console.setFormatter(formatter)&lt;br /&gt;
logging.getLogger(&#039;&#039;).addHandler(console)&lt;br /&gt;
logging.getLogger(&#039;&#039;).setLevel(logging.DEBUG)&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The output to console is then:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bash&amp;gt;2009-04-21 22:08:58,681       pyogp.lib.base.agent          : DEBUG    agent with params: params&amp;lt;/bash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pyogp Unit Tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Package_Unittests]].&lt;br /&gt;
&lt;br /&gt;
== Sphinx (api docs) ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Api documentation is now available for PyOGP packages&#039;&#039;&#039; (well, not for apps yet, but someday....)!&lt;br /&gt;
 &lt;br /&gt;
In pyogp/docs in each of the pyogp.lib.base and pyogp.lib.client packages, one will find source, last revision, and build files for sphinx based documents. Output is available at {package root}/docs/html/index.html.&lt;br /&gt;
&lt;br /&gt;
We plan on sharing the api documentation on the web soon, and will work to make simple build wrappers work on various platforms, though this is a low priority.&lt;br /&gt;
&lt;br /&gt;
Ask Enus for updated documentation to be checked in, or, build a better refresh.py.&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See [[Pyogp/Roadmap]] for details, or ask in irc or on the mailing list. Here&#039;s what&#039;s up in the near term for pyogp:&lt;br /&gt;
&lt;br /&gt;
* better &#039;&#039;&#039;packaging&#039;&#039;&#039; and &#039;&#039;&#039;platform compatibility&#039;&#039;&#039;&lt;br /&gt;
* more &#039;&#039;&#039;functional coverage&#039;&#039;&#039; of message. We are covering 32% of the messages the viewers sends or handles when received (though it&#039;s estimated at more like 50% of normal use cases.&lt;br /&gt;
* &#039;&#039;&#039;permissions system testing&#039;&#039;&#039; to save QA from 3-5 day regression passes on perms&lt;br /&gt;
* &#039;&#039;&#039;appearance&#039;&#039;&#039; - this will require enabling upload and download, plus baking. Anyone have some spare time? :)&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;br /&gt;
[[Category: Pyogp]]&lt;br /&gt;
[[Category:Architecture Working Group]]&lt;br /&gt;
[[Category:Grid_Interoperability]]&lt;br /&gt;
[[Category:AW Groupies]]&lt;br /&gt;
[[Category:MMOX]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library&amp;diff=609073</id>
		<title>PyOGP Client Library</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PyOGP_Client_Library&amp;diff=609073"/>
		<updated>2009-10-20T07:16:18Z</updated>

		<summary type="html">&lt;p&gt;Enus Linden: /* Logging */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PyOGP/navigation}}&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
PyOGP is a young, open source, python client library which provides an interface to an agent (client) of a Second Life grid. The code aims to enable automated testing of Second Life grids, to encourage and enable exploration into the client/server relationship and related protocols of Second Life, and to make possible simple prototyping of various client applications.&lt;br /&gt;
&lt;br /&gt;
Hosted on svn.secondlife.com, it does require a contributor&#039;s agreement for commit access, and currently has a few contributors from the Second Life open source community.&lt;br /&gt;
&lt;br /&gt;
P.S. We&#039;ll likely be moving to hg relatively soon...&lt;br /&gt;
&lt;br /&gt;
* mailing list: pyogp@lists.secondlife.com&lt;br /&gt;
* irc: irc://irc.freenode.com/#pyogp&lt;br /&gt;
* wiki: http://wiki.secondlife.com/wiki/Pyogp&lt;br /&gt;
* licensing: Apache 2.0 license, copyright Linden Lab&lt;br /&gt;
&lt;br /&gt;
=== Goals ===&lt;br /&gt;
&lt;br /&gt;
In the very near future, we can have tests available to be run as soon as a deploy is completed that exercise a simulator/grid in the same way we do a smoke test. We will use these as automated tests run at build time, post deploy validation, and regression testing of simulators and backend systems.&lt;br /&gt;
&lt;br /&gt;
This provides early feedback on code quality. QA is then able to dive deeper in testing the changes specific to a branch. &lt;br /&gt;
&lt;br /&gt;
Having this library available also allows us to test potential changes before we have finalized design and are ready to submit to QA. Not sure how something will play out? Try it, and test it with PyOGP....&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== A Brief History ===&lt;br /&gt;
&lt;br /&gt;
PyOGP was originally created as a tool for testing [[OGP]] related changes to the Second Life grid. By the end of the summer in 2008, the &#039;&#039;&#039;pyogp.lib.base&#039;&#039;&#039; package provided a skeleton messaging system and was able to test Linden Lab&#039;s first implementation of an agent domain and the related changes in an agent&#039;s region handoff and teleport. As the development effort around OGP waned, we started to extend pyogp by adding higher level client related functionality. Recently, this functionality was split out into a separate python package (&#039;&#039;&#039;pyogp.lib.client&#039;&#039;&#039;), and sample scripts (and future apps) were moved into &#039;&#039;&#039;pyogp.apps&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Architecture Overview==&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
&lt;br /&gt;
PyOGP is comprised of three python packages. The library consists of pyogp.lib.base and pyogp.lib.client, while sample scripts, and in time applications, live in pyogp.apps. &lt;br /&gt;
:&#039;&#039;&#039;pyogp.lib.base&#039;&#039;&#039; - consists of basic networking, messaging systems (UDP and event queue) and capabilities, custom datatypes, and a low level message related event system&lt;br /&gt;
:&#039;&#039;&#039;pyogp.lib.client&#039;&#039;&#039; - consists of &#039;convenience&#039; classes mapping methods and handlers to specific messages (e.g. Agent().say(msg) tells the client to send the ChatFromViewer message to the host region). Raises application oriented events based on processing of messages (these are currently sparsely implemented)&lt;br /&gt;
:&#039;&#039;&#039;pyogp.apps&#039;&#039;&#039; - sample scripts and works in progress, the scripts here generally illustrate simple usage of classes as related to in world interactions by an agent of a Second Life grid&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
==== Platform / Python version compatibility ====&lt;br /&gt;
&lt;br /&gt;
PyOGP aims to be compatible across platforms, though there are known problems with various environments. We&#039;ll be focusing on ensuring better compatibility soon.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Known good configurations&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:Windows XP + Python 2.5&lt;br /&gt;
:Mac + Python 2.5, 2.6&lt;br /&gt;
:Linux + Python 2.4, 2.5, 2.6 (Linden hosts fall into this group) &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Known bad configurations&#039;&#039;&#039;&lt;br /&gt;
:Windows Vista + Python 2.6&lt;br /&gt;
:Windows 7 + Python 2.6&lt;br /&gt;
&lt;br /&gt;
There have been challenges in ensuring compatibility between the various dependencies, largely due to greenlet, eventlet, and pyopenssl. Please report bugs on [http://jira.secondlife.com/browse/PYO pJira]&lt;br /&gt;
&lt;br /&gt;
==== Python module dependencies ====&lt;br /&gt;
&lt;br /&gt;
The packages that make up PyOGP have some dependencies on python modules not included in a standard install, or sometimes not available on an older Python distribution.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;pyogp.lib.base dependencies:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;  #from setup.py&lt;br /&gt;
  &lt;br /&gt;
     install_requires=[&lt;br /&gt;
         &#039;setuptools&#039;,&lt;br /&gt;
         # -*- Extra requirements: -*-&lt;br /&gt;
         &#039;uuid&#039;,&lt;br /&gt;
         &#039;elementtree&#039;,&lt;br /&gt;
         &#039;indra.base&#039;,&lt;br /&gt;
         &#039;WebOb&#039;,&lt;br /&gt;
         &#039;wsgiref&#039;,&lt;br /&gt;
         &#039;eventlet==0.8.14&#039;&lt;br /&gt;
         ]&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;pyogp.lib.client dependencies:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;     install_requires=[&lt;br /&gt;
         &#039;setuptools&#039;,&lt;br /&gt;
         # -*- Extra requirements: -*-&lt;br /&gt;
         &#039;pyogp.lib.base&#039;&lt;br /&gt;
         ] &amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;pyogp.apps dependencies:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;     install_requires=[&lt;br /&gt;
         &#039;setuptools&#039;,&lt;br /&gt;
         &#039;pyogp.lib.client&#039;&lt;br /&gt;
         ]&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== How to install ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Lindens can see internal documentation for more specific guidance. https://wiki.lindenlab.com/wiki/Pyogp#How_to_Install&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Standalone dev environment using buildout ====&lt;br /&gt;
&lt;br /&gt;
Buildout is a type of Python development environment, organizing and configuring various components and their dependencies. On a desktop, one may checkout such an environment for working with PyOGP. One may optionally use a virtualenv Python environment to isolate the development code and it&#039;s runtime environment on one&#039;s host.&lt;br /&gt;
&lt;br /&gt;
Dependencies: buildout takes care of everything, grabbing needed modules etc.&lt;br /&gt;
&lt;br /&gt;
Wiki instructions: https://wiki.secondlife.com/wiki/Pyogp/Client_Lib/The_Development_Sandbox&lt;br /&gt;
&lt;br /&gt;
==== Installing the PyOGP packages ====&lt;br /&gt;
&lt;br /&gt;
Each of the PyOGP package may be installed to one&#039;s Python install or to a [http://pypi.python.org/pypi/virtualenv virtualenv]. &#039;&#039;&#039;Buyer beware&#039;&#039;&#039; if installing into your system&#039;s install: you&#039;ll want to be able to uninstall manually, as we haven&#039;t hooked up the uninstall. PyOGP is still coming up to speed with respect to distutils and pypi and the like, but it&#039;s relatively close now.&lt;br /&gt;
&lt;br /&gt;
To install a package, simply run &#039;python setup.py install&#039; in a package&#039;s root.&lt;br /&gt;
&lt;br /&gt;
==== Referencing PyOGP packages via the PATH ====&lt;br /&gt;
&lt;br /&gt;
Source code can be referenced directly if one simply ensures that a package, and it&#039;s dependencies, are available in the PYTHONPATH environmental variable.&lt;br /&gt;
&lt;br /&gt;
== Current functional coverage ==&lt;br /&gt;
&lt;br /&gt;
Anything not listed as covered is probably not yet covered.&lt;br /&gt;
&lt;br /&gt;
pyogp.lib.base:&lt;br /&gt;
:* base udp messaging system (message.*)&lt;br /&gt;
:** UDP serialization/deserialization&lt;br /&gt;
:** message_template.msg parsing &lt;br /&gt;
:* base event queue messaging system (event_queue.EventQueueClient())&lt;br /&gt;
:* capabilities and their methods. Seed capabilities are a special case. (caps.Capability())&lt;br /&gt;
:* Message-based events (message.message_handler)&lt;br /&gt;
&lt;br /&gt;
pyogp.lib.client:&lt;br /&gt;
:* agents (agent.Agent())&lt;br /&gt;
:** L$ balance request, friending, and walk/fly/sit/stand actions...&lt;br /&gt;
:* OGP agentdomain (agentdomain.AgentDomain())&lt;br /&gt;
:* application level events (event_system.AppEventsHandler())&lt;br /&gt;
:* some object handling (objects.*)&lt;br /&gt;
:** edit name, description, next-owner permissions and more&lt;br /&gt;
:** object creation is possible&lt;br /&gt;
:* some inventory handling (inventory.*)&lt;br /&gt;
:** login inv skeletons&lt;br /&gt;
:** fetching inventory, including AIS (caps based Agent Inventory Services))&lt;br /&gt;
:** some creating of new inventory items (LSL scripts, notecards)&lt;br /&gt;
:* regions (region.Region())&lt;br /&gt;
:** host and neighboring regions are handled slightly differently&lt;br /&gt;
:** udp and event queue connections are optionally enabled for each case&lt;br /&gt;
:** currently only pulling caps available to the agent via the seed cap (plus using the inventory related caps in the AIS context)&lt;br /&gt;
:* some appearance handling (appearance.AppearanceManager), &lt;br /&gt;
:* parcels&lt;br /&gt;
:* chat&lt;br /&gt;
:* some ImprovedInstantMessage handling&lt;br /&gt;
:** raises events on received instant messages&lt;br /&gt;
:** can deal with inventory offers/accepts/declines&lt;br /&gt;
:** other cases in this message are currently only logged&lt;br /&gt;
:* groups&lt;br /&gt;
:* group chat&lt;br /&gt;
:* LSL script uploading&lt;br /&gt;
&lt;br /&gt;
=== Sample Scripts ===&lt;br /&gt;
&lt;br /&gt;
There are a variety of scripted examples that have been used to exercise and test functionality as it is added to the library. These persist as coded documentation.&lt;br /&gt;
&lt;br /&gt;
The source code is available in https://svn.secondlife.com/svn/linden/projects/2008/pyogp/pyogp.apps/trunk/pyogp/apps/examples/.&lt;br /&gt;
&lt;br /&gt;
The following refers to a buildout context. If one installs pyogp.apps vi setup.py, these scripts will exist in the python environment&#039;s bin/ directory. In the buildout context, these scripts are available in {buildout root}/bin.&lt;br /&gt;
&lt;br /&gt;
The scripts are derived from a package&#039;s &#039;setup.py&#039; via the entry_points parameter, and essentially build executable Python scripts configured to run in the correct environment with the proper dependencies added the the path used by the script. These scripts are currently just simple illustrations of some uses of the PyOGP codebase.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;  #the current entry_points in setup.py og pyogp.apps:&lt;br /&gt;
  &lt;br /&gt;
     entry_points={&lt;br /&gt;
         &#039;console_scripts&#039;: [&lt;br /&gt;
             &#039;AIS_inventory_handling = pyogp.apps.examples.AIS_inventory_handling:main&#039;,&lt;br /&gt;
             &#039;agent_login = pyogp.apps.examples.agent_login:main&#039;,&lt;br /&gt;
             &#039;agent_manager = pyogp.apps.examples.agent_manager:main&#039;,&lt;br /&gt;
             &#039;appearance_management = pyogp.apps.examples.appearance_management:main&#039;,&lt;br /&gt;
             &#039;chat_and_instant_messaging = pyogp.apps.examples.chat_and_instant_messaging:main&#039;,&lt;br /&gt;
             &#039;group_chat = pyogp.apps.examples.group_chat:main&#039;,&lt;br /&gt;
             &#039;group_creation = pyogp.apps.examples.group_creation:main&#039;,&lt;br /&gt;
             &#039;inventory_handling = pyogp.apps.examples.inventory_handling:main&#039;,&lt;br /&gt;
             &#039;inventory_transfer = pyogp.apps.examples.inventory_transfer:main&#039;,&lt;br /&gt;
             &#039;inventory_transfer_specify_agent = pyogp.apps.examples.inventory_transfer_specify_agent:main&#039;,&lt;br /&gt;
             &#039;login = pyogp.apps.examples.login:main&#039;,&lt;br /&gt;
             &#039;multi_region_connect = pyogp.apps.examples.multi_region_connect:main&#039;,&lt;br /&gt;
             &#039;object_create_edit = pyogp.apps.examples.object_create_edit:main&#039;,&lt;br /&gt;
             &#039;object_create_permissions = pyogp.apps.examples.object_create_permissions:main&#039;,&lt;br /&gt;
             &#039;object_create_rez_script = pyogp.apps.examples.object_create_rez_script:main&#039;,&lt;br /&gt;
             &#039;object_creation = pyogp.apps.examples.object_creation:main&#039;,&lt;br /&gt;
             &#039;object_properties = pyogp.apps.examples.object_properties:main&#039;,&lt;br /&gt;
             &#039;object_tracking = pyogp.apps.examples.object_tracking:main&#039;,&lt;br /&gt;
             &#039;parcel_management = pyogp.apps.examples.parcel_management:main&#039;,&lt;br /&gt;
             &#039;parse_packets = pyogp.apps.examples.parse_packets:main&#039;,&lt;br /&gt;
             &#039;region_connect = pyogp.apps.examples.region_connect:main&#039;,&lt;br /&gt;
             &#039;smoke_test = pyogp.apps.examples.smoke_test:main&#039;,&lt;br /&gt;
             &#039;chat = pyogp.apps.examples.chat_interface:main&#039;,&lt;br /&gt;
             ]&lt;br /&gt;
        }&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How it Works (High Level) ==&lt;br /&gt;
&lt;br /&gt;
=== Eventlet ===&lt;br /&gt;
&lt;br /&gt;
PyOGP use [[Eventlet]] to run coroutines to handle multiple &#039;concurrent&#039; processes, rather than threads or multiple processes. Each client agent instance will spawn a handful of coroutines to handles e.g. the UDP pipe, the Event Queue, various monitors, while yielding time to the parent process which should ensure it yields to the other routines as well.&lt;br /&gt;
&lt;br /&gt;
PyOGP uses eventlet in very elementary ways at this point, but will perhaps start to use blocking queues in some cases, so that the coroutine only is allocated processing time if there is work for it to do.&lt;br /&gt;
&lt;br /&gt;
=== pyogp.lib.base ===&lt;br /&gt;
&lt;br /&gt;
This package handles the protocols used when communicating with a Second Life grid. A high level perspective on the package reveals a MessageManager() (still in development) which provides an interface to the UDP and Event Queue connections, as well as basic networking with enables login and capabilities interactions. The base package also has a low level even system through which all messages are passed and sent to subscribers.&lt;br /&gt;
&lt;br /&gt;
Any subcomponent is available for direct interaction at any time, the MessageManager() and the MessageHandler() are the simple access points.&lt;br /&gt;
&lt;br /&gt;
==== Events &amp;amp; Callbacks ====&lt;br /&gt;
&lt;br /&gt;
The event implementation in pyogp follows the observer pattern, where observers subscribe to and are notified when an event occurs. Data is passed throughout the client instance via events. &lt;br /&gt;
&lt;br /&gt;
* MessageManager - is an attribute of a Region and every packet received/sent is filtered through here. subscriptions are by message name&lt;br /&gt;
** MessageHandler - is an attribute of MessageManager, and every categorized message received from the event queue or udp dispatcher is filtered through here. (message as defined in message_template.msg, or one of [&#039;ChatterBoxInvitation&#039;, &#039;ChatterBoxSessionEventReply&#039;, &#039;ChatterBoxSessionAgentListUpdates&#039;, &#039;ChatterBoxSessionStartReply&#039;, &#039;EstablishAgentCommunication&#039;]. There may be unhandled messages, I just haven&#039;t seen em yet :))&lt;br /&gt;
&lt;br /&gt;
===== Message Events =====&lt;br /&gt;
&lt;br /&gt;
In the most fundamental implementation of event usage, all packets are passed through a MessageManager() instance for evaluation. Observers may register to receive udp packets serialized into the form of Message() instances. The MessageHandler() is a consolidation point for subscribing to messages keyed by message name, and created on demand via subscription.&lt;br /&gt;
&lt;br /&gt;
See pyogp.lib.base.message.message_handler.MessageHandler() for more details.&lt;br /&gt;
&lt;br /&gt;
The pyogp agent&#039;s Region() instances each monitor their stream of packets (e.g. the host region: agent.region.message_manager.message_handler). (Perhaps this should be changed to a generalized Network() class where all packets (coupled to their originating regions) are evaluated.&lt;br /&gt;
&lt;br /&gt;
Event firing passes data on to a callback handler defined in the subscription, in the form of (handler, *args, **kwargs).&lt;br /&gt;
&lt;br /&gt;
The Agent class monitors the ImprovedInstantMessage packet:&lt;br /&gt;
&amp;lt;python&amp;gt;        onImprovedInstantMessage_received = self.region.message_handler.register(&#039;ImprovedInstantMessage&#039;)&lt;br /&gt;
        onImprovedInstantMessage_received.subscribe(self.onImprovedInstantMessage)&lt;br /&gt;
&lt;br /&gt;
    def onImprovedInstantMessage(self, packet):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot; handles the many cases of data being passed in this message &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        {code} # parse and handle the data...&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The messaging system then fires the event when an ImprovedInstantMessage message is received, which calls onImprovedInstantMessage method above to handle the message contents. Multiple subscribers may be listening for any message related event, and each would be notified of the same Message() instance.&lt;br /&gt;
&lt;br /&gt;
Unsubscribing from an event:&lt;br /&gt;
&amp;lt;python&amp;gt;        onImprovedInstantMessage_received.unsubscribe(self.onImprovedInstantMessage)&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are various event and callback implementations viewable in pyogp, poke around and help consolidate things if you like.&lt;br /&gt;
&lt;br /&gt;
=== pyogp.lib.client ===&lt;br /&gt;
&lt;br /&gt;
The client package generally provides a convenient interface to initiate or interpret interactions with host region (or neighboring regions). By listening to the messaging related event system in pyogp.lib.base, the client package interprets the messages that come in off the wire, and executes business logic in building responses. pyogp.lib.client also provides simple methods to enable the ending of messages to a grid.&lt;br /&gt;
&lt;br /&gt;
==== Events ====&lt;br /&gt;
&lt;br /&gt;
* EventsHandler - an attribute of an Agent, also able to be passed in, that is intended as the primary interface of a pyogp application into the internal state and data events within the lib. This system uses the same base classes as used by the MessageHandler() in the base package, and the descriptions about events and callbacks above apply here as well. The api for subscribing to these events is similar to the MessageHandler(), with an additional timeout parameter passed in the _register() method. When the specified timeout expires, the subscription returns None and expires the subscription.&lt;br /&gt;
&lt;br /&gt;
==== Agent Login (examples) ====&lt;br /&gt;
&lt;br /&gt;
===== Single Agent Login &amp;amp; Chat=====&lt;br /&gt;
&lt;br /&gt;
Spawn a client in a co-routine, allowing persistent presence until forcefully terminated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;from eventlet import api&lt;br /&gt;
&lt;br /&gt;
from pyogp.lib.client.agent import Agent&lt;br /&gt;
from pyogp.lib.client.settings import Settings&lt;br /&gt;
&lt;br /&gt;
settings = Settings()&lt;br /&gt;
&lt;br /&gt;
settings.ENABLE_INVENTORY_MANAGEMENT = True&lt;br /&gt;
settings.MULTIPLE_SIM_CONNECTIONS = False&lt;br /&gt;
&lt;br /&gt;
client = Agent(settings = settings)&lt;br /&gt;
&lt;br /&gt;
api.spawn(client.login, options.loginuri, &#039;first&#039;, &#039;last&#039;, &#039;password&#039;, start_location = options.region)&lt;br /&gt;
&lt;br /&gt;
# wait for the agent to connect to it&#039;s region&lt;br /&gt;
while client.connected == False:&lt;br /&gt;
    api.sleep(0)&lt;br /&gt;
&lt;br /&gt;
while client.region.connected == False:&lt;br /&gt;
    api.sleep(0)&lt;br /&gt;
&lt;br /&gt;
client.say(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# once connected, live until someone kills me&lt;br /&gt;
while client.running:&lt;br /&gt;
    api.sleep(0)&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Multiple Agent Login =====&lt;br /&gt;
&lt;br /&gt;
Each agent instance in logged in in a separate coroutine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;from pyogp.lib.client.agent import Agent&lt;br /&gt;
from pyogp.lib.client.agentmanager import AgentManager&lt;br /&gt;
&lt;br /&gt;
clients = [[&#039;agent1&#039;, &#039;lastname&#039;, &#039;password&#039;], [&#039;agent2&#039;, &#039;lastname&#039;, &#039;password&#039;]]&lt;br /&gt;
agents = []&lt;br /&gt;
&lt;br /&gt;
# prime the Agent instances&lt;br /&gt;
for params in clients:&lt;br /&gt;
    agents.append(Agent(settings, params[0], params[1], params[2]))&lt;br /&gt;
&lt;br /&gt;
agentmanager = AgentManager()&lt;br /&gt;
agentmanager.initialize(agents)&lt;br /&gt;
&lt;br /&gt;
# log them in&lt;br /&gt;
for key in agentmanager.agents:&lt;br /&gt;
    agentmanager.login(key, options.loginuri, options.region)&lt;br /&gt;
&lt;br /&gt;
# while they are connected, stay alive&lt;br /&gt;
while agentmanager.has_agents_running():&lt;br /&gt;
    api.sleep(0)&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extending Functionality ==&lt;br /&gt;
&lt;br /&gt;
While the implementations and structures in pyogp.lib.base can (and are in the process of) being refactored to improve performance or usability, it is a fairly complete package. &lt;br /&gt;
&lt;br /&gt;
The functional coverage PyOGP provides on the other hand is not complete, and there are a variety of needs to complete the implementation in pyogp.lib.base. We need to improve coverage of message handling (dealing with messages sent to the client), add more wrappers for sending various messages and performing multistep tasks (to simplify the initiation of interactions with the region), and we need to raise more application level events in the client package so that applications have easy access to incoming data. &lt;br /&gt;
&lt;br /&gt;
=== Sending Messages ===&lt;br /&gt;
&lt;br /&gt;
PyOGP, like the Viewer, communicates with the Second Life simulator by sending messages over UDP. &lt;br /&gt;
&lt;br /&gt;
In order to extend PyOGP, you&#039;ll build a representation of a new UDP message, and send it through the pyogp.lib.base modules for serialization and wire handling.&lt;br /&gt;
&lt;br /&gt;
=== Example: Sending an IM ===&lt;br /&gt;
&lt;br /&gt;
To send an IM to the simulator, send an ImprovedInstantMessage packet.  The base class for message packets is defined in &amp;lt;code&amp;gt;base/message/message.py&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Packets are assembled using a Message() instance which has the message name and Block() instances passed in through its constructor.  Similarly, Blocks are assembled by passing in the Block name and the value name and values for each of the Block values. (The ability to build Message() instances via an llsd payload is expected to be introduced soon.)&lt;br /&gt;
&lt;br /&gt;
Note: It is important that the message name, block name, and value names and types should match what is specified in the message template. (It is also possible to manipulate the representation of the stored template, or to use a custom message template.)&lt;br /&gt;
 &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;python&amp;gt;    def send_ImprovedInstantMessage(self, AgentID = None, SessionID = None, &lt;br /&gt;
                                FromGroup = None, ToAgentID = None, &lt;br /&gt;
                                ParentEstateID = None, RegionID = None, &lt;br /&gt;
                                Position = None, Offline = None, &lt;br /&gt;
                                Dialog = None, _ID = None, Timestamp = None, &lt;br /&gt;
                                FromAgentName = None, _Message = None, &lt;br /&gt;
                                BinaryBucket = None):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot; &lt;br /&gt;
        sends an instant message packet to ToAgentID. this is a &lt;br /&gt;
        multi-purpose message for inventory offer handling, im, group chat, &lt;br /&gt;
        and more &lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        packet = Message(&#039;ImprovedInstantMessage&#039;, &lt;br /&gt;
                         Block(&#039;AgentData&#039;, &lt;br /&gt;
                               AgentID = AgentID, &lt;br /&gt;
                               SessionID = SessionID), &lt;br /&gt;
                         Block(&#039;MessageBlock&#039;, &lt;br /&gt;
                               FromGroup = FromGroup, &lt;br /&gt;
                               ToAgentID = ToAgentID, &lt;br /&gt;
                               ParentEstateID = ParentEstateID, &lt;br /&gt;
                               RegionID = RegionID, &lt;br /&gt;
                               Position = Position, &lt;br /&gt;
                               Offline = Offline, &lt;br /&gt;
                               Dialog = Dialog, &lt;br /&gt;
                               ID = UUID(str(_ID)), &lt;br /&gt;
                               Timestamp = Timestamp, &lt;br /&gt;
                               FromAgentName = FromAgentName, &lt;br /&gt;
                               Message = _Message, &lt;br /&gt;
                               BinaryBucket = BinaryBucket))&lt;br /&gt;
&lt;br /&gt;
        # Send the message:&lt;br /&gt;
        self.region.enqueue_message(packet, True)&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling Incoming Messages and Raising an Event ===&lt;br /&gt;
&lt;br /&gt;
To listen for when messages of a particular type are sent to the client instance, subscribe to the MessageHandler() on the host region&#039;s MessageManager(), like the example that follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;        onImprovedInstantMessage_received = self.region.message_handler.register(&#039;ImprovedInstantMessage&#039;)&lt;br /&gt;
        onImprovedInstantMessage_received.subscribe(self.onImprovedInstantMessage)&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When the event is fired upon receipt of the message matching the name, the specified callback handles the data passed along, and in this case raises an event notifying observers of the &#039;InstantMessageReceived&#039; event in pyogp.lib.client of the important data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;    def onImprovedInstantMessage(self, packet):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot; callback handler for received ImprovedInstantMessage messages. much is passed in this message, and handling the data is only partially implemented &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        Dialog = packet.blocks[&#039;MessageBlock&#039;][0].get_variable(&#039;Dialog&#039;).data&lt;br /&gt;
        FromAgentID = packet.blocks[&#039;AgentData&#039;][0].get_variable(&#039;AgentID&#039;).data&lt;br /&gt;
&lt;br /&gt;
        if Dialog == ImprovedIMDialogue.InventoryOffered:&lt;br /&gt;
&lt;br /&gt;
            self.inventory.handle_inventory_offer(packet)&lt;br /&gt;
&lt;br /&gt;
        # ...&lt;br /&gt;
        # some of the Dialogue types this message can contain are handled, we are showing 2&lt;br /&gt;
        # ...&lt;br /&gt;
&lt;br /&gt;
        elif Dialog == ImprovedIMDialogue.FromAgent:&lt;br /&gt;
&lt;br /&gt;
            # ... code parses the data from the Message() instance ...&lt;br /&gt;
&lt;br /&gt;
            message = AppEvent(&#039;InstantMessageReceived&#039;, FromAgentID = FromAgentID, RegionID = RegionID, Position = Position, ID = ID, FromAgentName = FromAgentName, Message = _Message)&lt;br /&gt;
&lt;br /&gt;
            logger.info(&amp;quot;Received instant message from %s: %s&amp;quot; % (FromAgentName, _Message))&lt;br /&gt;
&lt;br /&gt;
            self.events_handler.handle(message)&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
&lt;br /&gt;
Uses python&#039;s standard logging module (http://docs.python.org/library/logging.html). The library defines logging events throughout, it is up to the application/script to determine the output.&lt;br /&gt;
&lt;br /&gt;
Hooking logging into a new module:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;from logging import getLogger&lt;br /&gt;
&lt;br /&gt;
# initialize logging&lt;br /&gt;
logger = getLogger(&#039;pyogp.lib.client.agent&#039;)&lt;br /&gt;
&lt;br /&gt;
class Agent(object):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot; our agent class &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, params):&lt;br /&gt;
&lt;br /&gt;
        self.params = params&lt;br /&gt;
&lt;br /&gt;
        logger.debug(&amp;quot;Initializing agent with params: %s&amp;quot; % (params))&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An application can then set up the logging output as follows (or any other way it pleases):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt;console = logging.StreamHandler()&lt;br /&gt;
formatter = logging.Formatter(&#039;%(asctime)-30s%(name)-30s: %(levelname)-8s %(message)s&#039;)&lt;br /&gt;
console.setFormatter(formatter)&lt;br /&gt;
logging.getLogger(&#039;&#039;).addHandler(console)&lt;br /&gt;
logging.getLogger(&#039;&#039;).setLevel(logging.DEBUG)&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The output to console is then:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bash&amp;gt;2009-04-21 22:08:58,681       pyogp.lib.base.agent          : DEBUG    agent with params: params&amp;lt;/bash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pyogp Unit Tests ==&lt;br /&gt;
&lt;br /&gt;
See [[PyOGP_Package_Unittests]].&lt;br /&gt;
&lt;br /&gt;
== Sphinx (api docs) ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Api documentation is now available for PyOGP packages&#039;&#039;&#039; (well, not for apps yet, but someday....)!&lt;br /&gt;
 &lt;br /&gt;
In pyogp/docs in each of the pyogp.lib.base and pyogp.lib.client packages, one will find source, last revision, and build files for sphinx based documents. Output is available at {package root}/docs/html/index.html.&lt;br /&gt;
&lt;br /&gt;
We plan on sharing the api documentation on the web soon, and will work to make simple build wrappers work on various platforms, though this is a low priority.&lt;br /&gt;
&lt;br /&gt;
Ask Enus for updated documentation to be checked in, or, build a better refresh.py.&lt;br /&gt;
&lt;br /&gt;
== Roadmap ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See [[Pyogp/Roadmap]] for details, or ask in irc or on the mailing list. Here&#039;s what&#039;s up in the near term for pyogp:&lt;br /&gt;
&lt;br /&gt;
* better &#039;&#039;&#039;packaging&#039;&#039;&#039; and &#039;&#039;&#039;platform compatibility&#039;&#039;&#039;&lt;br /&gt;
* more &#039;&#039;&#039;functional coverage&#039;&#039;&#039; of message. We are covering 32% of the messages the viewers sends or handles when received (though it&#039;s estimated at more like 50% of normal use cases.&lt;br /&gt;
* &#039;&#039;&#039;permissions system testing&#039;&#039;&#039; to save QA from 3-5 day regression passes on perms&lt;br /&gt;
* &#039;&#039;&#039;appearance&#039;&#039;&#039; - this will require enabling upload and download, plus baking. Anyone have some spare time? :)&lt;br /&gt;
&lt;br /&gt;
[[Category: Pyogp_Client_Lib]]&lt;br /&gt;
[[Category: Pyogp]]&lt;br /&gt;
[[Category:Architecture Working Group]]&lt;br /&gt;
[[Category:Grid_Interoperability]]&lt;br /&gt;
[[Category:AW Groupies]]&lt;br /&gt;
[[Category:MMOX]]&lt;/div&gt;</summary>
		<author><name>Enus Linden</name></author>
	</entry>
</feed>