<?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=Lex+Neva</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=Lex+Neva"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Lex_Neva"/>
	<updated>2026-07-29T06:36:47Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlHTTPRequest&amp;diff=405323</id>
		<title>LlHTTPRequest</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlHTTPRequest&amp;diff=405323"/>
		<updated>2009-06-25T01:45:37Z</updated>

		<summary type="html">&lt;p&gt;Lex Neva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func=llHTTPRequest&lt;br /&gt;
|func_id=230&lt;br /&gt;
|func_energy=10.0&lt;br /&gt;
|func_sleep=0.0&lt;br /&gt;
|func_desc=Sends an HTTP request to the specified URL with the body of the request and parameters. &lt;br /&gt;
|sort=HTTPRequest&lt;br /&gt;
|func_footnote=&lt;br /&gt;
|return_type=key&lt;br /&gt;
|return_text= that is a handle identifying the HTTP request made.&lt;br /&gt;
|p1_type=string|p1_name=url|p1_desc=A valid HTTP/HTTPS URL.&lt;br /&gt;
|p2_type=list|p2_name=parameters|p2_desc=configuration parameters, specified as HTTP_* flag-value pairs&lt;br /&gt;
[ parameter1, value1, parameter2, value2, . . . parameterN, valueN]&lt;br /&gt;
|p3_type=string|p3_name=body|p3_desc=Contents of the request.&lt;br /&gt;
|constants={{LSL_Constants_HTTP}}&lt;br /&gt;
{{LSL_Constants/HTTP_Headers}}&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=&lt;br /&gt;
*If there is a space in &#039;&#039;&#039;url&#039;&#039;&#039;, the [[http_response]] status code will be 499.&lt;br /&gt;
*The response body is limited to 2048 bytes; if it is longer it will be truncated.&lt;br /&gt;
*Requests are throttled on a per [[object]] basis (not per prim).&lt;br /&gt;
**Requests are throttled to a maximum of 25 requests per 20 seconds.  This is to support a sustained rate of 1 per second or a burst of up to 25.&lt;br /&gt;
***See [http://forums.secondlife.com/showthread.php?t=108960 this thread] and [http://forums.secondlife.com/showthread.php?t=109571 this thread] for more details.&lt;br /&gt;
*Cannot be used to load textures or images from the internet, for more information see [[Web Textures]].&lt;br /&gt;
*If the accessed site is relying on the LSL script to report L$ transactions, then it &#039;&#039;&#039;must&#039;&#039;&#039; check the X-SecondLife-Shard header to see if the script is running on the beta grid.&lt;br /&gt;
* Some servers will return a 405 error if you send POST to a file that can&#039;t accept metadata, such as a text or HTML file. Make sure you use the GET method to ensure success in any environment.&lt;br /&gt;
* While the HTTP status code from the server is provided to the script, redirect codes such as 302 will result in the redirect being automatically and transparently followed, with the resulting response being returned.&lt;br /&gt;
|examples=&amp;lt;lsl&amp;gt;key http_request_id;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        http_request_id = llHTTPRequest(&amp;quot;url&amp;quot;, [], &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {&lt;br /&gt;
        if (request_id == http_request_id)&lt;br /&gt;
        {&lt;br /&gt;
            llSetText(body, &amp;lt;0,0,1&amp;gt;, 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example PHP test script:&lt;br /&gt;
&amp;lt;php&amp;gt;&amp;lt;?php header(&amp;quot;content-type: text/plain; charset=utf-8&amp;quot;); ?&amp;gt;&lt;br /&gt;
Headers received:&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @author Wouter Hobble&lt;br /&gt;
 * @copyright 2008&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
foreach ($_SERVER as $k =&amp;gt; $v)&lt;br /&gt;
{&lt;br /&gt;
	if( substr($k, 0, 5) == &#039;HTTP_&#039;)&lt;br /&gt;
	{&lt;br /&gt;
		print &amp;quot;\n&amp;quot;. $k. &amp;quot;\t&amp;quot;. $v;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&amp;lt;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
example wrapper script Both capturing apache headers and global methodes&lt;br /&gt;
&amp;lt;php&amp;gt;&lt;br /&gt;
&amp;lt;?PHP&lt;br /&gt;
	// Author Waster Skronski.&lt;br /&gt;
	// General Public License (GPL).&lt;br /&gt;
	// Mind that some headers are not included because they&#039;re either useless or unreliable.&lt;br /&gt;
	$USE_APACHE_HEADERS = TRUE; // switch to false if you need cgi methods&lt;br /&gt;
	if ($USE_APACHE_HEADERS)&lt;br /&gt;
	{&lt;br /&gt;
		$headers 	= apache_request_headers();&lt;br /&gt;
		$objectgrid 	= $headers[&amp;quot;X-SecondLife-Shard&amp;quot;];&lt;br /&gt;
		$objectname 	= $headers[&amp;quot;X-SecondLife-Object-Name&amp;quot;];&lt;br /&gt;
		$objectkey     	= $headers[&amp;quot;X-SecondLife-Object-Key&amp;quot;];&lt;br /&gt;
		$objectpos 	= $headers[&amp;quot;X-SecondLife-Local-Position&amp;quot;];&lt;br /&gt;
		$ownerkey     	= $headers[&amp;quot;X-SecondLife-Owner-Key&amp;quot;];&lt;br /&gt;
		$ownername 	= $headers[&amp;quot;X-SecondLife-Owner-Name&amp;quot;];&lt;br /&gt;
		$regiondata     = $headers[&amp;quot;X-SecondLife-Region&amp;quot;];&lt;br /&gt;
		$regiontmp 	= explode (&amp;quot;(&amp;quot;,$regiondata); // cut cords off &lt;br /&gt;
		$regionpos 	= explode (&amp;quot;)&amp;quot;,$regiontmp[1]); //&lt;br /&gt;
		$regionname 	= substr($regiontmp[0],0,-1); // cut last space from simname&lt;br /&gt;
	} else {&lt;br /&gt;
		$db = $GLOBALS;&lt;br /&gt;
		$headers 		= $db[&#039;HTTP_ENV_VARS&#039;];&lt;br /&gt;
		$objectgrid 	= $headers[&amp;quot;HTTP_X_SECONDLIFE_SHARD&amp;quot;]; &lt;br /&gt;
		$objectname 	= $headers[&amp;quot;HTTP_X_SECONDLIFE_OBJECT_NAME&amp;quot;];&lt;br /&gt;
		$objectkey     	= $headers[&amp;quot;HTTP_X_SECONDLIFE_OBJECT_KEY&amp;quot;];&lt;br /&gt;
		$ownerkey     	= $headers[&amp;quot;HTTP_X_SECONDLIFE_OWNER_KEY&amp;quot;];&lt;br /&gt;
		$objectpos     	= $headers[&amp;quot;HTTP_X_SECONDLIFE_LOCAL_POSITION&amp;quot;];&lt;br /&gt;
		$ownername 	= $headers[&amp;quot;HTTP_X_SECONDLIFE_OWNER_NAME&amp;quot;];&lt;br /&gt;
		$regiondata     = $headers[&amp;quot;HTTP_X_SECONDLIFE_REGION&amp;quot;];&lt;br /&gt;
		$regiontmp 	= explode (&amp;quot;(&amp;quot;,$regiondata); &lt;br /&gt;
		$regionpos 	= explode (&amp;quot;)&amp;quot;,$regiontmp[1]);&lt;br /&gt;
		$regionname 	= substr($regiontmp[0],0,-1);&lt;br /&gt;
	}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:none;&amp;quot;&amp;gt;&amp;lt;lsl&amp;gt;&amp;lt;/lsl&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_header&lt;br /&gt;
|also_events={{LSL DefineRow||[[http_response]]}}&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llEscapeURL]]}}&lt;br /&gt;
{{LSL DefineRow||[[llUnescapeURL]]}}&lt;br /&gt;
|also_articles={{LSL DefineRow||[[Simulator IP Addresses]]}}&lt;br /&gt;
|also_footer&lt;br /&gt;
|notes=If for some reason while using llHTTPRequest/http_response you are unable to parse a known good RSS feed or some other form of web contents, you will need to work around it outside of SecondLife. This is unlikely to change in the near future since checking the headers requires more overhead at the simulator level.&lt;br /&gt;
&lt;br /&gt;
You may find that some web servers return either a null or a nonsensical result when llHTTPRequest is used, even though the same URL in a PC web browser returns the expected result. This may be due to the fact that the llHTTPRequest User Agent string is not recognised by some web servers as it does not contain &amp;quot;Mozilla&amp;quot;, which would identify it as a web browser instead of, for example, a Shoutcast or an RSS client. A workaround is to append &amp;quot; HTTP/1.0\nUser-Agent: LSL Script (Mozilla Compatible)\n\n&amp;quot; or similar to the URL string, which will kludge the HTTP request to look like it originates from a web browser.&lt;br /&gt;
&lt;br /&gt;
CGI environments may place the headers into variables by capitalizing the entire name, replacing dashes with underscores, and prefixing the name with &amp;quot;HTTP_&amp;quot;, e.g. &amp;quot;HTTP_X_SECONDLIFE_OBJECT_NAME&amp;quot;. PHP $_SERVER variables do this as well.&lt;br /&gt;
&lt;br /&gt;
Apache can include the headers in its logs, using the CustomLog and LogFormat directives.  See [http://httpd.apache.org/docs/2.0/mod/mod_log_config.html#formats the docs] for details on the syntax.&lt;br /&gt;
&lt;br /&gt;
|mode&lt;br /&gt;
|deprecated&lt;br /&gt;
|permission&lt;br /&gt;
|cat1=HTTP&lt;br /&gt;
|cat2=XML-RPC&lt;br /&gt;
|cat3=Communications&lt;br /&gt;
|cat4=HTTP/Client&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lex Neva</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlHTTPRequest&amp;diff=405313</id>
		<title>LlHTTPRequest</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlHTTPRequest&amp;diff=405313"/>
		<updated>2009-06-25T01:44:01Z</updated>

		<summary type="html">&lt;p&gt;Lex Neva: add note about HTTP redirects&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func=llHTTPRequest&lt;br /&gt;
|func_id=230&lt;br /&gt;
|func_energy=10.0&lt;br /&gt;
|func_sleep=0.0&lt;br /&gt;
|func_desc=Sends an HTTP request to the specified URL with the body of the request and parameters. &lt;br /&gt;
|sort=HTTPRequest&lt;br /&gt;
|func_footnote=&lt;br /&gt;
|return_type=key&lt;br /&gt;
|return_text= that is a handle identifying the HTTP request made.&lt;br /&gt;
|p1_type=string|p1_name=url|p1_desc=A valid HTTP/HTTPS URL.&lt;br /&gt;
|p2_type=list|p2_name=parameters|p2_desc=configuration parameters, specified as HTTP_* flag-value pairs&lt;br /&gt;
[ parameter1, value1, parameter2, value2, . . . parameterN, valueN]&lt;br /&gt;
|p3_type=string|p3_name=body|p3_desc=Contents of the request.&lt;br /&gt;
|constants={{LSL_Constants_HTTP}}&lt;br /&gt;
{{LSL_Constants/HTTP_Headers}}&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=&lt;br /&gt;
*If there is a space in &#039;&#039;&#039;url&#039;&#039;&#039;, the [[http_response]] status code will be 499.&lt;br /&gt;
*The response body is limited to 2048 bytes; if it is longer it will be truncated.&lt;br /&gt;
*Requests are throttled on a per [[object]] basis (not per prim).&lt;br /&gt;
**Requests are throttled to a maximum of 25 requests per 20 seconds.  This is to support a sustained rate of 1 per second or a burst of up to 25.&lt;br /&gt;
***See [http://forums.secondlife.com/showthread.php?t=108960 this thread] and [http://forums.secondlife.com/showthread.php?t=109571 this thread] for more details.&lt;br /&gt;
*Cannot be used to load textures or images from the internet, for more information see [[Web Textures]].&lt;br /&gt;
*If the accessed site is relying on the LSL script to report L$ transactions, then it &#039;&#039;&#039;must&#039;&#039;&#039; check the X-SecondLife-Shard header to see if the script is running on the beta grid.&lt;br /&gt;
* Some servers will return a 405 error if you send POST to a file that can&#039;t accept metadata, such as a text or HTML file. Make sure you use the GET method to ensure success in any environment.&lt;br /&gt;
* While the HTTP status code from the server is provided to the script, redirect codes such as 302 will result in the redirect being automatically and transparently followed by SL, with the resulting response being returned.&lt;br /&gt;
|examples=&amp;lt;lsl&amp;gt;key http_request_id;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        http_request_id = llHTTPRequest(&amp;quot;url&amp;quot;, [], &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {&lt;br /&gt;
        if (request_id == http_request_id)&lt;br /&gt;
        {&lt;br /&gt;
            llSetText(body, &amp;lt;0,0,1&amp;gt;, 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example PHP test script:&lt;br /&gt;
&amp;lt;php&amp;gt;&amp;lt;?php header(&amp;quot;content-type: text/plain; charset=utf-8&amp;quot;); ?&amp;gt;&lt;br /&gt;
Headers received:&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @author Wouter Hobble&lt;br /&gt;
 * @copyright 2008&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
foreach ($_SERVER as $k =&amp;gt; $v)&lt;br /&gt;
{&lt;br /&gt;
	if( substr($k, 0, 5) == &#039;HTTP_&#039;)&lt;br /&gt;
	{&lt;br /&gt;
		print &amp;quot;\n&amp;quot;. $k. &amp;quot;\t&amp;quot;. $v;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&amp;lt;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
example wrapper script Both capturing apache headers and global methodes&lt;br /&gt;
&amp;lt;php&amp;gt;&lt;br /&gt;
&amp;lt;?PHP&lt;br /&gt;
	// Author Waster Skronski.&lt;br /&gt;
	// General Public License (GPL).&lt;br /&gt;
	// Mind that some headers are not included because they&#039;re either useless or unreliable.&lt;br /&gt;
	$USE_APACHE_HEADERS = TRUE; // switch to false if you need cgi methods&lt;br /&gt;
	if ($USE_APACHE_HEADERS)&lt;br /&gt;
	{&lt;br /&gt;
		$headers 	= apache_request_headers();&lt;br /&gt;
		$objectgrid 	= $headers[&amp;quot;X-SecondLife-Shard&amp;quot;];&lt;br /&gt;
		$objectname 	= $headers[&amp;quot;X-SecondLife-Object-Name&amp;quot;];&lt;br /&gt;
		$objectkey     	= $headers[&amp;quot;X-SecondLife-Object-Key&amp;quot;];&lt;br /&gt;
		$objectpos 	= $headers[&amp;quot;X-SecondLife-Local-Position&amp;quot;];&lt;br /&gt;
		$ownerkey     	= $headers[&amp;quot;X-SecondLife-Owner-Key&amp;quot;];&lt;br /&gt;
		$ownername 	= $headers[&amp;quot;X-SecondLife-Owner-Name&amp;quot;];&lt;br /&gt;
		$regiondata     = $headers[&amp;quot;X-SecondLife-Region&amp;quot;];&lt;br /&gt;
		$regiontmp 	= explode (&amp;quot;(&amp;quot;,$regiondata); // cut cords off &lt;br /&gt;
		$regionpos 	= explode (&amp;quot;)&amp;quot;,$regiontmp[1]); //&lt;br /&gt;
		$regionname 	= substr($regiontmp[0],0,-1); // cut last space from simname&lt;br /&gt;
	} else {&lt;br /&gt;
		$db = $GLOBALS;&lt;br /&gt;
		$headers 		= $db[&#039;HTTP_ENV_VARS&#039;];&lt;br /&gt;
		$objectgrid 	= $headers[&amp;quot;HTTP_X_SECONDLIFE_SHARD&amp;quot;]; &lt;br /&gt;
		$objectname 	= $headers[&amp;quot;HTTP_X_SECONDLIFE_OBJECT_NAME&amp;quot;];&lt;br /&gt;
		$objectkey     	= $headers[&amp;quot;HTTP_X_SECONDLIFE_OBJECT_KEY&amp;quot;];&lt;br /&gt;
		$ownerkey     	= $headers[&amp;quot;HTTP_X_SECONDLIFE_OWNER_KEY&amp;quot;];&lt;br /&gt;
		$objectpos     	= $headers[&amp;quot;HTTP_X_SECONDLIFE_LOCAL_POSITION&amp;quot;];&lt;br /&gt;
		$ownername 	= $headers[&amp;quot;HTTP_X_SECONDLIFE_OWNER_NAME&amp;quot;];&lt;br /&gt;
		$regiondata     = $headers[&amp;quot;HTTP_X_SECONDLIFE_REGION&amp;quot;];&lt;br /&gt;
		$regiontmp 	= explode (&amp;quot;(&amp;quot;,$regiondata); &lt;br /&gt;
		$regionpos 	= explode (&amp;quot;)&amp;quot;,$regiontmp[1]);&lt;br /&gt;
		$regionname 	= substr($regiontmp[0],0,-1);&lt;br /&gt;
	}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:none;&amp;quot;&amp;gt;&amp;lt;lsl&amp;gt;&amp;lt;/lsl&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_header&lt;br /&gt;
|also_events={{LSL DefineRow||[[http_response]]}}&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llEscapeURL]]}}&lt;br /&gt;
{{LSL DefineRow||[[llUnescapeURL]]}}&lt;br /&gt;
|also_articles={{LSL DefineRow||[[Simulator IP Addresses]]}}&lt;br /&gt;
|also_footer&lt;br /&gt;
|notes=If for some reason while using llHTTPRequest/http_response you are unable to parse a known good RSS feed or some other form of web contents, you will need to work around it outside of SecondLife. This is unlikely to change in the near future since checking the headers requires more overhead at the simulator level.&lt;br /&gt;
&lt;br /&gt;
You may find that some web servers return either a null or a nonsensical result when llHTTPRequest is used, even though the same URL in a PC web browser returns the expected result. This may be due to the fact that the llHTTPRequest User Agent string is not recognised by some web servers as it does not contain &amp;quot;Mozilla&amp;quot;, which would identify it as a web browser instead of, for example, a Shoutcast or an RSS client. A workaround is to append &amp;quot; HTTP/1.0\nUser-Agent: LSL Script (Mozilla Compatible)\n\n&amp;quot; or similar to the URL string, which will kludge the HTTP request to look like it originates from a web browser.&lt;br /&gt;
&lt;br /&gt;
CGI environments may place the headers into variables by capitalizing the entire name, replacing dashes with underscores, and prefixing the name with &amp;quot;HTTP_&amp;quot;, e.g. &amp;quot;HTTP_X_SECONDLIFE_OBJECT_NAME&amp;quot;. PHP $_SERVER variables do this as well.&lt;br /&gt;
&lt;br /&gt;
Apache can include the headers in its logs, using the CustomLog and LogFormat directives.  See [http://httpd.apache.org/docs/2.0/mod/mod_log_config.html#formats the docs] for details on the syntax.&lt;br /&gt;
&lt;br /&gt;
|mode&lt;br /&gt;
|deprecated&lt;br /&gt;
|permission&lt;br /&gt;
|cat1=HTTP&lt;br /&gt;
|cat2=XML-RPC&lt;br /&gt;
|cat3=Communications&lt;br /&gt;
|cat4=HTTP/Client&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lex Neva</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Message_Queue_Evaluation_Notes&amp;diff=298992</id>
		<title>Message Queue Evaluation Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Message_Queue_Evaluation_Notes&amp;diff=298992"/>
		<updated>2009-04-01T00:39:21Z</updated>

		<summary type="html">&lt;p&gt;Lex Neva: removed unnecessary profanity&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Summary and Overview =&lt;br /&gt;
&lt;br /&gt;
One of the infrastructure tools that we&#039;ve identified for the future internal architecture of Second Life is messaging.  Message queuing systems allow systems that send messages to not have to worry about how they will be delivered, and allow consumers of messages to gather whichever ones interest them, at their own pace.&lt;br /&gt;
&lt;br /&gt;
Ideally we&#039;d have a completely scaleable system that clients could treat as singular black box.  It would act as a well-known cluster to which senders or receivers of messages could connect, and be able to communicate asynchronously to or from anywhere else on the grid.  Unfortunately it seems as though this dream, like so many others, is unattainable by any currently available software.  We investigated around 15 open source systems that were explicitly designed for message queueing and found that none of them achieved this ideal.&lt;br /&gt;
&lt;br /&gt;
Our use cases mostly involve very large numbers of queues; the smallest number we&#039;re even considering is double the number of concurrent users.  Our largest use case would be of the same order of magnitude as registered users.  This means that we have to plan for millions, and probably tens or hundreds of millions, of message queues, since we want whatever system we choose to last us until then. Pretty much all of the message queue systems we investigated are intended to maximize message throughput rather than number of consumers. The clustering that they implement mainly serves as additional horsepower to deliver more message throughput.  In particular the clustering we&#039;ve seen replicates all state to every machine in the cluster, meaning that the cluster cannot add queues beyond the capacity of an individual node.  In order to have a solution that scales in terms of number of queues, each node will have to be able to contain a subset of the global state -- it actually seems as though such a message system would want to be coupled with a distributed storage system.&lt;br /&gt;
&lt;br /&gt;
In any case, given that we expect that we&#039;d have to develop our own queue scaling solution that involves partitioning, which may or may not be a task we are interested in taking on, the strongest candidates are&lt;br /&gt;
RabbitMQ and Apache QPID.  Both are mature products that support AMQP (though they support different versions).  Both have strong vendor support, and both have good single-host performance numbers. There is some more investigation to be done -- we&#039;d like to know their true maximum capacity when clustered, to evaluate whether it&#039;s worth clustering at all, given that we have to implement partitioning ourselves anyway.&lt;br /&gt;
&lt;br /&gt;
We&#039;re unfortunately pretty far from having closed the case on which technology to choose, or even if we can use any of these at all.  Investigation will continue!&lt;br /&gt;
&lt;br /&gt;
== Criteria ==&lt;br /&gt;
&lt;br /&gt;
Questions&lt;br /&gt;
# Support for consuming messages in our two main languages, Python and C++&lt;br /&gt;
# Support for producing them in all of our main languages (or, e.g., an HTTP gateway)&lt;br /&gt;
# What&#039;s the raw message rate that a single server can handle at different message sizes (e.g. 1 byte, 128 bytes, 1K, 128K)?&lt;br /&gt;
# What are the latency figures for these message rates?&lt;br /&gt;
# What are the server&#039;s clustering characteristics?&lt;br /&gt;
#* HA/failover&lt;br /&gt;
#* scalability for message quantity&lt;br /&gt;
#* scalability for number of clients/queues&lt;br /&gt;
# What about cross-colo traffic?  Does it do SSL, does it need tunneling, is it designed to deal with interrupted communications?&lt;br /&gt;
# How do the health of the protocol standard, the software, and the community look?&lt;br /&gt;
# Can we engage people on support and development contracts if necessary?&lt;br /&gt;
# Is it possible to set up persistent queues, where undelivered messages will survive server restarts? For some interesting perspectives, see [http://www.rockstarprogrammer.org/post/2008/oct/04/what-matters-asynchronous-job-queue/ &amp;quot;What Matters in an Asynchronous Job Queue&amp;quot;] and [http://groups.google.com/group/beanstalk-talk/browse_thread/thread/e8d1a6ea80f0d57a this discussion on persistence and failure scenarios].&lt;br /&gt;
&lt;br /&gt;
The major use cases that we believe could be implemented with message queues are these:&lt;br /&gt;
* IM&lt;br /&gt;
* blue box notifications in the viewer&lt;br /&gt;
* group notices&lt;br /&gt;
* group chat&lt;br /&gt;
* group votes&lt;br /&gt;
* presence notifications&lt;br /&gt;
* anything else that currently is an [http://wiki.secondlife.com/wiki/ImprovedInstantMessage ImprovedInstantMessage]&lt;br /&gt;
* friendship&lt;br /&gt;
* details of registration such as initial inventory&lt;br /&gt;
* requests to regenerate map tiles&lt;br /&gt;
&lt;br /&gt;
Many other uses that we haven&#039;t put up there would arise when developing various applications.  Note that we &#039;&#039;&#039;do not&#039;&#039;&#039; intend to expose the message queue system directly to the viewer; we would use it instead for behind-the-scenes implementation of the above use cases.  Discussing the protocol by which the viewer sends and receives messages with the server is far outside the scope of this research.&lt;br /&gt;
&lt;br /&gt;
The primary use case that we examined was that of group chat.  This is the most obvious use that we&#039;d put message queues to, and it&#039;s also one of the only use cases up there that is a current pain point for Residents.  Here are some numbers describing group chat, which were captured at 11am one day:&lt;br /&gt;
&lt;br /&gt;
* online residents: ~68,000&lt;br /&gt;
* number of group chats: 131953&lt;br /&gt;
* number of memberships: 629637&lt;br /&gt;
* avg number of groups/resident: 9.3&lt;br /&gt;
* average group size:  4.8&lt;br /&gt;
* most online members in a group: 785&lt;br /&gt;
* stdev group size:  13.1&lt;br /&gt;
* group churn/second: 23.2&lt;br /&gt;
* membership churn/second: 260&lt;br /&gt;
* messages sent/second: 8.6&lt;br /&gt;
&lt;br /&gt;
We want to pick a technology that can at minimum handle 4x these numbers, and ideally could horizontally scale across the most important axes to us: number of group chats, number of memberships, and messages/second.&lt;br /&gt;
&lt;br /&gt;
Group churn represents the number of groups added or removed from the system every second.  In an AMQP-based system a &amp;quot;group&amp;quot; would be added when someone binds the first queue to the a key representing the group&#039;s id, and the group would be dropped when the last binding to the key is removed.  In any routing system of this nature, there will be two data structures that are the inverse of each other: one is queuename-&amp;gt;keys table and the other is the keys-&amp;gt;queuenames table.  Group churn would primarily affect the keys-&amp;gt;queuenames table.&lt;br /&gt;
&lt;br /&gt;
Membership churn comes from agents joining and leaving groups, and is indirectly related to group churn.  There is vastly more membership churn because each agent is in roughly 9 groups -- one agent logs in for 15 seconds and then logs out, that&#039;s 18 points of &amp;quot;churn&amp;quot;.  In an AMQP-based system this churn would be visible as bindings being added and dropped, which would thus affect the queuename-&amp;gt;keys table.&lt;br /&gt;
&lt;br /&gt;
Both types of churn are substantially higher than messaging rate.  Even if we successfully implement a feature that will allow residents to opt out of joining group chat on login, I&#039;d guess that we&#039;d see at most a 75% reduction in churn as a result, which would still leave membership churn nearly an order of magnitude larger than messages sent.&lt;br /&gt;
&lt;br /&gt;
The group size metrics are interesting because it implies that most groups are pretty small.  The downside is we have roughly 2 unique groups for every concurrent resident, so our group system has to scale along that axis very well.&lt;br /&gt;
&lt;br /&gt;
Overall, these numbers are a real whack upside the head because they reveal that for our particular use case, we worry far more about number of queues, and ability to handle high churn, than we do about message delivery rate.  Most of the benchmarks regarding the software we evaluated optimize for message rate rather than churn or quantity of queues.&lt;br /&gt;
&lt;br /&gt;
Note that [http://gojko.net/2009/03/16/qcon-london-2009-upgrading-twitter-without-service-disruptions/ Twitter has a similar set of requirements] (complete with startlingly low message rate), though they don&#039;t have such tight latency requirements as we do.&lt;br /&gt;
&lt;br /&gt;
= Scaling =&lt;br /&gt;
&lt;br /&gt;
Given that we haven&#039;t found any system that provides seamless scaling along the axis of queues, we have come up with some designs for how the system could be partitioned.  Any partition scheme is a bit of a downer because then the clients have to know about the partitioning.&lt;br /&gt;
&lt;br /&gt;
The best way to partition is probably to partition on routing key.  When a client wants to receive messages for a routing key, or when a sender wants to send to a routing key, the first thing it does is ask a redirector which slice to talk to. The system would look like:&lt;br /&gt;
&lt;br /&gt;
[[Image:Message_queue_partition_unclustered.png]]&lt;br /&gt;
&lt;br /&gt;
This system has the property that each client will be talking to as many slices as routing keys of interest (proportional, anyhow).  This may be acceptable for an application where there&#039;s only a finite number of routing keys that any particular client may be interested in (such as group chat, where there&#039;s an upper limit on the number of groups a resident may be in).&lt;br /&gt;
&lt;br /&gt;
We could cut down on the sheer quantity of connections by using clustering to reduce the number of slices.  The messaging technologies we looked at support clustering in a way that would allow us to create clusters of 2-3 nodes that have roughly 1.5-2 times the quantity of queues as a single node.  This would be a more complex system than not using clustering at all, but it would reduce the number of slices, and thus connections, by a factor of 1.5-2, which may be important.&lt;br /&gt;
&lt;br /&gt;
[[Image:Message_queue_partition_clustered.png]]&lt;br /&gt;
&lt;br /&gt;
The clustered partition scheme isn&#039;t fundamentally different than the unclustered partition scheme, it&#039;s just a constant-factor optimization.  However, if the cluster added high-availability properties (such as being able to continue running even when one node fails), then it would be worth it.&lt;br /&gt;
&lt;br /&gt;
= Currently Available Software =&lt;br /&gt;
&lt;br /&gt;
== AMQ Protocol ==&lt;br /&gt;
&lt;br /&gt;
AMQP is a developing standard that is aimed pretty squarely at our use cases: high-performance, flexible, message routing and delivery.  The standard is being iterated upon and is not finalized yet.  This is a risk factor because it&#039;s a moving target and all current editions are mutually incompatible -- the 0-10 edition is nontrivially different from 0-8, and I&#039;ve read some rumors that the next edition removes or changes some of the core concepts in a dramatic way.&lt;br /&gt;
&lt;br /&gt;
We believe that AMQP is the appropriate standard for our use cases; therefore we investigated the AMQP servers much more heavily.  Here&#039;s [http://blogs.digitar.com/jjww/2009/01/rabbits-and-warrens/ a decent example] of how to apply AMQP to a particular use case (with emphasis on Rabbit).&lt;br /&gt;
&lt;br /&gt;
* [https://launchpad.net/txamqp Twisted AMQP], a 0-8 and 0-9 Twisted Python client&lt;br /&gt;
* [http://hopper.squarespace.com/blog/2008/6/21/build-your-own-amqp-client.html Build your Own AMQP Client]&lt;br /&gt;
&lt;br /&gt;
=== RabbitMQ ===&lt;br /&gt;
[http://www.rabbitmq.com/ Rabbit Home]&lt;br /&gt;
&lt;br /&gt;
RabbitMQ is already installed in our image and is currently being deployed by the data warehousing team (Ivan in particular) to handle syslog message delivery.&lt;br /&gt;
&lt;br /&gt;
# Support for consuming messages in our two main languages, Python and C++?&lt;br /&gt;
#* python only, apparently!&lt;br /&gt;
# Support for producing them in all of our main languages (or e.g. an HTTP gateway)&lt;br /&gt;
#* Yes, they have HTTP and Stomp gateways.&lt;br /&gt;
# What&#039;s the raw message rate that a single server can handle at different message sizes (e.g. 1 byte, 128 bytes, 1K, 128K)?&lt;br /&gt;
#* Not investigated because widespread reports indicate that this number is very high; this will not be a bottleneck.&lt;br /&gt;
# What are the latency figures for these message rates?&lt;br /&gt;
#* Latency is in tens of microseconds.&lt;br /&gt;
# What are the server&#039;s clustering characteristics?&lt;br /&gt;
#* HA/failover&lt;br /&gt;
#** Weak.  If clustered, the cluster behaves poorly when nodes go away, until their data is restored; see [http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2009-February/003338.html].  The developers suggested setting up two queues on two hosts and doing client-side duplicate removal, but this seems like we&#039;d be doing work that the message queue system should be doing for us.&lt;br /&gt;
#* scalability for message quantity&lt;br /&gt;
#** Untested but theoretically clustering improves this.&lt;br /&gt;
#* scalability for number of clients/queues &lt;br /&gt;
#** Not supported.  Currently a single Rabbit node will support up to 250,000 queues before consuming all available memory.  If clustered with a second host, the second host will have 800 MB of its memory consumed as well even though it&#039;s not doing any work.  This is because all hosts in a cluster contain a complete copy of the routing tables.  The data structures required for queues themselves are stored on the first host, and consume the other 1200 MB available.  This implies that if queues were evenly added to both hosts, we could probably get up to around 400,000 queues total.  We&#039;d like to test that hypothesis.&lt;br /&gt;
# What about cross-colo traffic?&lt;br /&gt;
#* Not if hosts in a cluster are cross-colo from each other.  There&#039;s [http://hopper.squarespace.com/blog/2008/6/22/introducing-shovel-an-amqp-relay.html a plugin called shovel] that is explicitly designed for cross-colo situations, though.  However, if clustering doesn&#039;t support the number of queues we want, there&#039;s little reason to worry about clusters that span colos.  The wire protocol is believed to be robust against flaky connections; it&#039;s hard to test that though.&lt;br /&gt;
# Does it do SSL, does it need tunneling, is it designed to deal with interrupted communications?&lt;br /&gt;
#* [http://www.rabbitmq.com/api-guide.html#ssl Supports SSL], however this appears to be both outside of the spec and a bit of a hack.  AMQP as a whole doesn&#039;t yet have an ssl story, so we&#039;d have to go outside the spec to achieve security.&lt;br /&gt;
# How do the health of the protocol standard, the software, and the community look?&lt;br /&gt;
#* Strong.  Rabbit in particular has a relatively strong community -- ~500 messages per month on mailing list and key developers respond frequently.&lt;br /&gt;
# Can we engage people on support and development contracts if necessary?&lt;br /&gt;
#* Yes, we already have contacts with them and have already gotten enhancements.&lt;br /&gt;
# Is it possible to set up persistent queues, where undelivered messages will survive server restarts?&lt;br /&gt;
#* Yes.  These are not replicated.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* ~5000 lines of code (i.e. not many places to hide bugs)&lt;br /&gt;
* Queues can fill up available memory if clients can&#039;t consume non-immediate messages quickly enough (immediate messages get discarded if a client can&#039;t consume them).&lt;br /&gt;
* [http://forum.trapexit.org/mailinglists/viewtopic.php?p=42890&amp;amp;sid=cb78a92ab50adefbf60e3770c0ba7e9b RabbitMQ Performance Testing and Troubles]&lt;br /&gt;
* Even in clustered configuration, queues only reside on a single machine.&lt;br /&gt;
* [http://hopper.squarespace.com/ Blog oriented towards Rabbit]&lt;br /&gt;
* http://everburning.com/news/tag/amqp/ Ruby-oriented but examples are pretty clear&lt;br /&gt;
* http://www.somic.org/d/samovskiy-amqp-rabbitmq-cohesiveft.pdf&lt;br /&gt;
* http://somic.org/2008/11/11/using-rabbitmq-beyond-queueing/&lt;br /&gt;
* http://www.lshift.net/blog/category/lshift-sw/rabbitmq/&lt;br /&gt;
* In our tests, if you create a bunch of auto-delete queues (~100), the rabbit server becomes unresponsive for 2 minutes after you remove the clients (presumably because the server starts deleting the queues when you remove the clients).  We generally have to restart the server.  This may be problematic in production; we should generate a test case that repros this.&lt;br /&gt;
* py-amqplib requires Python &amp;gt;2.4&lt;br /&gt;
* Collected data: http://spreadsheets.google.com/a/lindenlab.com/ccc?key=p0_PzEgG1YZeKbg_y4n1nFg&lt;br /&gt;
* Restarting individual hosts in a cluster is seamless -- it totally comes back together without any extra work, yay.&lt;br /&gt;
* Rabbit (and mnesia) is very sensitive to DHCP/DNS failures.  We had a DHCP failure on our host, and it corrupted everything, leading to rogue beam processes and messed up mnesia files.  Had to nuke everything.&lt;br /&gt;
* HA by creating multiple queues on multiple hosts: http://www.nabble.com/Re:-Q-replication-anxiety-p21953124.html&lt;br /&gt;
* Discussing huge numbers of queues: http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2009-February/003431.html&lt;br /&gt;
* Discussion about what happens when one node in a cluster goes away, and how it&#039;s less than ideal: http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2009-February/003338.html&lt;br /&gt;
&lt;br /&gt;
=== Apache QPID/Red Hat MRG ===&lt;br /&gt;
http://cwiki.apache.org/confluence/display/qpid/Index&lt;br /&gt;
http://www.redhat.com/mrg/&lt;br /&gt;
&lt;br /&gt;
QPID is sort of a compilation project from Apache.  They have a pile of clients, and two brokers that each support different versions of the AMQP standard.  The C++ broker appears to be where the good stuff is at.  Installing it was not difficult -- it only required a few additional Boost libraries to be installed.&lt;br /&gt;
&lt;br /&gt;
# Support for consuming messages in our two main languages, Python and C++&lt;br /&gt;
#* Yes, comes bundled with clients in both.&lt;br /&gt;
# Support for producing them in all of our main languages (or e.g. an HTTP gateway)&lt;br /&gt;
#* No, only python and C++.&lt;br /&gt;
# What&#039;s the raw message rate that a single server can handle at different message sizes (e.g. 1 byte, 128 bytes, 1K, 128K)?&lt;br /&gt;
#* Untested; again, not likely to be a bottleneck.&lt;br /&gt;
# What are the latency figures for these message rates?&lt;br /&gt;
#* Untested, it comes with a perftest tool that we should run.&lt;br /&gt;
# What are the server&#039;s clustering characteristics?&lt;br /&gt;
#* HA/failover&lt;br /&gt;
#** [http://cwiki.apache.org/confluence/display/qpid/queue+state+replication Queue Replication] could be used in conjunction with [http://qpid.apache.org/connection-url-format.html client failover] to implement HA queues.  Untested.&lt;br /&gt;
#* scalability for message quantity&lt;br /&gt;
#** Unknown.&lt;br /&gt;
#* scalability for number of clients/queues &lt;br /&gt;
#** The C++ broker tops out at around 500,000 queues per host.  We haven&#039;t yet determined whether this number can be increased by [http://cwiki.apache.org/confluence/display/qpid/Using+Broker+Federation clustering/federation].&lt;br /&gt;
# What about cross-colo traffic?  Does it do SSL, does it need tunneling, is it designed to deal with interrupted communications?&lt;br /&gt;
#* Same as rabbit; these questions are properties of AMQP.&lt;br /&gt;
# How do the health of the protocol standard, the software, and the community look?&lt;br /&gt;
#* Relatively small community, though active.  721 messages to qpid-dev list in December 2008, though 90% seem to be JIRA spam; only 71 to qpid-users.&lt;br /&gt;
# Can we engage people on support and development contracts if necessary?&lt;br /&gt;
#* Red Hat supports a version called MRG -- unknown whether we could get them to help us use it on Debian.  ;-)&lt;br /&gt;
# Is it possible to set up persistent queues, where undelivered messages will survive server restarts?&lt;br /&gt;
#* Yes.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* MRG is based on QPID, per [http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_MRG/1.0/html/Messaging_Installation_Guide/sect-Messaging_Installation_Guide-Installing_RHM-Installing_RHM_on_RHEL5.html this page].&lt;br /&gt;
* Client libs: C++, Java, Ruby, Python, C#.  Only the C++ client appears to have any documentation.&lt;br /&gt;
* http://cwiki.apache.org/confluence/display/qpid/Documentation  &amp;lt;-- this link was surprisingly hard to find&lt;br /&gt;
* Python client is annoying to use.  Before even getting started you have to set an environment variable pointing at the spec (&amp;lt;code&amp;gt;export AMQP_SPEC=/tmp/qpid/qpid-M4/specs/amqp.0-10.xml&amp;lt;/code&amp;gt;) and modify the spec file itself to point at the DTD because relative paths don&#039;t work for some reason.  The code is written poorly; no comments, run-on functions, uses long-deprecated things like raise &amp;quot;string&amp;quot; everywhere.  Also, it&#039;s slow as hell starting up and at runtime.  Finding another 0-10 compatible python client would be important.&lt;br /&gt;
&lt;br /&gt;
=== OpenAMQ ===&lt;br /&gt;
http://www.openamq.org/&lt;br /&gt;
{| class=&amp;quot;messagebox standard-talk&amp;quot; style=&amp;quot;border: 1px solid #DD8888;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Image:Exclamation.png|Eliminated]]&lt;br /&gt;
|align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot;| This product has been eliminated from the race&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* http://www.openamq.org/doc:user-3-advanced&lt;br /&gt;
* Supports HA via primary/secondary failover, EXCEPT &amp;quot;What we do not attempt to do includes: ... The handling of persistent messages or transactions in any way.....Replication of exchanges, queues, bindings, or messages between servers. All server-side state much be recreated by applications when they fail over.&amp;quot;&lt;br /&gt;
* HA support is mutually exclusive from federation support.&lt;br /&gt;
* Supports federation; we&#039;d want to use the &amp;quot;locator&amp;quot; federation type.&lt;br /&gt;
* Seems immature; few docs, not a strong community -- however, it&#039;s actually pretty old.&lt;br /&gt;
* Implements a subset of AMQP 0.9&lt;br /&gt;
* http://amqp.wdfiles.com/local--files/deleted:library:cluster/clustering.pdf&lt;br /&gt;
* Java centric, no bindings for other languages we love to use.&lt;br /&gt;
&lt;br /&gt;
== XMPP ==&lt;br /&gt;
&lt;br /&gt;
=== ejabberd ===&lt;br /&gt;
http://www.ejabberd.im/&lt;br /&gt;
{| class=&amp;quot;messagebox standard-talk&amp;quot; style=&amp;quot;border: 1px solid #DD8888;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Image:Exclamation.png|Eliminated]]&lt;br /&gt;
|align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot;| This product has NOT been eliminated, but we did not evaluate it for want of time.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Clients: http://www.jabber.org/web/Clients&lt;br /&gt;
&lt;br /&gt;
* Widely deployed and super-popular.&lt;br /&gt;
* XMPP seems to not be the best fit for generic applications -- it seems that it only solves the group-chat and person-to-person IM cases.&lt;br /&gt;
&lt;br /&gt;
==== AMP Extension ====&lt;br /&gt;
http://xmpp.org/extensions/xep-0079.html &lt;br /&gt;
Message queue extension, available for ejabberd via [https://support.process-one.net/browse/EJAB-449 this patch].  &lt;br /&gt;
&lt;br /&gt;
This extension adds:&lt;br /&gt;
* Reliable data transport -- the sender requires notification (positive and/or negative) of message delivery.&lt;br /&gt;
* Time-sensitive messages -- the message is valid only until a certain date and time.&lt;br /&gt;
* Transient messages -- the message should not be stored offline for later delivery.&lt;br /&gt;
&lt;br /&gt;
The AMP extension is immature and has no client support -- we&#039;d be going it ourselves if we wanted to use that.  We might decide that we don&#039;t need the AMP extension&#039;s semantics.&lt;br /&gt;
&lt;br /&gt;
==== PubSub Extension ====&lt;br /&gt;
&lt;br /&gt;
http://www.ejabberd.im/mod_pubsub-usage&lt;br /&gt;
&lt;br /&gt;
http://ppolv.wordpress.com/2007/11/28/managing-a-jabber-pubsub-service/&lt;br /&gt;
&lt;br /&gt;
Doesn&#039;t seem to be client support for this, but it&#039;s probably better than AMP extension client support and I haven&#039;t looked especially hard yet.&lt;br /&gt;
&lt;br /&gt;
== Stomp ==&lt;br /&gt;
Products that support primarily the Stomp protocol.&lt;br /&gt;
&lt;br /&gt;
http://stomp.codehaus.org/Protocol&lt;br /&gt;
&lt;br /&gt;
Stomp is a message passing scheme that is tremendously simple.  It kinda looks like HTTP, but it&#039;s actually even simpler.  The simplicity is both a strength and a weakness.&lt;br /&gt;
* Human-readable&lt;br /&gt;
* Requires null-termination of message bodies; the spec implies that it&#039;s OK to include nulls in the message body if a content-length header is included, but if the header is not supplied nulls are not acceptable.  [http://cometdaily.com/2008/10/08/scalable-real-time-web-architecture-part-1-stomp-comet-and-message-queues/ This article] and subsequent discussion is interesting.&lt;br /&gt;
* Underspecified header syntax means implementations might differ w.r.t. all-dashes, spaces between : and header body, capitalization, etc.&lt;br /&gt;
&lt;br /&gt;
There are stomp clients written in nearly every language; since the protocol is so simple it seems as if people write new clients whenever they encounter even the slightest problem with someone else&#039;s client.&lt;br /&gt;
* stomp.py -- nicely written, but seems to be just barely maintained by a guy who doesn&#039;t really use it any more.  Its error reporting sucks (prints java exceptions to stdout, doesn&#039;t give any feedback to python program).  But it works!&lt;br /&gt;
&lt;br /&gt;
=== ActiveMQ ===&lt;br /&gt;
http://activemq.apache.org/&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;messagebox standard-talk&amp;quot; style=&amp;quot;border: 1px solid #DD8888;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Image:Exclamation.png|Eliminated]]&lt;br /&gt;
|align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot;|This product has been eliminated from the race&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Related Jira : &amp;lt;jira&amp;gt;DEV-19958&amp;lt;/jira&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* HA via master/slave failover built-in: http://activemq.apache.org/masterslave.html  It&#039;s not great, but it&#039;s better than &amp;quot;you lost all your shit!&amp;quot;&lt;br /&gt;
* Does not support AMQP (how did we miss this earlier?)&lt;br /&gt;
* Clustering built-in with autodiscovery.  It&#039;s very nice to start up activemq on two machines and see them find each other automagically.&lt;br /&gt;
* Broker fails after opening 700 queues on a node due to too many open files -- apparently it has a tempfile for each queue, and an open file for each JAR (of which there are 124!), and 60 miscellaneous filehandles.  The number of open files does not decrease when the client quits.  Some googling implies that there are numerous bugs in ActiveMQ relating to leaked filehandles.  &lt;br /&gt;
* Even if you cluster two nodes together, each created subscription opens a new filehandle on both nodes in the cluster!  This means that the total number of queues creatable in a clustered system is very small.&lt;br /&gt;
&lt;br /&gt;
=== Sprinkle ===&lt;br /&gt;
&lt;br /&gt;
http://www.thuswise.org/sprinkle/index.html&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;messagebox standard-talk&amp;quot; style=&amp;quot;border: 1px solid #DD8888;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Image:Exclamation.png|Eliminated]]&lt;br /&gt;
|align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot;|This product has been eliminated from the race&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Consumes 100% of CPU when idle.&lt;br /&gt;
* Requires an external process to create a new directory for each queue -- no way to create queues by talking to the server (unless you hook up a demon listening to a special meta-queue for messages to create new queues...an approach that is appealing in its purity, but...no)&lt;br /&gt;
&lt;br /&gt;
== JMS ==&lt;br /&gt;
&lt;br /&gt;
JMS is a Java API for asynchronous messaging.  In a charming bit of java-centrism it specifies the API that a java program sees, but not a wire protocol or anything like that; I can only assume that each client is intended to develop its own custom wire protocol for talking to the broker, but there isn&#039;t much information about this out there.  Some of the clients that support Stomp or AMQP also support some subset of JMS, and presumably the JMS API simply uses Stomp or AMQP as the wire protocol.  The development of the wire protocols have been influenced somewhat by the needs of JMS.&lt;br /&gt;
&lt;br /&gt;
=== OpenMQ ===&lt;br /&gt;
&lt;br /&gt;
https://mq.dev.java.net/about.html&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;messagebox standard-talk&amp;quot; style=&amp;quot;border: 1px solid #DD8888;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Image:Exclamation.png|Eliminated]]&lt;br /&gt;
|align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot;|This product has been eliminated from the race&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Very java-specific.&lt;br /&gt;
* This is the free version of [http://www.sun.com/software/products/message_queue/index.xml Java System Message Queue]&lt;br /&gt;
* JMS only.&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
Products that have their own protocol.  These are generally less interesting to us because they are already at a disadvantage relative to implementations of a particular protocol in terms of community size, possibility of paid support, and being able to replace them with a different implementation if the need arises.  However, we still take these into consideration in the hopes of finding a diamond in the rough.&lt;br /&gt;
&lt;br /&gt;
=== Gearman ===&lt;br /&gt;
&lt;br /&gt;
http://www.danga.com/gearman/&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;messagebox standard-talk&amp;quot; style=&amp;quot;border: 1px solid #DD8888;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Image:Exclamation.png|Eliminated]]&lt;br /&gt;
|align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot;|This product has been eliminated from the race&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Gearman is a system to farm out work to other machines, dispatching function calls to machines that are better suited to do work, to do work in parallel, to load balance lots of function calls, or to call functions between languages.&amp;quot;&lt;br /&gt;
* Not really what we&#039;re looking for.&lt;br /&gt;
&lt;br /&gt;
=== Amazon SQS ===&lt;br /&gt;
http://aws.amazon.com/sqs/&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;messagebox standard-talk&amp;quot; style=&amp;quot;border: 1px solid #DD8888;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Image:Exclamation.png|Eliminated]]&lt;br /&gt;
|align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot;|This product has been eliminated from the race&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* [http://notes.variogr.am/post/67710296/replacing-amazon-sqs-with-something-faster-and-cheaper Performance 40x slower than rabbitmq]&lt;br /&gt;
* External hosting raises troubling questions about security/privacy, and the ability of our operations team to handle failure cases (i.e. if SQS goes down we are SOL unless we separately maintain our own compatible farm of servers, in which case we gain little in operational savings)&lt;br /&gt;
* External hosting adds non-negligible latency&lt;br /&gt;
&lt;br /&gt;
=== beanstalkd ===&lt;br /&gt;
http://xph.us/software/beanstalkd/&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;messagebox standard-talk&amp;quot; style=&amp;quot;border: 1px solid #DD8888;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Image:Exclamation.png|Eliminated]]&lt;br /&gt;
|align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot;| This product has been eliminated from the race.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Client libs in Python (2.5), PHP, Perl, but not C++.&lt;br /&gt;
* No persistent queues, but one of the touted features is preservation of queue state between server restarts/crashes.&lt;br /&gt;
* Here&#039;s the protocol doc: http://github.com/kr/beanstalkd/tree/v1.1/doc/protocol.txt?raw=true&lt;br /&gt;
* Immature&lt;br /&gt;
* Works only with Python-2.6, which is two versions above the installed version on etch.&lt;br /&gt;
&lt;br /&gt;
=== Peafowl ===&lt;br /&gt;
http://code.google.com/p/peafowl/&lt;br /&gt;
(A light weight server for reliable distributed message passing.)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;messagebox standard-talk&amp;quot; style=&amp;quot;border: 1px solid #DD8888;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Image:Exclamation.png|Eliminated]]&lt;br /&gt;
|align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot;| This product has been eliminated prima facie from the race.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Uses memcache protocol, which is not a message queueing protocol.  The argument that we should be using a message queueing protocol rather than a key-value protocol is convincing to us.  The impedance mismatch between what the memcache protocol is trying to do and what we want out of a message queue system is quite large and it seems our effort is better spent trying to find something that is designed for the purpose.&lt;br /&gt;
&lt;br /&gt;
=== Starling ===&lt;br /&gt;
http://rubyforge.org/projects/starling/&lt;br /&gt;
&lt;br /&gt;
Persistent Message Queue, in Ruby though&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;messagebox standard-talk&amp;quot; style=&amp;quot;border: 1px solid #DD8888;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Image:Exclamation.png|Eliminated]]&lt;br /&gt;
|align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot;| This product has been eliminated prima facie from the race.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SMTP ===&lt;br /&gt;
&lt;br /&gt;
http://www.ietf.org/rfc/rfc2821.txt&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;messagebox standard-talk&amp;quot; style=&amp;quot;border: 1px solid #DD8888;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Image:Exclamation.png|Eliminated]]&lt;br /&gt;
|align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot;| Ha ha we&#039;re just kidding.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Very mature protocol&lt;br /&gt;
* Many vendors&lt;br /&gt;
* Huge community&lt;br /&gt;
* Persistent queues only - no support for transient queues&lt;br /&gt;
* No built-in CreateQueue/DeleteQueue operations&lt;br /&gt;
* No support for transactional messages&lt;br /&gt;
* Many failure modes will result in multiple delivery of messages&lt;br /&gt;
&lt;br /&gt;
=== Zero MQ ===&lt;br /&gt;
&lt;br /&gt;
http://www.zeromq.org/&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;messagebox standard-talk&amp;quot; style=&amp;quot;border: 1px solid #DD8888;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|[[Image:Exclamation.png|Eliminated]]&lt;br /&gt;
|align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot;|This product has been eliminated from the race. Read &amp;quot;NOTE&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* From above page: ØMQ is already very fast. We&#039;re getting 13.4 microseconds end-to-end latencies and up to 4,100,000 messages a second today.&lt;br /&gt;
* Papers on Tests - http://www.zeromq.org/area:results&lt;br /&gt;
* Not based on [http://amqp.org AMQP] and has an AMQP plugin.&lt;br /&gt;
* Chat example: http://www.zeromq.org/code:examples-chat&lt;br /&gt;
* Python module&#039;s API is currently much simpler when compared to original C++ API. The difference is that Python module doesn&#039;t allow for full control of ØMQ threading as C++ does. Instead, the Python module extension creates single I/O thread that can be accessed from a single application thread. This doesn&#039;t allow for seamless scaling on multicore boxes. However, it is our intent to expose full ØMQ API via Python in the future.&lt;br /&gt;
* &amp;lt;b&amp;gt;NOTE&amp;lt;/b&amp;gt;: It looks like the python 0mq extension is broken. The sending and receiving functions work only when they are performed within the same Python process (probably has something to do with the above note about the module API in Python)&lt;br /&gt;
* &amp;lt;b&amp;gt;UPDATE to NOTE&amp;lt;/b&amp;gt;: Python extension works as advertised using the trunk version. Using this, it was possible to generate 100000 queues, for 4 &#039;clients&#039;, and the zmq_server did not bog down the CPU (in fact it hovered around 2%)&lt;br /&gt;
* Java wrapper does not work as it fails at &amp;lt;code&amp;gt;System.loadLibrary()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Reading/Related Links =&lt;br /&gt;
&lt;br /&gt;
* [http://jeremy.zawodny.com/blog/archives/010511.html Open Source Queueing and Messaging Systems?]&lt;br /&gt;
* [http://www.cse.ohio-state.edu/~narravul/papers/subramoni_whpcf08.pdf MQP Benchmarking]&lt;br /&gt;
* [http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2008-June/001290.html AMQP vs XMPP/RabbitMQ vs ejabberd]&lt;/div&gt;</summary>
		<author><name>Lex Neva</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Bug_triage/2008-08-25&amp;diff=89700</id>
		<title>Bug triage/2008-08-25</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Bug_triage/2008-08-25&amp;diff=89700"/>
		<updated>2008-09-05T02:55:55Z</updated>

		<summary type="html">&lt;p&gt;Lex Neva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- Edit below to add or change issues.  To update the future formatting and text of this page, change [[Template:Triage Template]] instead. --&amp;gt;{{Bug triage}}&lt;br /&gt;
&lt;br /&gt;
Next meeting: 2008-08-25 at 12 PM SLT at {{SLurl|region=Hippotropolis|x=241|y=27|z=23|title=Hippotropolis Meeting area}}.  See [[Bug triage]] for details.&lt;br /&gt;
&lt;br /&gt;
== Fast Track Import ==&lt;br /&gt;
&lt;br /&gt;
(Move bugs here that have solid repros, or valid patches that you have reviewed)&lt;br /&gt;
&lt;br /&gt;
* {{jira|VWR-9023}} - Votes: 1 - llResetScript in touch_start() results in double touch_start() event&lt;br /&gt;
* {{jira|SVC-2990}} - Votes: 6 - Listen events persist between states in LSL2&lt;br /&gt;
&lt;br /&gt;
== Hot by Vote ==&lt;br /&gt;
[http://www.sljirastats.com/jira_search.php?search=33&amp;amp;output=wiki High Voted Bugs]&lt;br /&gt;
&lt;br /&gt;
* {{jira|VWR-7509}} - Votes: 11 - Script error when alot of sounds are playing - {{User|Iexo Bethune}}&lt;br /&gt;
** Requested the maker and model of the plane for testing&lt;br /&gt;
* {{jira|VWR-8717}} - Votes: 22 - Crashes after login when using ATI Catalyst 8.8 - {{User|Dandare Daniels}}&lt;br /&gt;
** Imported - Assigned to Zen Linden&lt;br /&gt;
* {{jira|VWR-8337}} - Votes: 33 - Slows to 1 frame every 2 sec after login in the second time - {{User|skidz tweak}}&lt;br /&gt;
** Resolved - Duplicate of {{jira|VWR-8717}}&lt;br /&gt;
* {{jira|VWR-5949}} - Votes: 15 - Out of Memory Error 1.19.1.2/3/4 - {{User|alan edelman}}&lt;br /&gt;
** Last triaged date added&lt;br /&gt;
&lt;br /&gt;
== Patches ==&lt;br /&gt;
[http://www.sljirastats.com/jira_search.php?search=34&amp;amp;output=wiki Patches]&lt;br /&gt;
&lt;br /&gt;
* {{jira|VWR-2710}} - Votes: 2 - Turkish Beta Language Pack For Second Life Viewer - {{User|Vixen Heron}}&lt;br /&gt;
** asked to have a post when the file has been updated&lt;br /&gt;
&lt;br /&gt;
== Misc Pool ==&lt;br /&gt;
[http://www.sljirastats.com/jira_search.php?search=35&amp;amp;output=wiki Misc Pool]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* {{jira|VWR-8761}} - Votes: 0 - Object description change to null is not saved - {{User|Gellan Glenelg}}&lt;br /&gt;
** Imported - Viewer&lt;br /&gt;
* {{jira|VWR-8283}} - Votes: 0 - UI scales in windowed mode, even if deselected - {{User|Lanita Wingtips}}&lt;br /&gt;
** Changed to Feature request&lt;br /&gt;
&lt;br /&gt;
== Pre-meeting activity ==&lt;br /&gt;
&lt;br /&gt;
Some issues will be resolved in the course of building this agenda.  Rather than deleting them from the proposed agenda, move the issue and associated discussion into the appropriate section below.&lt;br /&gt;
&lt;br /&gt;
=== Imported ===&lt;br /&gt;
&lt;br /&gt;
=== Resolved ===&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
Transcript is/will be at [[{{PAGENAME}}/Transcript]]&lt;br /&gt;
&lt;br /&gt;
== Creating An Agenda ==&lt;br /&gt;
{{Bug List Instructions}}&lt;/div&gt;</summary>
		<author><name>Lex Neva</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:Limits&amp;diff=76446</id>
		<title>Talk:Limits</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:Limits&amp;diff=76446"/>
		<updated>2008-07-05T17:31:19Z</updated>

		<summary type="html">&lt;p&gt;Lex Neva: New page: This page says that the number of people in an estate ban list is limited to 500.  As far as I know, it&amp;#039;s been 300 for a year or so.  Did this change recently, maybe in the RC client? ~~~~&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page says that the number of people in an estate ban list is limited to 500.  As far as I know, it&#039;s been 300 for a year or so.  Did this change recently, maybe in the RC client? [[User:Lex Neva|Lex Neva]] 10:31, 5 July 2008 (PDT)&lt;/div&gt;</summary>
		<author><name>Lex Neva</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlMessageLinked&amp;diff=67447</id>
		<title>LlMessageLinked</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlMessageLinked&amp;diff=67447"/>
		<updated>2008-05-15T18:23:51Z</updated>

		<summary type="html">&lt;p&gt;Lex Neva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Function/link}}{{LSL_Function&lt;br /&gt;
|func_id=164|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llMessageLinked|sort=MessageLinked&lt;br /&gt;
|p1_type=integer|p1_name=linknum|p1_desc=Link number or a LINK_* flag.&lt;br /&gt;
|p2_type=integer|p2_name=num|p2_desc=Value of the second parameter of the resulting link_message event.&lt;br /&gt;
|p3_type=string|p3_name=str|p3_desc=Value of the third parameter of the resulting link_message event.&lt;br /&gt;
|p4_type=key|p4_name=id|p4_desc=Value of the forth parameter of the resulting link_message event.&lt;br /&gt;
|func_desc=Triggers a [[link_message]] event with the parameters &#039;&#039;&#039;num&#039;&#039;&#039;, &#039;&#039;&#039;str&#039;&#039;&#039;, and &#039;&#039;&#039;id&#039;&#039;&#039; in all scripts in the prim(s) described by &#039;&#039;&#039;linknum&#039;&#039;&#039;. The purpose of this function is to provide same object prim to prim communication.&lt;br /&gt;
|func_footer=You can use &#039;&#039;&#039;id&#039;&#039;&#039; as a second string field (in LSL the [[key]] type is implemented as a [[string]] with just custom operators). Typecasting between string and key types has no effect on the data contained. The sizes of &#039;&#039;&#039;str&#039;&#039;&#039; and &#039;&#039;&#039;id&#039;&#039;&#039; are only limited by available script memory.&lt;br /&gt;
|constants&lt;br /&gt;
|func_footnote&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=*A script can hear its own linked messages if &#039;&#039;&#039;linknum&#039;&#039;&#039; would target the prim it is in (for example, LINK_SET). This creates the possibility of an infinite loop (a bad thing); be very careful about how messages are handled and passed along.&lt;br /&gt;
* Messages sent via llMessageLinked to a script that is [[llSleep|sleeping]], [[LSL Delay|delayed]], or [[lag|lagged]], are queued until the end of the delay. The event queue can hold 64 events.&lt;br /&gt;
** If an event is received and the queue is full the event is silently dropped.&lt;br /&gt;
** It is possible to generate a script VM lag spike if the message is received by many scripts. This typically occurs when using LINK_SET, LINK_ALL_OTHERS, &amp;amp; LINK_ALL_CHILDREN as &#039;&#039;&#039;link_num&#039;&#039;&#039;. Script execution can slow or halts. If multiple messages are sent one after another, the lag can cause the event queue to fill.&lt;br /&gt;
** Avoid sending link_messages to large numbers of scripts simultaneously.&lt;br /&gt;
** Avoid sending link_messages to a target faster then they can be handled.&lt;br /&gt;
* When a script [[state]] change, all pending events are deleted, including queued link_messages.&lt;br /&gt;
* If &#039;&#039;&#039;link_num&#039;&#039;&#039; is an invalid link number then the function silently fails.&lt;br /&gt;
|examples=&amp;lt;lsl&amp;gt;default{ // assumptions  // object name: LSLWiki // script name: _lslwiki&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 0, llGetScriptName(), &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string msg, key id) {&lt;br /&gt;
        llOwnerSay(msg);&lt;br /&gt;
        // the owner of object LSLWiki will hear&lt;br /&gt;
        // LSLWiki:_lslwiki&lt;br /&gt;
    }    &lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|helpers=&amp;lt;lsl&amp;gt;default&lt;br /&gt;
{ // Quick and dirty debugging link_messages&lt;br /&gt;
    link_message(integer sender_num, integer num, string msg, key id) {&lt;br /&gt;
        llSay(DEBUG_CHANNEL, llList2CSV([sender_num, num, msg, id]));&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;// This is just an example script, you shouldn&#039;t handle link message within single script this way.&lt;br /&gt;
&lt;br /&gt;
default{ // To propagate an unlimted number of arguments of any type.&lt;br /&gt;
	 // Presumed, the separator string isn&#039;t used in any source string!&lt;br /&gt;
    state_entry() {    &lt;br /&gt;
        list my_list = [1, 2.0, &amp;quot;a string&amp;quot;, &amp;lt;1, 2, 3&amp;gt;, &amp;lt;1, 2, 3, 4&amp;gt;, llGetOwner()];  &lt;br /&gt;
        string list_parameter = llDumpList2String(my_list, &amp;quot;|&amp;quot;);	// Typecast list to a string&lt;br /&gt;
        llMessageLinked(LINK_THIS, 0, list_parameter, &amp;quot;&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string list_argument, key id) {&lt;br /&gt;
        list re_list = llParseString2List(list_argument, [&amp;quot;|&amp;quot;], []);	// Typecast string back to a list&lt;br /&gt;
    }    &lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|also_header&lt;br /&gt;
|also_events={{LSL DefineRow||[[link_message]]|}}&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_articles&lt;br /&gt;
|also_footer&lt;br /&gt;
|notes=*Using llMessageLinked in a single prim object allows developers to mitigate some LSL limits by breaking up functionality between cooperating scripts and synchronizing actions. When you do this, be extremely careful not to create infinite loops as mentioned above.&lt;br /&gt;
*Some users have noted occasional failures of linked messages when sending a message to a large number of receiving scripts in different prims using LINK_SET, LINK_ALL_OTHERS, &amp;amp; LINK_ALL_CHILDREN (ie. not all prims receive the message). If you encounter this problem, a workaround is to place all child prim scripts in a single prim, using targeted functions like llSetLinkPrimitiveParams to modify the prim in which the script previously resided, and use a single link message to address them. -- [[User:Void Singer|Void Singer]]&lt;br /&gt;
|cat1=Communications&lt;br /&gt;
|cat2=Link&lt;br /&gt;
|cat3=Link Message&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lex Neva</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlTargetOmega&amp;diff=60480</id>
		<title>LlTargetOmega</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlTargetOmega&amp;diff=60480"/>
		<updated>2008-03-29T17:35:29Z</updated>

		<summary type="html">&lt;p&gt;Lex Neva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Function&lt;br /&gt;
|func_id=133&lt;br /&gt;
|func_sleep=0.0&lt;br /&gt;
|func_energy=10.0&lt;br /&gt;
|func=llTargetOmega&lt;br /&gt;
|p1_type=vector|p1_name=axis|p1_desc=arbitrary axis to rotate the object around&lt;br /&gt;
|p2_type=float|p2_name=spinrate|p2_desc=rate of rotation in radians per second&lt;br /&gt;
|p3_type=float|p3_name=gain|p3_desc=also modulates the final spinrate and disables the rotation behavior if zero&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc=Rotates the object around &#039;&#039;&#039;axis&#039;&#039;&#039; at &#039;&#039;&#039;spinrate&#039;&#039;&#039; * [[llVecMag]](&#039;&#039;&#039;axis&#039;&#039;&#039;) in radians per second with strength &#039;&#039;&#039;gain&#039;&#039;&#039;.&lt;br /&gt;
|examples=&amp;lt;lsl&amp;gt;//rotates the x axis once per second,&lt;br /&gt;
//  rotates the y axis 3 times per second, &lt;br /&gt;
//  rotates the z axis once every two seconds.&lt;br /&gt;
//  combined the rate is about 3.20156 revolutions per second&lt;br /&gt;
&lt;br /&gt;
llTargetOmega(&amp;lt;1.0,3.0,0.5&amp;gt;,TWO_PI,1.0);&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|spec=&lt;br /&gt;
===Physics===&lt;br /&gt;
*If the object is not physical then the effect is entirely client side.&lt;br /&gt;
*If the object is physical then the physical representation is updated regularly.&lt;br /&gt;
===Link Sets===&lt;br /&gt;
*If the script is attached to the root prim, the entire object rotates around the [[Viewer coordinate frames#Region|region]] &#039;&#039;&#039;axis&#039;&#039;&#039;&lt;br /&gt;
**If the object is attached then it rotates around the attachment &#039;&#039;&#039;axis&#039;&#039;&#039;&lt;br /&gt;
*If the script is attached to a child prim, the prim rotates around the [[Viewer coordinate frames#Local|local]] &#039;&#039;&#039;axis&#039;&#039;&#039;&lt;br /&gt;
**A Child prim can rotate around its own &#039;&#039;&#039;axis&#039;&#039;&#039; while the entire object rotates around another &#039;&#039;&#039;axis&#039;&#039;&#039;.&lt;br /&gt;
|caveats=*If the object is not physical then the rotation is only a client side effect and it will collide as non-moving geometry.&lt;br /&gt;
|constants&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|also_tests={{LSL DefineRow||[[llTargetOmega test]]|}}&lt;br /&gt;
|notes=* Use [[llVecNorm]] on &#039;&#039;&#039;axis&#039;&#039;&#039; so that &#039;&#039;&#039;spinrate&#039;&#039;&#039; actually represents the rate of rotation.&lt;br /&gt;
* Set the gain to zero to disable and remove the rotation behavior, eg llTargetOmega(ZERO_VECTOR, 0, 0);&lt;br /&gt;
** A spinrate of 0 with a nonzero gain causes the object to try to stop all spin, rather than simply clearing a previous llTargetOmega() call.  &lt;br /&gt;
|cat1=Physics&lt;br /&gt;
|cat2=Effects&lt;br /&gt;
|cat3=Rotation&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lex Neva</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Bug_triage/2008-02-25&amp;diff=55873</id>
		<title>Bug triage/2008-02-25</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Bug_triage/2008-02-25&amp;diff=55873"/>
		<updated>2008-02-25T19:33:38Z</updated>

		<summary type="html">&lt;p&gt;Lex Neva: /* Misc Pool */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- Edit below to add or change issues.  To update the future formatting and text of this page, change [[Template:Triage Template]] instead. --&amp;gt;{{Bug triage}}&lt;br /&gt;
&lt;br /&gt;
Next meeting: 2008-02-25 at 12 PM SLT at {{SLurl|region=Hippotropolis|x=241|y=27|z=23|title=Hippotropolis Meeting area}}.  See [[Bug triage]] for details.&lt;br /&gt;
&lt;br /&gt;
== Fast Track Import ==&lt;br /&gt;
&lt;br /&gt;
(Move bugs here that have solid repros, or valid patches that you have reviewed)&lt;br /&gt;
&lt;br /&gt;
== Hot by Vote ==&lt;br /&gt;
&lt;br /&gt;
[http://www.sljirastats.com/jira_search.php?search=33&amp;amp;output=wiki High Voted Bugs]&lt;br /&gt;
&lt;br /&gt;
* {{jira|MISC-305}} - Votes: 11 - Parcel Traffic Counts Failing To Update - {{User|Sal Salubrius}}&lt;br /&gt;
* {{jira|VWR-2394}} - Votes: 12 - SLRR Trains Keep Disappearing - {{User|Haravikk Mistral}}&lt;br /&gt;
* {{jira|VWR-2123}} - Votes: 12 - Parcel name shown in menu bar does not match actual parcel information - {{User|Neo Rebus}}&lt;br /&gt;
* {{jira|WEB-493}} - Votes: 17 - Novice users can create issues on JIRA - {{User|Avil Creeggan}}&lt;br /&gt;
* {{jira|SVC-1648}} - Votes: 24 - Push applied to avatar by another avatar&#039;s scripted attachment does nothing in Havok 4 - {{User|RobbyRacoon Olmstead}}&lt;br /&gt;
* {{jira|SVC-255}} - Votes: 14 - Solid, invisible ghost prims - {{User|WarKirby Magojiro}}&lt;br /&gt;
* {{jira|VWR-4727}} - Votes: 11 - 1.19.0 ( 79185 ) intermittent short freezes in client every few seconds - {{User|Dizzy Banjo}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Patches ==&lt;br /&gt;
[http://www.sljirastats.com/jira_search.php?search=34&amp;amp;output=wiki Patches]&lt;br /&gt;
&lt;br /&gt;
* {{jira|VWR-4506}} - Votes: 0 - Implement a unix make install target - {{User|Michelle2 Zenovka}}&lt;br /&gt;
* {{jira|VWR-4022}} - Votes: 0 - Improve image upload robustness - {{User|Haravikk Mistral}}&lt;br /&gt;
* {{jira|VWR-4480}} - Votes: 1 - Keyboard shortcut for Joystick Flycam - pretty please? - {{User|Domchi Underwood}}&lt;br /&gt;
&lt;br /&gt;
== Misc Pool ==&lt;br /&gt;
[http://www.sljirastats.com/jira_search.php?search=35&amp;amp;output=wiki Misc Pool]&lt;br /&gt;
* {{jira|VWR-4790}} - Votes: 0 - TP freezes Viewer must Log out and relog Avatar freezes inworld on Relog  forcing second Relog - {{User|sweet valentine}}&lt;br /&gt;
* {{jira|VWR-4509}} - Votes: 0 - &amp;quot;&amp;quot;Failed to find body part named ... in database.&amp;quot;&amp;quot; - {{User|szia shilova}}&lt;br /&gt;
* {{jira|MISC-922}} - Votes: 0 - Losing friends intermittantly of my list - {{User|Meaghan Winthorpe}}&lt;br /&gt;
* {{jira|SVC-1341}} - Votes: 0 - Mono beta: Large empty loops cause sim to stall. - {{User|davie zinner}}&lt;br /&gt;
* {{jira|VWR-4893}} - Votes: 3 - Latest windlight release causes crashing with NVidia GeForce Go 6400 graphics card even on basic settings. - {{User|Fledhyris Proudhon}}&lt;br /&gt;
* {{jira|VWR-2606}} - Votes: 0 - Appearance mode produces all black avatar texture and messed up preview windows - {{User|Seifert Surface}}&lt;br /&gt;
* {{jira|WEB-330}} - Votes: 0 - Second Life FAQ: &amp;quot;&amp;quot;Is Second Life an MMORPG&amp;quot;&amp;quot; has incorrect response. - {{User|SignpostMarv Martin}}&lt;br /&gt;
* {{jira|VWR-5019}} - Votes: 0 - Programme crashes whenever I am trying to edit my avatar&#039;s appearance - {{User|Caribkat Jaxxon}}&lt;br /&gt;
* {{jira|VWR-4989}} - Votes: 1 - See only blue screen - {{User|annika7 dagger}}&lt;br /&gt;
* {{jira|VWR-4515}} - Votes: 0 - Friends dissappaer from list - no, the other one has NOT deleted me - {{User|Rita Munro}}&lt;br /&gt;
* {{jira|VWR-4514}} - Votes: 0 - money request was stale...or, when buying a FREE item: [13:07]  Buy object failed because you don&#039;t have enough L$. !?!? - {{User|luna fratica}}&lt;br /&gt;
* {{jira|SVC-1237}} - Votes: 0 - WHen I log in, I get to the screen asking me to select my Avatar&#039;s gender, and then the system freezes, and becomes non-responsive if I click again, ever.... - {{User|Caribkat Jaxxon}}&lt;br /&gt;
* {{jira|VWR-4980}} - Votes: 0 - When zooming or panning or even just moving in a confined space, SL windlight viewer loses all graphics. Only the frame remains - {{User|Angel Sunset}}&lt;br /&gt;
* {{jira|SVC-721}} - Votes: 1 - Havok4 Collision Solver occasionally tosses an avatar when crossing a border over prim - {{User|Teravus Ousley}}&lt;br /&gt;
* {{jira|SVC-682}} - Votes: 4 - Objects can enter into No-Object-Entry area. - {{User|Nock Forager}}&lt;br /&gt;
* {{jira|VWR-4516}} - Votes: 0 - Atmospheric shaders go fully white/black from some angles at certain times - {{User|Haravikk Mistral}}&lt;br /&gt;
* {{jira|VWR-4107}} - Votes: 0 - Change the &amp;quot;&amp;quot;background&amp;quot;&amp;quot; color for textures to transparent - {{User|Domchi Underwood}}&lt;br /&gt;
* {{jira|SVC-1467}} - Votes: 8 - PERMISSION_TAKE_CONTROLS doesnt act as designed for scripts in child prims - {{User|Jason Swain}}&lt;br /&gt;
* {{jira|VWR-4914}} - Votes: 0 - Starting 2rd viewer in RC2 or Windlight causes one of the viewers to crash. - {{User|Alyx Jonson}}&lt;br /&gt;
* {{jira|VWR-4500}} - Votes: 3 - You should be automatically landed when entering a &amp;quot;&amp;quot;No Fly&amp;quot;&amp;quot; area - {{User|Mircea Lobo}}&lt;br /&gt;
* {{jira|VWR-4201}} - Votes: 3 - Grabbing prim with llDetectedGrab(), and dragging to the left, rotates camera left. - {{User|Sam Stork}}&lt;br /&gt;
* {{jira|SVC-1570}} - Votes: 0 - Camera position shifts in and out for no reason in Havoc 4 beta region - {{User|traverse janus}}&lt;br /&gt;
* {{jira|SVC-1569}} - Votes: 0 - Whale Product by STARAX no longer working in Havok4 - {{User|chilly charlton}}&lt;br /&gt;
* {{jira|SVC-1144}} - Votes: 2 - replies to offline emails can&#039;t contain unicode - {{User|Lex Neva}}&lt;br /&gt;
* {{jira|VWR-2624}} - Votes: 0 - &amp;lt;select&amp;gt; boxes in web profile sometimes misbehave - {{User|Lex Neva}}&lt;br /&gt;
* {{jira|VWR-815}} - Votes: 3 - cannot change material on link sets - {{User|Lex Neva}}&lt;br /&gt;
* {{jira|SVC-578}} - Votes: 6 - &amp;quot;save object back to object contents&amp;quot; no longer works - {{User|Lex Neva}}&lt;br /&gt;
&lt;br /&gt;
== Pre-meeting activity ==&lt;br /&gt;
&lt;br /&gt;
Some issues will be resolved in the course of building this agenda.  Rather than deleting them from the proposed agenda, move the issue and associated discussion into the appropriate section below.&lt;br /&gt;
&lt;br /&gt;
=== Imported ===&lt;br /&gt;
&lt;br /&gt;
=== Resolved ===&lt;br /&gt;
* {{jira|VWR-4778}} - Votes: 0 - Items I have created with onward modify/copy perms become non mod if they contain an animation that is no mod. - {{User|ActingIll Igaly}}&lt;br /&gt;
:Can&#039;t reproduce - Gigs&lt;br /&gt;
* {{jira|VWR-4987}} - Votes: 0 - Contradictory script reports - {{User|eren padar}}&lt;br /&gt;
:I&#039;m going to work with the sim owner here, deferred from triage for now.&lt;br /&gt;
== Transcript ==&lt;br /&gt;
Transcript is/will be at [[{{PAGENAME}}/Transcript]]&lt;br /&gt;
&lt;br /&gt;
== Creating An Agenda ==&lt;br /&gt;
{{Bug List Instructions}}&lt;/div&gt;</summary>
		<author><name>Lex Neva</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlGetOwner&amp;diff=55659</id>
		<title>LlGetOwner</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlGetOwner&amp;diff=55659"/>
		<updated>2008-02-24T18:16:41Z</updated>

		<summary type="html">&lt;p&gt;Lex Neva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func_id=117|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llGetOwner|sort=GetOwner&lt;br /&gt;
|return_type=key&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc&lt;br /&gt;
|return_text=that is the current owner of the script.&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=*When the owner of an object changes, code that depends on this function&#039;s return value will not automatically update for the new owner or be automatically re-evaluated.&lt;br /&gt;
**This requires the reregistration of [[llListen|listens]] and  [[llRequestPermissions|requesting of permissions]] from the new owner as needed.&lt;br /&gt;
***This is not limited to listens and permissions but anything that caches the return value, it is up to the programmer to work around this limitation.&lt;br /&gt;
**Detection of owner change can be achieved with the [[changed]] event in conjunction with the [[CHANGED_OWNER]] flag (see the first example) or by storing the old value and periodically (e.g. in [[on_rez]]) checking if it has changed. Both techniques are valid though the latter will not detect the sale of the object if it is sold with &amp;quot;sell original&amp;quot; in-world and not picked up.&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&amp;lt;lsl&amp;gt;default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llInstantMessage(llGetOwner(), &amp;quot;Only you can hear me. Isn&#039;t that eerie.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if (change &amp;amp; CHANGED_OWNER)&lt;br /&gt;
            llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llGetCreator]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetOwnerKey]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llDetectedOwner]]|}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Owner&lt;br /&gt;
|cat2=Object&lt;br /&gt;
|cat3=Key&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lex Neva</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlGetOwner&amp;diff=55564</id>
		<title>LlGetOwner</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlGetOwner&amp;diff=55564"/>
		<updated>2008-02-24T04:31:27Z</updated>

		<summary type="html">&lt;p&gt;Lex Neva: removed incorrect information&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func_id=117|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llGetOwner|sort=GetOwner&lt;br /&gt;
|return_type=key&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc&lt;br /&gt;
|return_text=that is the current owner of the script&lt;br /&gt;
&lt;br /&gt;
|spec&lt;br /&gt;
|caveats&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&amp;lt;lsl&amp;gt;default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llInstantMessage(llGetOwner(),&amp;quot;Only you can hear me. Isn&#039;t that eerie.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    changed(integer change){if (change &amp;amp; CHANGED_OWNER){llResetScript();}}&lt;br /&gt;
&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llGetCreator]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetOwnerKey]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llDetectedOwner]]|}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Owner&lt;br /&gt;
|cat2=Object&lt;br /&gt;
|cat3=Key&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lex Neva</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Bug_triage/2008-02-11&amp;diff=53874</id>
		<title>Bug triage/2008-02-11</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Bug_triage/2008-02-11&amp;diff=53874"/>
		<updated>2008-02-13T18:49:52Z</updated>

		<summary type="html">&lt;p&gt;Lex Neva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- Edit below to add or change issues.  To update the future formatting and text of this page, change [[Template:Triage Template]] instead. --&amp;gt;{{Bug triage}}&lt;br /&gt;
&lt;br /&gt;
Next meeting: 2008-XX-XX at TIME and PLACE (FIXME).  See [[Bug triage]] for details.&lt;br /&gt;
&lt;br /&gt;
== Fast Track Import ==&lt;br /&gt;
&lt;br /&gt;
(Move bugs here that have solid repros, or valid patches that you have reviewed)&lt;br /&gt;
&lt;br /&gt;
== Hot by Vote ==&lt;br /&gt;
&lt;br /&gt;
* {{jira|VWR-2123}} - Votes: 12 - Parcel name shown in menu bar does not match actual parcel information - {{User|Neo Rebus}}&lt;br /&gt;
* {{jira|WEB-493}} - Votes: 14 - Novice users can create issues on JIRA - {{User|Avil Creeggan}}&lt;br /&gt;
* {{jira|SVC-255}} - Votes: 14 - Solid, invisible ghost prims - {{User|WarKirby Magojiro}}&lt;br /&gt;
* {{jira|VWR-4741}} - Votes: 11 - llGiveInventoryList only delivers to agents that have been in the same sim with the script at some point in the past. - {{User|Brandon Shinobu}}&lt;br /&gt;
* {{jira|VWR-2999}} - Votes: 13 - Viewer Crashes after every Teleport. - {{User|Rascal Ratelle}}&lt;br /&gt;
* {{jira|MISC-493}} - Votes: 25 - All dialogs should have &amp;quot;&amp;quot;Ignore&amp;quot;&amp;quot; button - {{User|Marcos Fonzarelli}}&lt;br /&gt;
&lt;br /&gt;
== Patches ==&lt;br /&gt;
* {{jira|VWR-4456}} - Votes: 0 - Do not error on gcc warning converting string to const char * - {{User|Michelle2 Zenovka}}&lt;br /&gt;
* {{jira|VWR-4506}} - Votes: 0 - Implement a unix make install target - {{User|Michelle2 Zenovka}}&lt;br /&gt;
&lt;br /&gt;
== Misc Pool ==&lt;br /&gt;
* {{jira|SVC-796}} - Votes: 2 - Crashes when connecting to region upon sign on - {{User|avatar iwish}}&lt;br /&gt;
* {{jira|VWR-4790}} - Votes: 0 - TP freezes Viewer must Log out and relog Avatar freezes inworld on Relog  forcing second Relog - {{User|sweet valentine}}&lt;br /&gt;
* {{jira|VWR-4779}} - Votes: 0 - Group -- Members &amp;amp; Roles Tab doesn&#039;t load, only effects one group - {{User|Malachi Rothschild}}&lt;br /&gt;
* {{jira|VWR-4509}} - Votes: 0 - &amp;quot;&amp;quot;Failed to find body part named ... in database.&amp;quot;&amp;quot; - {{User|szia shilova}}&lt;br /&gt;
* {{jira|VWR-4384}} - Votes: 0 - Viewer Crashes As &amp;quot;&amp;quot;Connecting to Region...&amp;quot;&amp;quot; - {{User|Meghan Dench}}&lt;br /&gt;
* {{jira|SVC-481}} - Votes: 4 - permission sharing between scripts has been broken - {{User|Drew Dwi}}&lt;br /&gt;
* {{jira|MISC-922}} - Votes: 0 - Losing friends intermittantly of my list - {{User|Meaghan Winthorpe}}&lt;br /&gt;
* {{jira|SVC-1341}} - Votes: 0 - Mono beta: Large empty loops cause sim to stall. - {{User|davie zinner}}&lt;br /&gt;
* {{jira|VWR-4778}} - Votes: 0 - Items I have created with onward modify/copy perms become non mod if they contain an animation that is no mod. - {{User|ActingIll Igaly}}&lt;br /&gt;
* {{jira|VWR-4759}} - Votes: 0 - Prismatic rainbow color cycling on primitives - {{User|Millie Thompson}}&lt;br /&gt;
* {{jira|VWR-4770}} - Votes: 0 - Physics being disabled *permenantly* after enabling/disabling it multiple times via SLS (STATUS_PHYSICS, TRUE/FALSE) - {{User|Vittorio Beerbaum}}&lt;br /&gt;
* {{jira|VWR-3893}} - Votes: 2 - everything GLOWS with atmospheric shaders on - {{User|Lillith Anatine}}&lt;br /&gt;
* {{jira|VWR-2123}} - Votes: 12 - Parcel name shown in menu bar does not match actual parcel information - {{User|Neo Rebus}}&lt;br /&gt;
* {{jira|VWR-4727}} - Votes: 5 - 1.19.0 ( 79185 ) intermittent short freezes in client every few seconds - {{User|Dizzy Banjo}}&lt;br /&gt;
* {{jira|WEB-330}} - Votes: 0 - Second Life FAQ: &amp;quot;&amp;quot;Is Second Life an MMORPG&amp;quot;&amp;quot; has incorrect response. - {{User|SignpostMarv Martin}}&lt;br /&gt;
* {{jira|VWR-4515}} - Votes: 0 - Friends dissappaer from list - no, the other one has NOT deleted me - {{User|Rita Munro}}&lt;br /&gt;
* {{jira|VWR-4514}} - Votes: 0 - money request was stale...or, when buying a FREE item: [13:07]  Buy object failed because you don&#039;t have enough L$. !?!? - {{User|luna fratica}}&lt;br /&gt;
* {{jira|SVC-721}} - Votes: 1 - Havok4 Collision Solver occasionally tosses an avatar when crossing a border over prim - {{User|Teravus Ousley}}&lt;br /&gt;
* {{jira|SVC-682}} - Votes: 4 - Objects can enter into No-Object-Entry area. - {{User|Nock Forager}}&lt;br /&gt;
* {{jira|VWR-4516}} - Votes: 0 - Atmospheric shaders go fully white/black from some angles at certain times - {{User|Haravikk Mistral}}&lt;br /&gt;
* {{jira|VWR-4107}} - Votes: 0 - Change the &amp;quot;&amp;quot;background&amp;quot;&amp;quot; color for textures to transparent - {{User|Domchi Underwood}}&lt;br /&gt;
* {{jira|VWR-4201}} - Votes: 3 - Grabbing prim with llDetectedGrab(), and dragging to the left, rotates camera left. - {{User|Sam Stork}}&lt;br /&gt;
* {{jira|VWR-4798}} - Votes: 0 - Quicktime Version Warning does not remove Quicktime from client memory - {{User|Ice Brodie}}&lt;br /&gt;
* {{jira|VWR-4791}} - Votes: 0 - Text in find and communication windows does not highlight for mac users - {{User|JamesReese Eddy}}&lt;br /&gt;
* {{jira|VWR-4777}} - Votes: 0 - Group IM window is labelled with resident&#039;s name instead of group name - {{User|Beeflin Grut}}&lt;br /&gt;
* {{jira|SVC-1144}} - Votes: 2 - replies to offline emails can&#039;t contain unicode - {{User|Lex Neva}}&lt;br /&gt;
* {{jira|VWR-2624}} - Votes: 0 - &amp;lt;select&amp;gt; boxes in web profile sometimes misbehave - {{User|Lex Neva}}&lt;br /&gt;
* {{jira|VWR-815}} - Votes: 3 - cannot change material on link sets - {{User|Lex Neva}}&lt;br /&gt;
* {{jira|SVC-578}} - Votes: 6 - &amp;quot;save object back to object contents&amp;quot; no longer works - {{User|Lex Neva}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pre-meeting activity ==&lt;br /&gt;
&lt;br /&gt;
Some issues will be resolved in the course of building this agenda.  Rather than deleting them from the proposed agenda, move the issue and associated discussion into the appropriate section below.&lt;br /&gt;
&lt;br /&gt;
=== Imported ===&lt;br /&gt;
&lt;br /&gt;
=== Resolved ===&lt;br /&gt;
&lt;br /&gt;
== Transcript ==&lt;br /&gt;
Transcript is/will be at [[{{PAGENAME}}/Transcript]]&lt;br /&gt;
&lt;br /&gt;
== Creating An Agenda ==&lt;br /&gt;
{{Bug List Instructions}}&lt;/div&gt;</summary>
		<author><name>Lex Neva</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlEscapeURL&amp;diff=52375</id>
		<title>LlEscapeURL</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlEscapeURL&amp;diff=52375"/>
		<updated>2008-02-01T21:52:41Z</updated>

		<summary type="html">&lt;p&gt;Lex Neva: touchups&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func_id=307|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llEscapeURL|return_type=string|p1_type=string|p1_name=url&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc&lt;br /&gt;
|return_text=that is the escaped/encoded version of &#039;&#039;&#039;url&#039;&#039;&#039;, replacing spaces with %20 etc. The function will escape any character not in [a-zA-Z0-9] to %xx where xx is the hexadecimal value of the byte.&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=* The function is not appropriate for escaping a URL all at once because the &#039;: &#039; after the protocol and all of the &#039;/&#039; characters delimiting the various parts will be escaped.  Instead, build the URL in parts, escaping parts of the path and query string arguments as needed. &lt;br /&gt;
*See: {{LSLG|string#Caveats|String:Caveats}}&lt;br /&gt;
|constants&lt;br /&gt;
|examples&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions={{LSL DefineRow|[[llUnescapeURL]]}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles={{LSL DefineRow|[[UTF-8]]}}&lt;br /&gt;
{{LSL DefineRow|[[Base64]]}}&lt;br /&gt;
|notes&lt;br /&gt;
|permission&lt;br /&gt;
|negative_index&lt;br /&gt;
|cat1=Encoding&lt;br /&gt;
|cat2=String&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lex Neva</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Mono&amp;diff=51943</id>
		<title>Mono</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Mono&amp;diff=51943"/>
		<updated>2008-01-30T02:34:50Z</updated>

		<summary type="html">&lt;p&gt;Lex Neva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
&lt;br /&gt;
Linden Lab Studio Icehouse is now testing a simulator upgrade which will dramatically speed the running of scripts. The Linden Scripting Language ( [[LSL Portal | LSL]] ) will not change in any way, so all of your existing scripted objects and attachments will continue to function as before, only faster. The key to this improvement is an open-sourced virtual machine called [http://www.mono-project.com/Main_Page Mono]. &lt;br /&gt;
&lt;br /&gt;
Mono is now in beta. You can download a viewer which will connect you to the beta grid. Then you can teleport to a Mono region and give Mono a try yourself. Instructions at the bottom of this page.&lt;br /&gt;
&lt;br /&gt;
= How LSL scripts work =&lt;br /&gt;
All your LSL scripts are run by the simulator (Linden Lab server program) that also runs the region you are in. When you teleport, or region cross, your new region&#039;s simulator takes on the duty of running all your scripted attachments. But the simulators cannot understand LSL directly -- the language was designed for human readability, not machine. So before the script can be executed, it must be turned into a machine readable format. This process is called compilation, and the resulting machine readable version of the script is called bytecode. LSL scripts are compiled when they are created by resident-programmers. The bytecode itself is stored on the Linden Lab asset servers and never needs to be referred to directly by residents. Instead, when you rez a scripted object, the simulator for the region you are in notes the script(s) in the object, and requests the appropriate bytecode from the asset database. The simulator program has several parts, and the part which runs the script bytecode is called the LSL virtual machine. &lt;br /&gt;
&lt;br /&gt;
In today&#039;s Second Life, scripts are everywhere in regions: from simple rotating objects to complicated vehicles, vendors, or attachments that respond to your chat commands. For many regions the LSL virtual machine is kept busy trying to execute hundreds of scripts all at once. As the number and complexity of scripts in a region rises, so do the demands upon the simulator. After a certain point the virtual machine starts taking up so much processing time that the rest of the simulator (particularly the physics engine) bogs down, and server-side lag results. Thus anything that can speed up the execution of scripts can push out the point where server lag starts to occur.  &lt;br /&gt;
&lt;br /&gt;
= Enter Mono =&lt;br /&gt;
Mono is another kind of virtual machine. It is fully open-sourced and has a proven record of speed and versatility. For over a year now Mono has been considered by Linden Lab as an alternative to the old LSL virtual machine. But there are difficulties with switching virtual machines. The most fundamental problem is that all bytecodes are different. So the LSL bytecode is just gibberish to Mono, and vice versa. Before we could start using a Mono virtual machine, we need to develop a compiler which can take LSL scripts and turn them into Mono bytecode. This is tricky, because the goal is to make scripts running under Mono behave &#039;exactly&#039; like scripts running under the current virtual machine. It&#039;s painstaking work, and requires an extraordinary amount of testing. The final sprint of coding was completed in the third quarter of 2007, and since November Linden Lab QA has been rigorously pounding on the new virtual machine with an assortment of tests both automated and manual. &lt;br /&gt;
&lt;br /&gt;
= The Plan =&lt;br /&gt;
The ultimate test of the new virtual machine will be when residents can start to use Mono for their LSL scripts. Once Mono passes our internal QA we are going to deploy it to our beta grid. That grid is currently being used by Havok 4, the new version of our physics engine. However, through the wonders of Het Grid, we will be able to share the grid with Havok. Het Grid allows us to make some regions on a grid run different simulator software than others. So we can have some regions on the beta grid running Havok, and some running Mono!&lt;br /&gt;
&lt;br /&gt;
We&#039;ll use the same Het Grid strategy when Mono is ready for the main grid -- initially it will be deployed only to a few regions, and residents will be able to tp over to them to confirm that their scripts still behave properly under Mono. Eventually we will release Mono gridwide and the LSL compiler will be deprecated. &lt;br /&gt;
&lt;br /&gt;
= Early results =&lt;br /&gt;
We&#039;ve run some benchmarks to compare the performance of the LSL2 virtual machine and the Mono VM. When we run the tests side by side we found that Mono is up to 220x faster than LSL2. These benchmarks were math intensive scripts usually used to evaluate performance. Once we get the beta program going we hope to get input from residents on Mono performance with more typical SL scripts.&lt;br /&gt;
&lt;br /&gt;
= Mono How-to =&lt;br /&gt;
&lt;br /&gt;
Suppose you have some scripts you want to test under Mono. You will need to go to a Mono-enabled region and you will need to run a Mono viewer. Step-by-step follows, also check the [[Mono beta FAQ]] if you have questions.&lt;br /&gt;
* Download a Mono viewer: [http://secondlife.com/community/preview.php beta viewers]&lt;br /&gt;
** This viewer will automatically connect you to the beta grid.&lt;br /&gt;
** It also contains the UI to enable compiling your script to Mono&lt;br /&gt;
* Launch the Mono viewer and log in as usual. &lt;br /&gt;
* Teleport to a Mono-enabled region of the beta grid.&lt;br /&gt;
** Most regions are running Havok4, not Mono&lt;br /&gt;
** Mono regions are: &lt;br /&gt;
*** Sandbox Cordova MONO&lt;br /&gt;
*** Sandbox Goguen MONO&lt;br /&gt;
*** Sandbox Newcomb MONO&lt;br /&gt;
*** Sandbox Wanderton MONO&lt;br /&gt;
* Rez the object containing the script. &lt;br /&gt;
* Edit the object and open the script. &lt;br /&gt;
* You will see a new checkbox for compiling this script to Mono instead of LSL. Check the box for Mono, then save.&lt;br /&gt;
** If you fail to see the checkbox, you are not running a Mono viewer.&lt;br /&gt;
** If the checkbox is grayed out for Mono, you are not in a Mono enabled region. &lt;br /&gt;
* I suggest you append the word &amp;quot;Mono&amp;quot; to the object/script name. This way you&#039;ll be able to identify which objects in your inventory will only run in Mono regions. &lt;br /&gt;
* Confirm that the scripted object runs the same under Mono as it has before.&lt;br /&gt;
** Any differences in behavior should be noted in a JIRA ticket. &lt;br /&gt;
** First check [https://jira.secondlife.com/browse/SVC-1276 this meta JIRA] to see if anyone has reported the issue already&lt;br /&gt;
*** This may not be doable unless you&#039;ve drilled down into your script to locate what is breaking.&lt;br /&gt;
** If a JIRA already exists, and it appears to be the same failure, then simply add your information as a comment and attachment to that issue.&lt;br /&gt;
** If not, open a new SVC ticket for each bug you find. In the ticket summary please use the words &amp;quot;Mono beta&amp;quot; so that we can filter for them. &lt;br /&gt;
** In addition to your description of the problem please attach your script itself, or (ideally) a smaller script which illustrates the difference in behavior between the two virtual machines.&lt;br /&gt;
** Link your JIRA to the meta JIRA.&lt;br /&gt;
&lt;br /&gt;
= FAQ &amp;amp; IFAQ =&lt;br /&gt;
Section for questions, both frequently and infrequently asked.&lt;br /&gt;
; When will the Mono Beta start? : The Mono beta is in progress&lt;br /&gt;
; Do you have more info about the Mono Beta? : Yes, see [[Mono beta FAQ]].&lt;br /&gt;
; Will the available memory for scripts change? (Currently 16k in LSL2 VM) : For the same LSL script the Mono bytecode and LSL2 bytecode will be of different size. In order to be compatible with all known scripts, we have expanded the size ceiling for Mono to be 64k. This is ok to do for Mono because unlike LSL2, Mono bytecode assets are dynamically sized. With LSL2 all scripts occupy 16k, with Mono scripts only occupy what they need. &lt;br /&gt;
; Will I have to manually convert all my objects to using Mono? : Yes. Though you can make use of the Tools Menu to recompile all scripts in selection to Mono. &lt;br /&gt;
; Can I keep my scripts running on the old LSL2 VM forever? : We have no plans to eliminate the LSL2 VM. This will be re-examined after Mono has been live on the Main Grid for a while. But right now it is easier to continue to support LSL2 than to migrate all scripts. &lt;br /&gt;
; Will I be able to write scripts in languages besides LSL since Mono supports lots of languages? : Eventually. Right now our goal is to make Mono completely compatible with LSL2 for LSL scripts.  &lt;br /&gt;
;Why didn&#039;t you use &amp;lt;favorite_language&amp;gt; instead of Mono? (ie lisp, python, lua, javascript) : TBA&lt;br /&gt;
; Will LSL be getting real language features with this change? (ie arrays, references/pointers, includes/imports)&lt;br /&gt;
: No.  The LSL language is not changing with this update.&lt;br /&gt;
; In LSL2 VM scripts are compiled on the viewer then uploaded, will that change with the Mono VM? : Yes, Mono compilation is done in a distributed fashion on the sim hosts. &lt;br /&gt;
; Related to the above, I use a &amp;quot;clever trick&amp;quot; to upload my compiled bytecode in LSL2 with out the correct script text. What will happen to scripts I uploaded in this way when converted to Mono? Will I be able to continue to use my &amp;quot;clever trick&amp;quot; for Mono scripts? : The Mono compiler looks only at the script text. The Mono VM will only run bytecode which has been compiled by our Mono compiler. You will not be able to run any uploaded Mono bytecode.&lt;br /&gt;
; What about scripts whose LSL code has been lost, ie scripts that still run, but result in &amp;quot;Script missing from database.&amp;quot; when you try to edit them?  Is there any possibility of bytecode translation, or are these scripts stuck in the LSL vm forever?&lt;/div&gt;</summary>
		<author><name>Lex Neva</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlGetHTTPServerURL&amp;diff=50597</id>
		<title>LlGetHTTPServerURL</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlGetHTTPServerURL&amp;diff=50597"/>
		<updated>2008-01-22T23:30:48Z</updated>

		<summary type="html">&lt;p&gt;Lex Neva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function|func_id&lt;br /&gt;
|mode=request&lt;br /&gt;
|func=llGetHTTPServerURL&lt;br /&gt;
|func_sleep=0.0&lt;br /&gt;
|func_energy=10.0&lt;br /&gt;
|sort=GetHTTPServerURL&lt;br /&gt;
|return_type=string&lt;br /&gt;
|return_text= that is a URL identifying the HTTP server if active, empty string otherwise.&lt;br /&gt;
|func_desc=Returns the current HTTP server URL for the script calling the function.&lt;br /&gt;
|func_footer=Returned URI: &amp;lt;nowiki&amp;gt;http://sim###.agni.lindenlab.com:portofsimulator/uuid&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;Ex: http://sim4212.agni.lindenlab.com:1337/00000000-0000-0000-0000-000000000000&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&amp;lt;pre&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer t) // Touch Indicator&lt;br /&gt;
    {&lt;br /&gt;
        string ServerURL = llGetHTTPServerURL();&lt;br /&gt;
        if (ServerURL != &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;HTTP Server URL:&amp;quot; + ServerURL);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;HTTP Server Is Not Active!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|related&lt;br /&gt;
|also_header&lt;br /&gt;
|also_events={{LSL DefineRow||[[http_request]]}}&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llHTTPServer]]|For opening an llHTTPServer.}}&lt;br /&gt;
{{LSL DefineRow||[[llHTTPServerRemove]]|For removing the current HTTP server from the script.}}&lt;br /&gt;
{{LSL DefineRow||[[llHTTPResponse]]|For replying to HTTP requests.}}&lt;br /&gt;
{{LSL DefineRow||[[llEscapeURL]]}}&lt;br /&gt;
{{LSL DefineRow||[[llUnescapeURL]]}}&lt;br /&gt;
|also_footer&lt;br /&gt;
|notes=Zero Linden&#039;s Office Hours Discussion On Incoming HTTP: [https://wiki.secondlife.com/wiki/User:Zero_Linden/Office_Hours/Discussion#Incoming_HTTP]&amp;lt;br /&amp;gt;PJIRA feature requests:&amp;lt;br /&amp;gt;[http://jira.secondlife.com/browse/SVC-913 SVC-913]&amp;lt;br /&amp;gt;[http://jira.secondlife.com/browse/SVC-1086 SVC-1086]&amp;lt;br /&amp;gt;Please go vote if this feature is important to you.&lt;br /&gt;
|cat1&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lex Neva</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlGetHTTPServerURL&amp;diff=50596</id>
		<title>LlGetHTTPServerURL</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlGetHTTPServerURL&amp;diff=50596"/>
		<updated>2008-01-22T23:29:54Z</updated>

		<summary type="html">&lt;p&gt;Lex Neva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function|func_id&lt;br /&gt;
|mode=request&lt;br /&gt;
|func=llGetHTTPServerURL&lt;br /&gt;
|func_sleep=0.0&lt;br /&gt;
|func_energy=10.0&lt;br /&gt;
|sort=GetHTTPServerURL&lt;br /&gt;
|return_type=string&lt;br /&gt;
|return_text= that is a URL identifying the HTTP server if active, empty string otherwise.&lt;br /&gt;
|func_desc=Returns the current HTTP server URL for the script calling the function.&lt;br /&gt;
|func_footer=Returned URI: &amp;lt;nowiki&amp;gt;http://sim###.agni:portofsimulator/uuid&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;Ex: http://sim4212.agni:1337/00000000-0000-0000-0000-000000000000&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|caveats=&lt;br /&gt;
|examples=&amp;lt;pre&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer t) // Touch Indicator&lt;br /&gt;
    {&lt;br /&gt;
        string ServerURL = llGetHTTPServerURL();&lt;br /&gt;
        if (ServerURL != &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;HTTP Server URL:&amp;quot; + ServerURL);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;HTTP Server Is Not Active!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|related&lt;br /&gt;
|also_header&lt;br /&gt;
|also_events={{LSL DefineRow||[[http_request]]}}&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llHTTPServer]]|For opening an llHTTPServer.}}&lt;br /&gt;
{{LSL DefineRow||[[llHTTPServerRemove]]|For removing the current HTTP server from the script.}}&lt;br /&gt;
{{LSL DefineRow||[[llHTTPResponse]]|For replying to HTTP requests.}}&lt;br /&gt;
{{LSL DefineRow||[[llEscapeURL]]}}&lt;br /&gt;
{{LSL DefineRow||[[llUnescapeURL]]}}&lt;br /&gt;
|also_footer&lt;br /&gt;
|notes=Zero Linden&#039;s Office Hours Discussion On Incoming HTTP: [https://wiki.secondlife.com/wiki/User:Zero_Linden/Office_Hours/Discussion#Incoming_HTTP]&amp;lt;br /&amp;gt;PJIRA feature requests:&amp;lt;br /&amp;gt;[http://jira.secondlife.com/browse/SVC-913 SVC-913]&amp;lt;br /&amp;gt;[http://jira.secondlife.com/browse/SVC-1086 SVC-1086]&amp;lt;br /&amp;gt;Please go vote if this feature is important to you.&lt;br /&gt;
|cat1&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lex Neva</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Havok4&amp;diff=48591</id>
		<title>Havok4</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Havok4&amp;diff=48591"/>
		<updated>2008-01-12T04:01:57Z</updated>

		<summary type="html">&lt;p&gt;Lex Neva: &amp;quot;don&amp;#039;t rez &amp;#039;no copy/no transfer&amp;#039; items&amp;quot; =&amp;gt; &amp;quot;don&amp;#039;t rez &amp;#039;no copy/transfer&amp;#039; items&amp;quot;; no such thing as a no copy/no transfer item.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Havok4 (New Physics Engine) Beta Test Information Hub==&lt;br /&gt;
===Introduction===&lt;br /&gt;
The beta testing for the Havok4 implementation in Second Life is now in process. This page provides information on the project, as well as useful information that will help us all to make sure that Havok4 is tested well before it is rolled throughout the main Second Life grid.&lt;br /&gt;
&lt;br /&gt;
Please read the [[Havok4 Beta1 Release Notes]]&lt;br /&gt;
&lt;br /&gt;
===What Is Havok?===&lt;br /&gt;
The Second Life virtual world has a lot of moving parts that keep it going. One of these is the Physics Engine. A physics engine is a specialized piece of software that does the &amp;quot;real world&amp;quot; calculations to figure out what do when:&lt;br /&gt;
* Something or someone is pushed&lt;br /&gt;
* Something or someone collides with something or someone else&lt;br /&gt;
* Something or someone is in motion and has momentum&lt;br /&gt;
* Friction or damping slows the motion of something or someone&lt;br /&gt;
&lt;br /&gt;
Havok is a commercially produced physics engine, and Second Life was built using Havok1. on which it operated for several years. &lt;br /&gt;
&lt;br /&gt;
===How Can I Participate In Havok4 Physics Engine Testing?===&lt;br /&gt;
You can participate in the Beta Test of Havok4 with a few easy steps:&lt;br /&gt;
# Read &amp;quot;[[What&#039;s Changed With Havok4]]&amp;quot; to understand what should be different, and what should not be different, on the Havok4 Beta Test grid&lt;br /&gt;
# Read &amp;quot;[[Linkability_Rules|New Prim Linkability Rules]]&amp;quot; to understand how prim linkage works with Havok4 (it&#039;s better and should be much more reliable!)&lt;br /&gt;
# Login to the Public Issue Tracker at &amp;quot;[https://jira.secondlife.com/ Issue Tracker]&amp;quot; to see how easily you can tell us about problems you find during the beta test&lt;br /&gt;
# [http://secondlife.com/community/preview.php Download the install the Havok4 Beta Viewer here]&lt;br /&gt;
&lt;br /&gt;
===What To Test?===&lt;br /&gt;
Make sure that all of the your content works on the Havok4 grid, and try as many physics-related things as you can think of as well... Here is a short list, and a link to a page with a more exhaustive list of ideas:&lt;br /&gt;
* Building, linking, unlinking&lt;br /&gt;
* Vehicles&lt;br /&gt;
* Weapons&lt;br /&gt;
* &amp;quot;Spells&amp;quot;&lt;br /&gt;
* Shields&lt;br /&gt;
* Building Tools&lt;br /&gt;
* Rezzing large linked sets of prims&lt;br /&gt;
* Try building simple and complex items, taking them into inventory and rezzing them in different orientations and in different places&lt;br /&gt;
* Does walking, sitting, flying, swimming, running and other avatar motions work the way you expect it to?&lt;br /&gt;
* Do scripts work as expected? &lt;br /&gt;
* Try creating scripts and modifying them&lt;br /&gt;
* Are permissions working correctly?&lt;br /&gt;
* Can you get the sim to crash using &amp;quot;physics crashes&amp;quot;? (those of you who know what this means... &amp;quot;go for it&amp;quot; and let us know if you can... ;)&lt;br /&gt;
&lt;br /&gt;
There are [[Havok4_Beta_Test_Ideas|Many Things You Can Test In Havok4]] (a list of lots of things that would be helpful for you to test. Feel free to pick and choose from this list and make up your own things to try as well!&lt;br /&gt;
&lt;br /&gt;
===How Do I Stay &amp;quot;In The Loop&amp;quot; With Havok4 Testing?===&lt;br /&gt;
# Attend &amp;quot;[[Regular Havok4 Office Hours In-World]]&amp;quot;&lt;br /&gt;
# TELL US about everything you find using the Public Issue Tracker at &amp;quot;[https://jira.secondlife.com/ Issue Tracker]&amp;quot; &amp;lt;br /&amp;gt;&lt;br /&gt;
Please enter bugs using PROJECT &amp;quot;Second Life Service - SVC&amp;quot; and when entering the bug choose AFFECTS VERSIONS &amp;quot;Havok4 Beta&amp;quot; and COMPONENTS &amp;quot;Physics&amp;quot; to be sure we see them right away!&lt;br /&gt;
&lt;br /&gt;
===How Will Havok4 Be Tested And Rolled Out?===&lt;br /&gt;
This project replaces a core component of Second Life, and being sure that &amp;quot;anything that pushes, collides or has inertia&amp;quot; works right is a pretty extensive task. We have already done a lot of internal testing, and plowed through hundreds of internal bug fixes. We will be taking a phased approach to both catch as many problems as early as possible, and reduce risk of issues as Havok4 is rolled out. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Phase 1 - Internal Testing On Non-Public Test Grid (DONE!)&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
We already completed this phase, and had a variety of internal staff work on Havok4 enabled simulators. Basic functions were checked, as well as checking to see that the known physics-related simulator crashes were resolved.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Phase 2 - Public Beta Test On Beta Grid (&amp;quot;YOU ARE HERE!&amp;quot; :)&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
We expect the public beta test for Havok4 to be very active, with many participants. We have prepared a test grid that allows for many types of physics-related tests. The test regions will include:&lt;br /&gt;
* Orientation Islands&lt;br /&gt;
* Welcome Areas&lt;br /&gt;
* Lusk&lt;br /&gt;
* Several sandboxes&lt;br /&gt;
* Combat sandboxes&lt;br /&gt;
* Vehicle testing simulators&lt;br /&gt;
&lt;br /&gt;
NOTE: The Public Beta viewer will be configured to use the beta grid, which will be a snapshot copy of portions of the main grid and a copy of your user account. You can do &amp;quot;anything you want&amp;quot; on this grid without risking damage to your &amp;quot;real account&amp;quot; on the main grid. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Phase 3 - Havok4 On A Select Few Main Grid Regions&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
In this phase we will use the new HetGrid functionality to deploy Havok4 simulators on a small number of regions of the main grid. This will still be a testing phase, and for this phase any participants will need to remember that you will be on the main grid, working with your real inventory (caveat emptor - don&#039;t rez &amp;quot;no copy/transfer&amp;quot; items on these early test Havok4 sims without understanding the potential risks)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Phase 4 - Partial Main Grid Rollout (50-100 regions)&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
At this point, we will have resolved outstanding issues found during beta testing and the Phase 3 &amp;quot;small deployment in a corner of the main grid&amp;quot; and will deploy Havok4 to a subset of the main grid. &lt;br /&gt;
&lt;br /&gt;
After collecting feedback, if all looks good, we will continue to...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Phase 5 - Full Havok4 Rollout On Main Grid (deploy to rest of grid)&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
If all is clean at this point, we will then roll out the Havok4 engine to the rest of the main grid, and we&#039;ll be &amp;quot;live&amp;quot; with Havok4 everywhere.&lt;br /&gt;
&lt;br /&gt;
===A Historical Note: Why Did &amp;quot;Doing Havok&amp;quot; Take So Long?===&lt;br /&gt;
Some of you who have been around for a long time will know that we talked about replacing Havok1 a long time ago, and did not seem to get this project done, and finally went silent about it. After several false starts, we decided that it would be best to stop talking about the work, or making public commitments, until we were far closer to the goal, and we believe that we are finally at this point. &lt;br /&gt;
&lt;br /&gt;
For &amp;quot;quite some time&amp;quot; we worked to replace Havok1 with Havok2. After working on that project, we realized that we really should rework the interfaces for how Havok is integrated with Second Life. We realized that we needed to define an abstraction layer - a layer of code that would make it easier to do future physics engine migrations so that they don&#039;t take as much effort as this migration took, and to allow for more flexibility down the road. At this point Havok4 became a much more reasonable target than implementing based on a then-older release... and thus we set Havok4 as the target. This project has been significantly larger than any of us anticipated, however the good news is that we are now here, ready for beta testing, and ready to fix the last minute issues before we bring Havok4-based sims to the main grid!&lt;br /&gt;
&lt;br /&gt;
== New experiences that are normal ==&lt;br /&gt;
&lt;br /&gt;
=== Ejection and separation of interpenetrating objects ===&lt;br /&gt;
One of the largest improvements over the previous Havok I engine is that Havok 4 supports separation of interpenetrating objects. That is, a cube that is embedded into the ground and turned physical will attempt to work its way out and up, until it has separated from from the ground and then rests on the ground.&lt;br /&gt;
&lt;br /&gt;
The previous engine did not handle interpenetrating objects very well. It would go into a deeply recursive processing loop known as the &amp;quot;Deep Think&amp;quot; condition, trying to determine where the overlapping objects should move, causing the simulator to run very slowly.&lt;br /&gt;
&lt;br /&gt;
The new engine quickly and easily separates overlapping objects. The objects are treated like compressed springs, so that a deeper interpenetration imparts a greater ejection force onto the object. The interpenetration resolver attempts to obey movement constraints and will not explode out through enclosing walls, but will expand out through whatever openings or spaces are available.&lt;br /&gt;
&lt;br /&gt;
Here is a Google Video showing an extreme example of how the interpenetration resolver works. A stack of about 200 very large disks about 0.5 meter thick overlap in a short stack about 10 meters tall, and enclosed inside a large hollow tube. When rezzed on the ground and turned physical, the disks explode upward and out of the top of the tube, with some disks shooting over 300 meters high from the repulsive force of the overlap resolution. No scripted movements or pushes are being applied to the disks. The motion is purely from the interpenetration resolver.&lt;br /&gt;
&lt;br /&gt;
Google Video: &#039;&#039;&#039;Second Life Havok 4 - Exploding Can of Disks&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
http://video.google.com/videoplay?docid=-2623683631644524154&lt;br /&gt;
&lt;br /&gt;
=== Simulator lag from huge piles of stacked objects ===&lt;br /&gt;
Even though this is a new and improved physics engine that should not crash as frequently as the original Havok-1 engine, there are times when the new simulator will still experience very bad lag due to a large number of touching physical objects.&lt;br /&gt;
&lt;br /&gt;
This lag is not a bug, and is not like the old Havok-1 Deep Think condition, but is due to a limitation in how physics engines work in general. This same problem affected Havok-1, but it wasn&#039;t as obvious, since large stacks often crashed the simulator before this condition could become apparant.&lt;br /&gt;
&lt;br /&gt;
Normally when physical objects slow down to below a critical speed for a period of time, the engine quiets the physics processing for that object, in order to save CPU time for the more active objects.&lt;br /&gt;
&lt;br /&gt;
In order for the physics processing to settle, the object needs to be in contact with a nonmoving reference object. A single physical bar coming to a stop touching the ground is therefore quieted.&lt;br /&gt;
&lt;br /&gt;
But for multiple stacked physical objects, it is difficult for them all to settle down, because one or more of the other touching objects may still be slightly moving when the other objects settle. This slight movement of the one then reawakens the objects that previously were settled, resulting in small movements rippling through the stack. The feedback of reawakening constantly circulates through the pile so that none of them are ever really able to settle completely. This constant moving and twitching of the spheres is similar to the physical concept of Brownian Motion with atoms.&lt;br /&gt;
&lt;br /&gt;
Google Video example of simulator lag generated from 565 physical spheres held inside a container:&lt;br /&gt;
&lt;br /&gt;
http://video.google.com/videoplay?docid=7316931483709158462&lt;br /&gt;
&lt;br /&gt;
This engine lag is not based on the size of the objects involved. A collection of 500 very small stacked objects can cause as much lag as 500 large stacked objects.&lt;br /&gt;
&lt;br /&gt;
=== Thousands of objects that don&#039;t touch do not lag ===&lt;br /&gt;
&lt;br /&gt;
The Havok-4 simulator will run at full speed, if there is enough space between physical objects so that the reawakening collisions are kept to a mininum.&lt;br /&gt;
&lt;br /&gt;
There can be thousands of physical objects in a simulator without any lag, just so long as the objects minimally touch each other.&lt;br /&gt;
&lt;br /&gt;
Google Video of 2000-3400 physical cubes in a sandbox, with no lag:&lt;br /&gt;
&lt;br /&gt;
http://video.google.com/videoplay?docid=-2779779276874540721&lt;/div&gt;</summary>
		<author><name>Lex Neva</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Disc_Jockey&amp;diff=45038</id>
		<title>Disc Jockey</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Disc_Jockey&amp;diff=45038"/>
		<updated>2007-12-17T18:10:36Z</updated>

		<summary type="html">&lt;p&gt;Lex Neva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
A [http://en.wikipedia.org/wiki/Disc_jockey disc jockey] or DJ is a person who selects and plays [http://en.wikipedia.org/wiki/Sound_recording prerecorded music] for an audience.&lt;br /&gt;
&lt;br /&gt;
In Second Life Disc Jockeys (or DJs) are people who play music for events or venues. DJs are usually well respected and often well known because a good DJ can make an event a lot of fun and very memorable, especially if they have a great library of music and take requests.&lt;br /&gt;
&lt;br /&gt;
Music (or any audio) is played in second life by configuring the Music URL in the Media tab of your land settings. Right-click your land and select &amp;quot;About Land...&amp;quot; from the menu. In the &amp;quot;About Land&amp;quot; window that pops up, select the &amp;quot;Media&amp;quot; tab. You can fill this in with your favorite music URL (for example http://160.79.128.40:7686 for oldies rock).&lt;br /&gt;
&lt;br /&gt;
This URL points to a media server which broadcasts music digitally via the internet. Note, this music is sent directly to your computer, it is not handled at all by the Second Life servers.&lt;br /&gt;
&lt;br /&gt;
Before you can be a DJ you need to have a media server with a URL that people can connect to. Fortunately there are several free software utilities that can do this for you. Basically you will need:&lt;br /&gt;
&lt;br /&gt;
# A &#039;&#039;&#039;media server&#039;&#039;&#039; - which actually broadcasts the music&lt;br /&gt;
# A &#039;&#039;&#039;source client&#039;&#039;&#039; - which lets you select the music from several sources and sends it to the server.&lt;br /&gt;
&lt;br /&gt;
The are many ways to set up you broadcast environment, but only one is described here in detail. Note: it can be frustrating to set up a broadcast environment because often these utilities are documented poorly, and they can be quite complex to configure properly.&lt;br /&gt;
&lt;br /&gt;
== Example Broadcast Environment ==&lt;br /&gt;
&lt;br /&gt;
=== Ingredients ===&lt;br /&gt;
&lt;br /&gt;
# Icecast - server&lt;br /&gt;
# WinAmp - media player&lt;br /&gt;
# OddCast - source client plugin for WinAmp&lt;br /&gt;
# Music - files or CD you can play via WinAmp&lt;br /&gt;
# Computer 1 - for broadcasting&lt;br /&gt;
# Computer 2 - to test that you are broadcasting&lt;br /&gt;
# Internet Router/Gateway&lt;br /&gt;
&lt;br /&gt;
This example uses&lt;br /&gt;
&lt;br /&gt;
* Windows XP for Computer 1&lt;br /&gt;
* Windows Vista Ultimate 64 for Computer 2&lt;br /&gt;
* D-Link router.&lt;br /&gt;
&lt;br /&gt;
but other combinations are possible.&lt;br /&gt;
&lt;br /&gt;
=== Setting Up the Server ===&lt;br /&gt;
&lt;br /&gt;
Install the latest version of [http://www.icecast.org IceCast] on Computer 1.&lt;br /&gt;
&lt;br /&gt;
Run the IceCast user interface (in this case Icecast2.exe)&lt;br /&gt;
&lt;br /&gt;
From the &amp;quot;Configure&amp;quot; menu select &amp;quot;Edit Configuration.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Change the following passwords in the icecast.xml file:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;authentication&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Sources log in with username &#039;source&#039; --&amp;gt;&lt;br /&gt;
     &amp;lt;source-password&amp;gt;hackme&amp;lt;/source-password&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Relays log in username &#039;relay&#039; --&amp;gt;&lt;br /&gt;
     &amp;lt;relay-password&amp;gt;hackme&amp;lt;/relay-password&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;!-- Admin logs in with the username given below --&amp;gt;&lt;br /&gt;
     &amp;lt;admin-user&amp;gt;admin&amp;lt;/admin-user&amp;gt;&lt;br /&gt;
     &amp;lt;admin-password&amp;gt;hackme&amp;lt;/admin-password&amp;gt;&lt;br /&gt;
 &amp;lt;/authentication&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for example (but select you own passwords)&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;authentication&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Sources log in with username &#039;source&#039; --&amp;gt;&lt;br /&gt;
     &amp;lt;source-password&amp;gt;Play4Me&amp;lt;/source-password&amp;gt;&lt;br /&gt;
     &amp;lt;!-- Relays log in username &#039;relay&#039; --&amp;gt;&lt;br /&gt;
     &amp;lt;relay-password&amp;gt;Play4Me&amp;lt;/relay-password&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;!-- Admin logs in with the username given below --&amp;gt;&lt;br /&gt;
     &amp;lt;admin-user&amp;gt;admin&amp;lt;/admin-user&amp;gt;&lt;br /&gt;
     &amp;lt;admin-password&amp;gt;IamKing45&amp;lt;/admin-password&amp;gt;&lt;br /&gt;
 &amp;lt;/authentication&amp;gt;&lt;br /&gt;
&lt;br /&gt;
While this was not strictly necessary, it is always good practice to change passwords to your own secret versions.&lt;br /&gt;
&lt;br /&gt;
Save you changes and close the window for the icecast.xml files.&lt;br /&gt;
&lt;br /&gt;
Click the &amp;quot;Start Server&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
=== Setting up WinAmp ===&lt;br /&gt;
&lt;br /&gt;
Install the latest version of [http://www.winamp.com/ WinAmp] on Computer 1.&lt;br /&gt;
&lt;br /&gt;
Try playing a few tunes so you can get the hang of it.&lt;br /&gt;
&lt;br /&gt;
Stop WinAmp&lt;br /&gt;
&lt;br /&gt;
=== Setting up the WinAmp OddCast Plug-In ===&lt;br /&gt;
&lt;br /&gt;
Install the latest version of [http://www.oddsock.org/tools/oddcastv2_wa2/ OddCast] on Computer 1.&lt;br /&gt;
&lt;br /&gt;
Start WinAmp again.&lt;br /&gt;
&lt;br /&gt;
Under the &amp;quot;Options&amp;quot; menu select &amp;quot;Preferences...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In the Preferences window select (under Plug-ins) &amp;quot;DSP/Effect&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In the top right of the window select &amp;quot;Oddcast DSP...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The Oddcast window should open up. Click the &amp;quot;AddEncoder&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
Under &amp;quot;Encoder Settings&amp;quot; right-click the encoder you just added and select &amp;quot;Configure&amp;quot; from the menu. A Configuration window will open up.&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;Encoder Type&amp;quot; field, select &amp;quot;OggVorbis&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;Server Type&amp;quot; field, select &amp;quot;Icecast&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;Encoder Password&amp;quot; field type your source-password, in this case &amp;quot;Play4Me&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;Mountpoint&amp;quot; field type &amp;quot;/different.ogg&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Finally, click the &amp;quot;OK&amp;quot; button to close the Configuration Window.&lt;br /&gt;
&lt;br /&gt;
In the Oddcast window click the &amp;quot;Connect&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
If the server is running properly you should see the word &amp;quot;Connected&amp;quot; under the &amp;quot;Transfer Rate&amp;quot; column in the table next to the encoder you just added and configured. If it&#039;s not connected there&#039;s something wrong or your server is not running.&lt;br /&gt;
&lt;br /&gt;
In the Icecast window (your opened earlier) you should be able to see 1 connection.&lt;br /&gt;
&lt;br /&gt;
=== Testing the Broadcast ===&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t have WinAmp installed on Computer 2 do that first.&lt;br /&gt;
&lt;br /&gt;
On Computer 1 start a play-list going in WinAmp - something that will be playing for a while.&lt;br /&gt;
&lt;br /&gt;
On Computer 1 start WinAmp, and from the &amp;quot;File&amp;quot; menu select &amp;quot;Play URL&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;Open URL&amp;quot; window enter &amp;lt;nowiki&amp;gt;&amp;quot;http://1.2.3.4:8000/different.ogg&amp;quot;&amp;lt;/nowiki&amp;gt; - where 1.2.3.4 is the Internet Protocol address of computer 1.&lt;br /&gt;
&lt;br /&gt;
To find the IP address, go to Computer 1 and open a Command Prompt and run the &amp;quot;ipconfig&amp;quot; command. You should see something like&lt;br /&gt;
&lt;br /&gt;
 Ethernet adapter Local Area Connection:&lt;br /&gt;
         IP Address . . . . . : 192.168.0.101&lt;br /&gt;
         Default Gateway  . . : 192.168.0.1&lt;br /&gt;
&lt;br /&gt;
If all has gone well Computer 2 should be playing the same music that is playing on Computer 1.&lt;br /&gt;
&lt;br /&gt;
If you go to Computer 1 your will see the VU meters in the Oddcast window indicating that there is music playing. From then on, any music you play in WinAmp on Computer 1 will play on Computer 2. Note: if the music stops on Computer 1, it will probably stop on Computer 2. Whey you start the music on Computer 1 again, it may not start playing on Computer 2 until you push the play button again (or something similar).&lt;br /&gt;
&lt;br /&gt;
=== Testing the Broadcast on Second Life ===&lt;br /&gt;
&lt;br /&gt;
Chances are your broadcast server is your personal computer at home, and it&#039;s behind a router/gateway.&lt;br /&gt;
&lt;br /&gt;
The way things are set up now only computers on your personal Local Area Network can find your music broadcast, so you will have to configure your router/gateway.&lt;br /&gt;
&lt;br /&gt;
Most routers have a web user interface that you can access by typing in the address of the router to your web browser. For example, from the ipconfig command discusses previously you might enter&lt;br /&gt;
&lt;br /&gt;
 192.168.0.1&lt;br /&gt;
&lt;br /&gt;
First you will need to find the IP Address of the router that is know on the Internet. This will be published somewhere in the UI. For example, let&#039;s say it&#039;s &amp;quot;1.2.3.4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Next you will need to set up a mapping to your Icecast service on Computer 1. This usually looks something like:&lt;br /&gt;
&lt;br /&gt;
 Application Name: icecast&lt;br /&gt;
 IP Address: 192.168.0.101&lt;br /&gt;
 Public Port: 8000&lt;br /&gt;
 Private Port: 8000&lt;br /&gt;
 Protocol: both (TCP/UDP)&lt;br /&gt;
&lt;br /&gt;
where IP Address is the address of Computer 1. There may be other information. After you&#039;ve saved the changes you may need to restart your router (but not usually).&lt;br /&gt;
&lt;br /&gt;
Go back to Computer 2 and start Second Life. In your land, configure the following URL for you land&#039;s audio feed&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://1.2.3.4:8000/different.ogg&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
but don&#039;t use &amp;quot;1.2.3.4&amp;quot; - use the external address you got from your router. You should now be able to hear the music from your broadcast server on Computer 1 playing via Second Life. Anyone else on your land should also be able to hear the same music.&lt;br /&gt;
&lt;br /&gt;
=== Other Settings ===&lt;br /&gt;
&lt;br /&gt;
There are usually many other settings to configure and play with in your broadcast environment, such as the mount point in your URL. For example, you do not have to use &amp;quot;/different.ogg&amp;quot; in your URL, you can configure something different, such as &amp;quot;/rockme.ogg&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Check the documentation that comes with your utilities for extra information on configuring other settings.&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous ==&lt;br /&gt;
&lt;br /&gt;
Often times a DJ needs to announce songs before they are played, or add other commentary. Music players like WinAmp and Source Clients like Oddcast often have way of adding input from a variety of sources, such as a microphone.&lt;/div&gt;</summary>
		<author><name>Lex Neva</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlGetCenterOfMass&amp;diff=13802</id>
		<title>LlGetCenterOfMass</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlGetCenterOfMass&amp;diff=13802"/>
		<updated>2007-02-28T17:02:37Z</updated>

		<summary type="html">&lt;p&gt;Lex Neva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func_id=183|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llGetCenterOfMass|return_type=vector&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc&lt;br /&gt;
|return_text=that is the object&#039;s center of mass&lt;br /&gt;
|spec&lt;br /&gt;
|caveats&lt;br /&gt;
|constants&lt;br /&gt;
|examples&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|permission&lt;br /&gt;
|negative_index&lt;br /&gt;
|cat1=Physics&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4=Stub&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lex Neva</name></author>
	</entry>
</feed>