User:Gimisa

From OpenSimulator

(Difference between revisions)
Jump to: navigation, search
 
(276 intermediate revisions by one user not shown)
Line 1: Line 1:
I am opensim user and simulator operator sharing my notes so its usefull to others. :
+
I am opensim user and simulator operator sharing my notes so its useful to others. Clic on orange word for note on subject or skim through as you prefer :
  
 
----
 
----
 
+
'''VOCABULARY:''' my understanding of the following terms.  
VOCABULARY: my understanding of the following terms.  
+
     [[#AIML]]: Artificial Intelligence Markup Language  is a specialized xml  with defined tag for conversational bot.</p>
     AIML: Artificial Intelligence Markup Language  is a specialised xml  with defined tag for conversational bot.
+
     [[#AGE]]: Normally not ask from a woman. But in opensim  its the number of days since you first rez in the grid.
     ARC:  Avatar Rendering Cost, a relative figure that provide indication as to the load an avatar represent.  
+
    [[#ANIMESH]]: In opensim is the possibility to animate a mesh object with standard animations.
     Child Avatar: A number of mirror avatar creates in adjacent region. This is the mechanism by which the viewer is aware of the other adjacent regions.     
+
    [[#AO]]: Stand for Animation Override a function that allow avatar to have other animation then the default ones.
     GRID: One ore more simulator (SIM) supported by one or more robust.exe instance.  
+
    [[#ARC]]:  Avatar Rendering Cost, a relative figure that provide indication as to the load an avatar represent.  
     MESH: In virtual universe its an imported collada file that creates a 3 object instead of using sculpty or prims.
+
     [[#BACKUPS]]: Is very important if you want reliability in case of failure.
     MOP Media on prim: the possibility to present a web page content on the face of a prim.  
+
    [[#BANDWIDTH]]: in opensim  refers to a band of transfer speed and is express in kilo bytes per seconds. kbps)
     OAR: Archiving file for region.  
+
    [[#BAKE ON MESH]]: is a feature to use standard texture clothing on mesh body.
     PARCEL a subdivision of a region minimum size is 4mx4m= 16 meter square
+
    [[#BENTO]]; is one kind of body armature consisting of additional bones for face, hands, leg and wings for animations.
 +
    [[#BODY]]: in opensim its what the avatar wear his skin on . There is 3 kind rigged, fitted and bento bodies.
 +
    [[#C#]]: is the language supporting opensim. It is an object oriented Microsoft programming language with extensive library. It can be run in linux using mono.
 +
    [[#CACHE]]: Software component that stores data so future requests for that data can be served faster
 +
    [[#CONFIGURATION]]: is done in opensimulator by specifying different characterisits governing opensim via specific files.
 +
    [[#CERTIFICATE]]: Its use with SSH (Secure Shell)  to certify access to a given opensim server.
 +
    [[#CHILD AVATAR]]: A number of mirror avatar creates in adjacent region. This is the mechanism by which the viewer is aware of the other adjacent regions.  
 +
     [[#CONSOLE]]: in opensim its the dos or Linux running screen. This screen provide information and takes commands.
 +
    [[#COPYBOT]]: in opensim its using a modified viewer to get content without respecting onwership limitation .
 +
    [[#DATA:URL]]: is a string that can be use instead of URL that provide a web page or part of a web page content.
 +
    [[#EMAIL]]: In opensim is the capability to send/receive email from script from/to inworld objects.
 +
    [[#EVENT]]: In opensim its an avatar gathering moment.
 +
    [[#FITTED]]: Fitted Mesh is a technique in which an avatar's collision bones are used to add further deformation detail to an avatar or clothing.
 +
    [[#FSASSET]]: In opensim its asset storage using the files system instead of the database.
 +
    [[#GRIEFER]]: Visitor that wants to help you test your installation.
 +
    [[#HOSTING]]: In opensim it means running your own simulator. 
 +
    [[#IM]]: in opensim is the abbreviation letters for instant message a mean of private communication between avatar or between object and avatar.
 +
    [[#IRC]]: Internet Relay Chat in the context of opensim can be use to allow script communication between object of different regions.
 +
    [[#MEMORY]]: Memory is important in opensim to support the transmission of all the asset required to present a virtual world.
 +
    [[#MODFUNCTION]]:  is C# region module communication  function allowing interaction with script Engines both XEngine and YEngine .
 +
    [[#MULTITHREAD]]: Basically it mean share computer resources in the most effecient way. But what about scripts?
 +
    [[#ONLINE]]: In opensim the indication that a user in rez in a grid.
 +
     [[#GRID]]: One ore more simulator (SIM) supported by one or more robust.exe instance.  
 +
     [[#INTELLECTUAL PROPRIETY]]: according to wikipdia includes intangible creations of the human intellect.
 +
    [[#LANGUAGE]]: Opensim is an international virtual world. Lots of language coexist in the virtual world.
 +
    [[#LOG]]: Have two meanings. Action of connecting to a server. Noun meaning record of actions.
 +
    [[#MONEY]]: Everybody know what it is . Even in opensim.
 +
    [[#MESH]]: In virtual universe its an imported collada file that creates a 3 object instead of using sculpty or prims.
 +
     LOD:  Level of detail is the mechanism by which the scene object details are reduce with increasing distance.
 +
    LSLWIKI: Old script page that you can still access at http://lslwiki.digiworldz.com/
 +
    [[#LANDING POINT]]: is a position define to assign a teleport landing location in your land. (See TELEHUD)
 +
    [[#MRM]] : is the mini region module create by Adam Frisby to allow scripting in C#.
 +
    [[#MOP]] Media on prim: the possibility to present a web page content on the face of a prim.  
 +
     NPC: Abbreviation for Non Player Character.  The NPC is a bot, a computer controlled skim down player that you can rez in your world.
 +
    [[#NAT]]: its a router feature that translate addresses to road map a bit like google map. 
 +
    [[#OAR]]: Archiving file for region.  
 +
     [[#OPENSIM]]: short for opensimulator.
 +
            In a stand alone is the service server and simulator for the opensimulator process.
 +
            In the case of grid stand for simulator only.
 +
    [[#OSL]] FUNCTION: Particular opensim scripting function.
 +
    [[#PARCEL]]: a subdivision of a region minimum size is 4mx4m= 16 meter square
 
     PRIM: is the primitive building block of opensim virtual world . They can be created with in world building  tool .
 
     PRIM: is the primitive building block of opensim virtual world . They can be created with in world building  tool .
     REGION a 256mx256m = 65,536 meters square area in opensim
+
     [[#PARTNER]]: In opensim is a bound between two avatar. Technical its a link presented in the profile of the partnered avatar linking to each other.
     REZ DATE: the day you register a new avatar in a grid.  
+
    [[#PERFORMANCE]]: from school age we know what this mean. But how to help improve it in opensim is a good question.
     SCULPTY : sculpty is a hack that permit  importing regular UV images maps specificaly encoded for 3d object creation from RGB to XYZ conversion.
+
    [[#PROBE]]: webster says a device used to obtain specific information for diagnostic or experimention. In my case its to find error scripts.
 +
    [[#RELIABILITY]]: is the repeatability and consistency of performance.
 +
    [[#REGION]]: a 256mx256m = 65,536 meters square area in opensim.
 +
    [[#RENT]]: In opensim is the action of obtaining a piece of land ( parcel )  for a time.
 +
    [[#ROBUST]]: this is the grid specialized server that will hold all the common services as compare to opensim that in that case holds the simulator.
 +
    REZ; Stand for putting a new player, NPC , or  object in a region. 
 +
     REZ DATE: the day you register a new avatar and rezing him in a region of the grid.
 +
    [[#RLV]]: is the acronym for restrain love. This is a feature available in certain viewer that with client consent allow certain script controls.
 +
     SCULPTY: sculpty is a hack that permit  importing regular UV images maps specifically encoded for 3d object creation from RGB to XYZ conversion.
 +
    [[#SCALE]]:The relation between dimension. Opensim allow scaling with object editor. 
 +
    [[#SEARCH]]: In general trying to find something, in opensim you can find avatar , location and objects. You can also search your inventory .
 +
    [[#SCRIPT]]: Is a written text of a play. In opensim its language to code instruction to play in opensim.
 +
    [[#SOCKS]]: As presented by wikipedia, SOCKS is an Internet protocol that exchanges network packets between a client and server.  
 
     SIMULATOR: also call SIM one opensim.exe instance running supporting one ore more region(s).
 
     SIMULATOR: also call SIM one opensim.exe instance running supporting one ore more region(s).
     STANDALONE: The simulator and the supporting  services are all run from one instance of opensim.exe  
+
     STANDALONE: The simulator and the supporting  services are all run from one instance of opensim.exe
     VARREGION: a region with variable dimension. At time of writing limited to square values of multiples of regions (ex. 4x4 = 16 region area) .   
+
     [[#SLURL]]: Is a special kind of Uniform Resource Locator applicable to opensim viewers.
     XENGINE: The opensim module responsible for of the script LSL / OSL  language use in scripting inworld with opensim.   
+
    [[#SOURCE]]: Webster says its a a generative force. In our case its the file sets use to generate opensimulator application. 
 +
    [[#SSH]]: Is Secure SHell. And is an encrypted way to communicate with your opensim server remotely. 
 +
    [[#TELEHUD]]: is basically a marker(s) to assign a teleport location in your land.
 +
    [[#TOS]]: Term of service. Under which condition are you proposing your services. In the case of opensim server or mainly simulator hosting services.
 +
    TUTORIAL: Short course presenting how to something. In opensim see http://profil.gimisa.ca for some tutorial I did.
 +
    [[#UBODE]]: Is a physic engine improvement done by AJL Duarte  over the original ODE physic.
 +
    [[#UPDATE]]: In opensim its downloading the latest release of opensim and transfer and  inspect ini files for changes to existing configuration.
 +
    [[#VARREGION]]: a region with variable dimension. At time of writing limited to square values of multiples of regions (ex. 4x4 = 16 region area).  
 +
    [[#VIEWER]]: a software that allow access to opensim virtual world.
 +
    [[#VIEWER REACH]]: is the distance define in the viewer reach window or preference that a user will perceive object.
 +
    [[#VIRTUALBOX]]: A software to run virtual machine, that is a virtual machine running inside a real machine.
 +
    [[#WELCOME]]: Ya everyone is welcome in opensim but that is a specification for the grid entry region.
 +
    [[#WIFI]]: In opensim its a C# http interface created by Diva Cantro more details here. http://opensimulator.org/wiki/Wifi  
 +
     [[#XENGINE]]: The opensim module responsible for of the script LSL / OSL  language use in scripting inworld with opensim.
 +
    [[#YENGINE]]: A new improved LSL/ OSL language scripting engine compatible with XENGINE above.   
 
   
 
   
 
----
 
----
  
OAR.
+
<p id="OAR">OAR</p>  
 
+
<blockquote>I advocate the use of OAR for backup similarly to any other software file extension. I believe that creators in opensim shall be able to save their work as easily within topensimulator.org a document iopensimulaopensimulator.orgopensimulator.orgpensim script command call  osConsoleCommand(string command). That script command is high treat level as define in by opensim. Therefor it haopensimulator.orgimulator.orgor parcel owner in the reopensimulator.orgopensiopensimulator.orgER or UUID
+
 
+
You can also use the UUID of the simulator operator to enforce treat level and rez the object yourself for your guess to use.
+
This script will automatically save an oar when the prim count change by more then 10 .
+
OAR saving can also be initiated by touch.
+
Here is an exemple of the script for such an object. :</blockquote>
+
 
+
    //gimisa@yahoo.fr 130502
+
    //oar saver rez on region you are owner
+
    //see read.me for instruction
+
    //130502 add interaction with hud
+
    //gimisa@yahoo.fr 130120
+
   
+
    integer setup=FALSE;//Chnage to false to complete setup
+
    string dir="/home/gimisa/Bureau/oar/gimisa/";//the location where to sa ve the oar so your user can access it.
+
    //_________________________________
+
    key id = "598c76d4-a9d0-2fd6-0a81-fc72dca068b5";//default key
+
    string idName="gimisa";
+
    key dtc;//detected avatar
+
    string region;//region name
+
    string cmd;//command
+
    integer ok;//status
+
    integer pcount;//number of prim cunt
+
    integer ppcount;//previous prim count
+
    integer flag=FALSE;//save oar flag
+
   
+
    //_________________________________
+
    integer dbug=FALSE;
+
   
+
    saveOAR(){
+
          region=llGetRegionName();
+
          ok=osConsoleCommand("change region "+ region);
+
          string tme=llGetTimestamp();
+
          llSay(0,"Region: "+ region);
+
          llInstantMessage(id,"saving oar " +dir+region + "."+tme + ".tgz" ); 
+
          llSay(0, "please wait a few minutes to complete"); 
+
          if(!setup) ok=osConsoleCommand("save oar " +dir+region + "."+ tme + ".tgz");
+
          osMakeNotecard(dir+region + "."+ tme + ".tgz","");//storgage is done by notecard name
+
          llSetObjectDesc((string)pcount);//count is store in object description 
+
    }
+
   
+
    sayPrimCount(){ 
+
        llSay(PUBLIC_CHANNEL,
+
            "There are " + primCountThisParcel(PARCEL_COUNT_TOTAL) + " total prims on this parcel.");
+
        llSay(PUBLIC_CHANNEL,
+
            primCountThisParcel(PARCEL_COUNT_OWNER) + " prims are owned by the parcel owner.");
+
        llSay(PUBLIC_CHANNEL,
+
            primCountThisParcel(PARCEL_COUNT_GROUP) + " prims set to or owned by the parcel's group.");
+
        llSay(PUBLIC_CHANNEL,
+
            primCountThisParcel(PARCEL_COUNT_OTHER) + " prims that are not set to the parcel group or owned by the parcel owner.");
+
        llSay(PUBLIC_CHANNEL,
+
            primCountThisParcel(PARCEL_COUNT_SELECTED) + " prims are selected.");
+
        llSay(PUBLIC_CHANNEL,
+
            primCountThisParcel(PARCEL_COUNT_TEMP) + " prims are temp-on-rez.");
+
        }
+
    string primCountThisParcel(integer flag)
+
    {
+
        vector currentPosition = llGetPos();
+
        pcount=llGetParcelPrimCount(currentPosition, PARCEL_COUNT_TOTAL, FALSE);
+
        return
+
        (string)llGetParcelPrimCount(currentPosition, flag, FALSE);
+
    }
+
   
+
    default
+
    { state_entry(){
+
        id=llGetLandOwnerAt(llGetPos());
+
        idName=llKey2Name(id);
+
        llSetTouchText(idName);
+
        llSetSitText("-");
+
        llSetTimerEvent(1.);
+
    }
+
   
+
   
+
    touch_start(integer num_detected)
+
    {  dtc=llDetectedKey(0);
+
      if ( !(dtc==id | dtc ==llGetOwner())) {
+
      llSay(0, "sorry but only "+ idName + " can use this");
+
      return;}
+
           
+
    sayPrimCount();//say in open chat prim counts of the sim
+
    saveOAR();//save oar
+
    state wait;
+
  }
+
  timer(){
+
      llSetTimerEvent(1800.);
+
      ppcount=(integer) llGetObjectDesc();
+
      primCountThisParcel(PARCEL_COUNT_TOTAL);
+
      if(pcount==0) return;
+
      if(ppcount==0){ ppcount=pcount;llSetObjectDesc((string)pcount); }
+
      if((pcount-ppcount>10 | pcount-ppcount<-10) && !flag){flag=TRUE; llSetTimerEvent(60.*15.);return;}
+
      flag=FALSE;
+
      llSetTimerEvent(3600.);
+
      if(!(pcount-ppcount>10 | pcount-ppcount<-10) )return;
+
      sayPrimCount();//say in open chat prim counts of the sim
+
      saveOAR();//save oar 
+
      }
+
    }
+
   
+
    state wait {
+
        state_entry(){ llSetTimerEvent(5.0*60.);}
+
   
+
    timer(){ llSay(0,"will appear on FTP when complete");
+
        llSetTimerEvent(0.);
+
        llLoadURL(dtc, "OAR FTP SITE", "ftp://where.to.access.the.oar.file");
+
        llResetScript();}
+
    }
+
  
 +
<blockquote>I advocate the use of OAR for backup similarly to any other software file extension. I believe that creators in opensim shall be able to save their work as easily as someone using  word or excel. Bring it back in aopensimulator.org.orgs easy.  OpenSim already allow that through the use of OAR. In  opensimulator.org JustinCC introduced OAR file extension and a mechanism to create (save)  and upload (load)  that file content inworld in any opensimulator . More can be read in http://opensimulator.org/wiki/OpenSim_Archives . That mechanism is available through operator console of the simulator. But not to the majority of creator whom normaly are hosted only and have no console access. I propose here a method to do that with a  script inworld to save the region content in OAR automatically. That script command is high treat level as define in opensim. Therefor the intervention of the simulator owner is necessary to allow the  function . The best is for operator to create an  object  and put the following script. The operator should  enable the  osConsoleCommand command for him in XENGINE script access control section of ini file. See here for detail http://opensimulator.org/wiki/OSSL_Enabling_Functions.  Using his UUID the simulator operator can enforce the treat level for osConsoleCommand  and rez the object for his guess to use while limiting its use to the script function. <br>
 +
What I propose is a  script to  automatically save an oar when the prim count change by more then 10 .OAR saving can also be initiated by touch
  
<blockquote>You can find a free copy along with a tutorial about oars and the object oarsaver in the little grid I operate for testing purpose call gimisaOS. You can reach it via  Hypergrid using your viewer map with search for 3d.gimisa.ca:9000</blockquote>
+
You can find a free copy along with a tutorial about oars and the object oarsaver in the little grid I operate for testing purpose call gimisaOS. You can reach it via  Hypergrid using your viewer map with search for 3d.gimisa.ca:9000 or copy paste in viewer local chat the link at the bottom of this page</blockquote>
  
 
----
 
----
  
MOP.
+
<p id="MOP">MOP</p> updated 170412
  
<blockquote>Media on prim can be very interesting. The way to add a media on the face of a prim is straightforward selecting a prim face in the build tool and then activating the media of choice in the texture tab media selector ( varies with viewer). Se tutorial in gimisa5 tutorial area for more detail and picture. You should display a picture of some kind ( you can use the same prim by texturing it) as default texture to illustrate to your visitor  that you are using media on prim.  Most viewer disable the auto play of media prim forcing user to  seek them for display. The advantage of Media on prim is that it has no impact server side since the viewer is handling the request via its internal browser. Please note that the view is asynchronous. Specially if video it  meaning that what you see is not what other will see or hear on the same prim face. Just like if you are visiting the page by yourself on the web.  The web browser in viewer is Mozilla compatible with QTWebKit. Therefor it has NONE of the HTML5 capabilities. </blockquote>
+
<blockquote>Media on prim can be very interesting. The way to add a media on the face of a prim is straightforward selecting a prim face in the build tool and then activating the media of choice in the texture tab media selector ( varies with viewer). Se tutorial in gimisa5 tutorial area for more detail and picture. You should display a picture of some kind ( you can use the same prim by texturing it) as default texture to illustrate to your visitor  that you are using media on prim.  Most viewer disable the auto play of media prim forcing user to  seek them for display. The advantage of Media on prim is that it has no impact server side since the viewer is handling the request via its internal browser. Please note that the view is asynchronous. Specially if video it  meaning that what you see is not what other will see or hear on the same prim face. Just like if you are visiting the page by yourself on the web.  The web browser in viewer was  Mozilla compatible with QTWebKit but has be change to chrome tool kit . Therefor it supports HTML5 tag as </audio> and </video> . The following HTML code to add has been updated for use with the codec supported by HTML5 </blockquote>
  
<blockquote>I am  using MOP to overcome the sound limit in OpenSim. A sound file play in world is limited to 10 sec per file. One Technic use to overcome that limit is to cut a longer sound file in 10 sec sections and to piggy back the set with a proper script . That has  a detrimental effect on your region cause of the bandwidth required to send the sound file in this way. The advantage is that the  sound is heard by all avatar in the vicinity. </blockquote>
+
<blockquote>I am  using MOP to overcome the sound limit in OpenSim. A sound file play in world is limited to 10 sec per file. One Technic use to overcome that limit is to cut a longer sound file in 10 sec sections and to piggy back the set with a proper script . That has  a detrimental effect on your region cause of the bandwidth required to send the sound file in this way. The advantage is that the  sound is heard by all avatar in the vicinity. </blockquote>.
  
<blockquote>The way I use to do that is via MOP. The sound file can be built from any mixer software you like and can have any length. The trick is to convert it to swf (flash) so it can be compatible with any operating system (mac, window, linux ) . There is a number of online converter that will be fine for the job. The file need to be accessible to the web. That is a serious limitation to causal users unfortunately comment on the later as to how to do that direcly in opensim would be nice. Then you need a wrapper in the form of a standard web page with the following embed tag.  
+
<blockquote>The way I do that is via MOP. The sound file can be built from any mixer software you like and can have any length. The trick is to convert it to swf (flash) so it can be compatible with any operating system (mac, window, linux ) . There is a number of online converter that will be fine for the job. The file need to be accessible to the web. That is a serious limitation to causal users unfortunately comment on the later as to how to do that direly in opensim would be nice. For now the best is either to rely on hosting providers on the net or install something like tiny. Then you need a wrapper in the form of a standard web page with the following embed tag.  
 
     <embed src="http://locationOfYourSoundFile/Here.swf" width="100%" height="100%" type="application/x-shockwave-flash" loop="false" autostart="true" >
 
     <embed src="http://locationOfYourSoundFile/Here.swf" width="100%" height="100%" type="application/x-shockwave-flash" loop="false" autostart="true" >
  
Line 152: Line 113:
 
<blockquote>As a useful alternate in case your user viewer does not support swf is to provide a hyperlink giver on touch of the prim pointing to the same web page. In this way a HTML5 code wrapper can be use in your web page as follow:</blockquote>
 
<blockquote>As a useful alternate in case your user viewer does not support swf is to provide a hyperlink giver on touch of the prim pointing to the same web page. In this way a HTML5 code wrapper can be use in your web page as follow:</blockquote>
  
<blockquote><audio controls autoplay>
+
<blockquote><audio autoplay>
 
   <source. src="myOriginalFile.mp3" type="audio/mpeg">
 
   <source. src="myOriginalFile.mp3" type="audio/mpeg">
 +
  <source. src="myOriginalFile.ogg" type="audio/ogg">
 +
  <source. src="myOriginalFile.wav" type="audio/wave">
 
   <embed src="http://locationOfYourSoundFile/Here.swf" width="100%" height="100%" type="application/x-shockwave-flash" loop="false" autostart="true" >
 
   <embed src="http://locationOfYourSoundFile/Here.swf" width="100%" height="100%" type="application/x-shockwave-flash" loop="false" autostart="true" >
Sorry your viewer does not support flash (swf)
+
Sorry your viewer does not support flash (swf) nor HTML5 tags please refer to https://community.secondlife.com/knowledgebase/english/how-to-use-adobe-flash-in-second-life-viewer-40-and-later-r1406/ for more details
 
</embed>
 
</embed>
 
</audio></blockquote>  
 
</audio></blockquote>  
 
+
<blockquote>
<blockquote>You can get a demo of the effect of this trick by hypergrid visiting 3d.gimisa.ca:9000 and search for gimisa4 region in map.   
+
Using ,Data:url one could refer to  sound or media in general available from the web ,directly in a text string instead of having to host it in a web server of his own. One could go as far as reformatting the web page to his own liking and provide dynamic content via script using An exemple of that way of achieving this is available in gimisa5 store in the tool rack . More on that in DATA:URL .
 +
</blockquote>
 +
<blockquote>A trick I am using to achieve synchronous MOP effect for visitors is to use scripts.  I clear the media on the prim face so it does not start when avatar come into vicinity. Then I use an event like touch  to create the media texture . Though the effect is not totally simultaneous test with friends has show that its close enough for use. A made a  firework display that is started on touch of the control panel that appears for all people standing in the area. You can get a demo of the effect of this trick by hypergrid visiting 3d.gimisa.ca:9000 and search for gimisa4 region in map.   
 
</blockquote>
 
</blockquote>
  
Line 165: Line 130:
 
----
 
----
  
ARC.
+
<p id="ARC">ARC</p>
 
<blockquote>ARC, Avatar Rendering Cost is an information the user should be sensitive too for a pleasant grid or hypergrid travel</blockquote>
 
<blockquote>ARC, Avatar Rendering Cost is an information the user should be sensitive too for a pleasant grid or hypergrid travel</blockquote>
  
  
<blockquote>The load an avatar represent in being rendered is an interesting  figure to be considered by user. For local or hypergrid traveling the impact of the integration of avatar in the region scene is more or less loosely represented by that figure. This relative amount can be use comparatively as a guide for the amount represented by the avatar in rendering effort.  In general the travelers should pack the avatar with as little as is needed to make a personality to minimise the load the region they are visiting. This is as much to have a pleasant experience for themselves as to help the experience of other by the same principles . They can put in their suitcase the travel avatar and the regular flashy model for convenience so they could switch while they traveling if they are in need to go to something more .</blockquote>
+
<blockquote>The load an avatar represent in being rendered is an interesting  figure to be considered by user. For local or hypergrid traveling the impact of the integration of avatar in the region scene is more or less loosely represented by that figure. This relative amount can be use comparatively as a guide for the amount represented by the avatar in rendering effort.  In general the travelers should pack the avatar with as little as is needed to make a personality to minimize the load the region they are visiting. This is as much to have a pleasant experience for themselves as to help the experience of other by the same principles . They can put in their suitcase the travel avatar and the regular flashy model for convenience so they could switch while they traveling if they are in need to go to something more .</blockquote>
  
 
<blockquote>A good tool to judge the weight of one avatar is to use the avatar rendering cost display available in viewers. When activated with shortcut key  ctl-alt-sht-C you are displayed a number over your head as well as avatar surrounding you . When green the avatar is good to travel. Yellow is limited while  RED is no no. Its an interesting experience to make to remove part of an your avatar outfit and see the impact on that display. Good outfit part does show not only by the look they provide but also by the weight they represent for that results. </blockquote>
 
<blockquote>A good tool to judge the weight of one avatar is to use the avatar rendering cost display available in viewers. When activated with shortcut key  ctl-alt-sht-C you are displayed a number over your head as well as avatar surrounding you . When green the avatar is good to travel. Yellow is limited while  RED is no no. Its an interesting experience to make to remove part of an your avatar outfit and see the impact on that display. Good outfit part does show not only by the look they provide but also by the weight they represent for that results. </blockquote>
  
<blockquote>People should think about how much a traveling  avatar  has to transfer to the other grid (HG travel) server and how much information the region server has to handle to render the result they and other in the vicinity sees. This is all their texture, mesh and prim to be  added to their scripts compiled. The few second required to render  see a lot of activity both in the robust server and the region servers. This time is spent to acquiring that information (prim scultp mesh shapes , textures, compiled scripts) . The result is use to create the rendering information for the avatar and its numerous  child avatars in the region and adjacent regions for the new arrival (max of 9). </blockquote>
+
<blockquote>People should think about how much a traveling  avatar  has to transfer to the other grid (HG travel) server and how much information the region server has to handle to render the result they and other in the vicinity sees. This is all their texture, mesh and prim to be  added to their scripts compiled. The few second required to render  see a lot of activity both in the robust server and the region servers. This time is spent to acquiring that information (prim sculpt mesh shapes , textures, compiled scripts) . The result is use to create the rendering information for the avatar and its numerous  child avatars in the region and adjacent regions for the new arrival (max of 9). </blockquote>
  
 
  <blockquote>More about avatar rendering cost calculation and detail can be read on "http://wiki.secondlife.com/wiki/Avatar_Rendering_Cost" </blockquote>
 
  <blockquote>More about avatar rendering cost calculation and detail can be read on "http://wiki.secondlife.com/wiki/Avatar_Rendering_Cost" </blockquote>
Line 179: Line 144:
  
 
----
 
----
CHAT_BOT.
+
<span id="AIML">CHAT_BOT. (R170714)</span>
  
 
<blockquote>I use a number of way to interact with visitor. Making the visit more interactive can be a challenge to try to make the visit more interesting. Scripting provides the tool to do that and touch is the perfect function to trigger interactivity while not causing annoyance. Its also low on lag so this is my interactive function of choice. AIML  is the language to give brain to your chat bot. Its interest is in the apparent two way communication it provide much like natural languages. There is script to do that inworld in lslWiki but scripting memory is too limited to do a good job so external service is required. I have tried that and will come back to it later.</blockquote>
 
<blockquote>I use a number of way to interact with visitor. Making the visit more interactive can be a challenge to try to make the visit more interesting. Scripting provides the tool to do that and touch is the perfect function to trigger interactivity while not causing annoyance. Its also low on lag so this is my interactive function of choice. AIML  is the language to give brain to your chat bot. Its interest is in the apparent two way communication it provide much like natural languages. There is script to do that inworld in lslWiki but scripting memory is too limited to do a good job so external service is required. I have tried that and will come back to it later.</blockquote>
  
<blockquote> What I found more intuitive and accessible using the dialogue blue box tool also offered with scripting . It is possible to construct with it a rather easy two way communication in the form of multiple choice discussion. That way is less interactive then a true conversational discussion but can be as attractive as a story book where you are the Hero. Using OSL  notecard feature one can rig a notecard to provide for extensive exchange with the visitor. The line length of the OSL card is 1024 bytes ample for supporting  multiple choices and trends in the discussion.  The visitor reads the story line and make one choice out for the continuation. I use three choices the story direction can take  but that is an arbitrary limit. And while at it why stopping to chat lines. The same tool can be use to hand out interactively LandMark,  Object texture notecard  and the like by refering to them in the story notecard. Add to it sound wave files of story and choice recording and you have a voice reader to accompany you visitor. Put that in a NPC (more about that in AIML)  and you have the perfect guide to your exhibit. And top it with choice of language and you have a rather interesting interactive feature pack.  A demo and code of that way of using interaction in opensim is available in gimisaOS my little test grid. </blockquote>  
+
<blockquote> What I found more intuitive and accessible using the dialogue blue box tool also offered with scripting . It is possible to construct with it a rather easy two way communication in the form of multiple choice discussion. That way is less interactive then a true conversational discussion but can be as attractive as a story book where you are the Hero. Using OSL  notecard feature one can rig a notecard to provide for extensive exchange with the visitor. The line length of the OSL card is 1024 bytes ample for supporting  multiple choices and trends in the discussion.  The visitor reads the story line and make one choice out for the continuation. I use three choices the story direction can take  but that is an arbitrary limit. And while at it why stopping to chat lines. The same tool can be use to hand out interactively LandMark,  Object texture notecard  and the like by referring to them in the story notecard. Add to it sound wave files of story and choice recording and you have a voice reader to accompany you visitor. Put that in a NPC (more about that in AIML)  and you have the perfect guide to your exhibit. And top it with choice of language and you have a rather interesting interactive feature pack.  A demo and code of that way of using interaction in opensim is available in gimisaOS my little test grid. </blockquote>  
  
<blockquote>gimisaOS landing welcome have two demo  Brat at the gimisaOS welcome sign and Joe at the OAR loader both you cant miss them. Joe  has also voice in addition to the  dialogue blue box  both  french / english . </blockquote>  
+
<blockquote>gimisaOS landing welcome have two demo  Brat at the gimisaOS welcome sign and Joe at the OAR loader both you cant miss them. Joe  has also voice in addition to the  dialogue blue box  both  french / English . </blockquote>  
  
  
<blockquote> I have considered AIML as stated above.  There is an old  script in lslwiki about  AIML decoding done inworld.  This methode is presented in ALICE chat bot web site http://www.alicebot.org/about.html.  It was also  integrated in Radegast text viewer .  To my knowledge it never took ground  in opensim/SL . I guess its cause the feasability is not there to search notecard bank having a few 100M typical for a bot to be somehow smart . You will find in opensim a well know bar tender bot using  pandora bot.( http://www.pandorabots.com/) That bot can be easly configured to use an  account you would create in  pandora. But unfortunately the terms of service  of pandora prevent you from doing so in the following terms:</blockquote>  
+
<blockquote> I have considered AIML as stated above.  There is an old  script in lslwiki about  AIML decoding done inworld.  This method is presented in ALICE chat bot web site http://www.alicebot.org/about.html.  It was also  integrated in Radegast text viewer .  To my knowledge it never took ground  in opensim/SL . I guess its cause the feasibility is not there to search notecard bank having a few 100M typical for a bot to be somehow smart . You will find in opensim a well know bar tender bot using  pandora bot.( http://www.pandorabots.com/) That bot can be easly configured to use an  account you would create in  pandora. But unfortunately the terms of service  of pandora prevent you from doing so in the following terms:</blockquote>  
  
 
<blockquote>  <blockquote>    5.3 You agree not to access (or attempt to access) any of the Services by any means other than through the interface that is provided by Pandorabots, unless you have been specifically allowed to do so in a separate agreement with Pandorabots. You specifically agree not to access (or attempt to access) any of the Services through any automated means (including use of scripts or web crawlers) and shall ensure that you comply with the instructions set out in any robots.txt file present on the Services.</blockquote></blockquote>  
 
<blockquote>  <blockquote>    5.3 You agree not to access (or attempt to access) any of the Services by any means other than through the interface that is provided by Pandorabots, unless you have been specifically allowed to do so in a separate agreement with Pandorabots. You specifically agree not to access (or attempt to access) any of the Services through any automated means (including use of scripts or web crawlers) and shall ensure that you comply with the instructions set out in any robots.txt file present on the Services.</blockquote></blockquote>  
Line 194: Line 159:
  
  
<blockquote> What I did therefor is implement an external server. Unfortunately that make it not an application that can be easly implement by causual user compare to the pandora bot solution.  The server use pyAiml a python aiml  interpreter that is interrogated by the inworld bot to reply to visitor.  I have added to it a personalisation notecard that overide the request to the external server for specific such as gimisaOS grid. Asking about the grid bypass the external request and get the reply from the notecard.  You will find walking NPC all around the few region of my test grid . For instance, the dancer  in welcome first floor , the lady around pise tower in  gimisa5 the firewoman ,  the paramedic  and the two astronaut in gimisa8 nasa exibit.  </blockquote>
+
<blockquote> What I did therefor is implement an external server. Unfortunately that make it not an application that can be easily implement by causual user compare to the pandora bot solution.  The server use pyAiml a python aiml  interpreter that is interrogated by the inworld bot to reply to visitor.  I have added to it a personification notecard that override the request to the external server for specific such as gimisaOS grid. Asking about the grid bypass the external request and get the reply from the notecard.  You will find walking NPC all around the few region of my test grid . For instance, the dancer  in welcome first floor , the lady around pise tower in  gimisa5 the firewoman ,  the paramedic  and the two astronaut in gimisa8 nasa exhibit</blockquote>
 +
 
 +
<blockquote>I found a way to use Radegast interacting with IMs to present a chat bot discussion through IMs. And while at it I adapted a second server to pyAiml2.0 see https://docs.google.com/document/d/1wNT25hJRyupcG51aO89UcQEiG-HkXRXusukADpFnDs4/pub which has lot more tag to support a smarter bot application. I found a pyAiml2.0 interpreter here where Keith is actually an active developer open to support and suggestion.  https://github.com/keiffster/program-y  </blockquote>
  
 
<blockquote>I dont know if explaining how the server is implemented is something of interest to opensim user platform but certainly an email asking for that information is something I would be glad to reply to. </blockquote>
 
<blockquote>I dont know if explaining how the server is implemented is something of interest to opensim user platform but certainly an email asking for that information is something I would be glad to reply to. </blockquote>
Line 201: Line 168:
  
 
----
 
----
SCALING.
+
<p id="SCALE">SCALING</p>
  
<blockquote>Scale a mesh can be rather spectacular at time. Any attempt will litteraly explode out the object and fill you screen with a mess. </blockquote>
+
<blockquote>Scale a mesh can be rather spectacular at time. Any attempt will literally explode out the object and fill you screen with a mess. </blockquote>
  
 
<blockquote>Any builders know how to scale a prim. You select the build scale tool grap the guides and expend or contract the prim as you like. An other way is to change the x,y,z size of the object in the prim size data block just bellow position. In opensim the prim upper size limit is set in opensim.ini configuration file. The default size is 256m. But its possible to rez object that are already sized bigger then that. Naturaly scaling them after rezzing will cause the limit to be applied.  Similarly scaling down is also limited. The opensim built in limit is 0.01m. That means that any attempt to change a prim  x,y,z size to lower then 0.01 will fail and the scale change will not be applied . When you try to scale that low with the guides the scaling down stop and block at that point. </blockquote>
 
<blockquote>Any builders know how to scale a prim. You select the build scale tool grap the guides and expend or contract the prim as you like. An other way is to change the x,y,z size of the object in the prim size data block just bellow position. In opensim the prim upper size limit is set in opensim.ini configuration file. The default size is 256m. But its possible to rez object that are already sized bigger then that. Naturaly scaling them after rezzing will cause the limit to be applied.  Similarly scaling down is also limited. The opensim built in limit is 0.01m. That means that any attempt to change a prim  x,y,z size to lower then 0.01 will fail and the scale change will not be applied . When you try to scale that low with the guides the scaling down stop and block at that point. </blockquote>
Line 209: Line 176:
 
<blockquote> Now if the prim is part of a link set the discussion above also applies and that link will limit the scaling of the whole object when  one of it child prims reach either the upper or lower limit imposed. To change the upper limit is rather simple if you have access to your opensim.ini. I have successfully use 512m and 1024m as upper prim size limits. But there is no way to change the lower size limit pass 0.01. There is trick to "see" smaller prim size by using partial transparencies. But when it comes to scaling an object down any prim that one of its dimension falls below 0.01 will block that scaling downward for the whole object so proportionality is maintained. </blockquote>
 
<blockquote> Now if the prim is part of a link set the discussion above also applies and that link will limit the scaling of the whole object when  one of it child prims reach either the upper or lower limit imposed. To change the upper limit is rather simple if you have access to your opensim.ini. I have successfully use 512m and 1024m as upper prim size limits. But there is no way to change the lower size limit pass 0.01. There is trick to "see" smaller prim size by using partial transparencies. But when it comes to scaling an object down any prim that one of its dimension falls below 0.01 will block that scaling downward for the whole object so proportionality is maintained. </blockquote>
  
<blockquote>A mesh is imported as an object of a certain size.The imported size might be far different then its creation size in the 3d software. Regardless the above discussion applies. As long as there is no attempt to scale the mesh object  simulator limits applicable are NOT imposed.  A simple inspection of a linked set mesh will show that some of its links might contain element that are over the upper limit and or under the 0.01 lower limit. When trying to scale the object system limits will be enforced and if the mesh contain mesh link having smaller dimensions then 0.01 the size of the object will IMMEDIATLY be resized to fit the limit. I have seen case where the a mesh link original size is 0.001 for one of its dimension x,y, or z. This kind of situation will be leading to litteraly explode out the object with 10x scaling. and fill you screen with a mess. </blockquote>
+
<blockquote>A mesh is imported as an object of a certain size.The imported size might be far different then its creation size in the 3d software. Regardless the above discussion applies. As long as there is no attempt to scale the mesh object  simulator limits applicable are NOT imposed.  A simple inspection of a linked set mesh will show that some of its links might contain element that are over the upper limit and or under the 0.01 lower limit. When trying to scale the object system limits will be enforced and if the mesh contain mesh link having smaller dimensions then 0.01 the size of the object will IMMEDIATELY be resized to fit the limit. I have seen case where the a mesh link original size is 0.001 for one of its dimension x,y, or z. This kind of situation will be leading to literally explode out the object with 10x scaling. and fill you screen with a mess. </blockquote>
  
<blockquote>The solution is easy.  Inspect each element for size and correct any value lower then 0.01 up to at least that. Well that is nice for a mesh object with one to few links but what if we talking about few hundreds ( yes opensim can accept a lot of links no limit unless enforce in opensim.ini) . So the justification for a tool I did . The tool is a prim that you add to you link set. Then clic /touch. It will inspect each element of the linkset for size and correct any value lower then 0.01 up to at least that. The tool will confirm complete. You can then scale down. Unlink that tool and done . </blockquote>
+
<blockquote>The solution is easy.  Inspect each element for size and correct any value lower then 0.01 up to at least that. Well that is nice for a mesh object with one to few links but what if we talking about few hundreds ( yes opensim can accept a lot of links no limit unless enforce in opensim.ini) . So the justification for a tool I did . The tool is a prim that you add to you link set. Then click /touch. It will inspect each element of the link set for size and correct any value lower then 0.01 up to at least that. The tool will confirm complete. You can then scale down. Unlink that tool and done . </blockquote>
  
 
<blockquote>You can  get this tool  via  Hypergrid using your viewer map with search for 3d.gimisa.ca:9000 .</blockquote>
 
<blockquote>You can  get this tool  via  Hypergrid using your viewer map with search for 3d.gimisa.ca:9000 .</blockquote>
  
 
----
 
----
XENGINE.
+
<p id="XENGINE">XENGINE</p>
  
 
<blockquote>A strange situation happen to me on one region of my test grid. All scripts stop responding for two days. You can stop a script or  a whole simulator script set  from running by issuing a >> scripts stop command in sim console. This will stop all script and give you a list in console . A very useful debugging feature to know if you have offending script to pin point (more on that in following article) . You can also disable scripts in the debug tab of the estate manager window . These are perfectly normal way to have script not responding in region. That will be indicated by the missing run mark in the check box on the lower corner of the script edition window of any script in the simulator.
 
<blockquote>A strange situation happen to me on one region of my test grid. All scripts stop responding for two days. You can stop a script or  a whole simulator script set  from running by issuing a >> scripts stop command in sim console. This will stop all script and give you a list in console . A very useful debugging feature to know if you have offending script to pin point (more on that in following article) . You can also disable scripts in the debug tab of the estate manager window . These are perfectly normal way to have script not responding in region. That will be indicated by the missing run mark in the check box on the lower corner of the script edition window of any script in the simulator.
Line 263: Line 230:
  
 
----
 
----
SCRIPT PROBLEM.
+
<p id="SCRIPT">SCRIPT PROBLEM</p>
 
<blockquote>
 
<blockquote>
 
Debuging and mainly finding offending scripts might be hard on users. An impossible task if one dont have console access.  Window / Linux provides monitoring means of reporting  CPU and/or  memory usage. The  TASK MANAGER for window  and  TOP for linux are well know ones among them. <br><br>
 
Debuging and mainly finding offending scripts might be hard on users. An impossible task if one dont have console access.  Window / Linux provides monitoring means of reporting  CPU and/or  memory usage. The  TASK MANAGER for window  and  TOP for linux are well know ones among them. <br><br>
Line 270: Line 237:
 
Searching google left me with a lot of links but no answers.  
 
Searching google left me with a lot of links but no answers.  
 
<br><br>
 
<br><br>
What I found useful in that case is to use the console script stop command. Yes it stop all script just like the estate manager disable. But more over it provides a listing of all script in the region. Its easy to copy that list and paste it in a spreadsheet. Then, and that is where it become interesting, its an other easy step to modify that spreasheet to add the script start console command prefix to each individual script entries and to save that file. Next, using the command-script console command,  pointing to that file just created,  run that file and restart ALL script . But more over one can fine tune, individually via prefix to each line of the speadsheet ,  which script to start, and stop.  
+
What I found useful in that case is to use the console script stop command. Yes it stop all script just like the estate manager disable. But more over it provides a listing of all script in the region. Its easy to copy that list and paste it in a spreadsheet. Then, and that is where it become interesting, its an other easy step to modify that spreadsheet to add the script start console command prefix to each individual script entries and to save that file. Next, using the command-script console command,  pointing to that file just created,  run that file and restart ALL script . But more over one can fine tune, individually via prefix to each line of the spreadsheet ,  which script to start, and stop.  
 
<br><br>
 
<br><br>
 
Armed  with that tool and using a well know iterative technic by trial an error, each time narrowing the number of scripts.  I found the single script among the 1600 that had my CPU jump by 60% and correct it.<br><br>   
 
Armed  with that tool and using a well know iterative technic by trial an error, each time narrowing the number of scripts.  I found the single script among the 1600 that had my CPU jump by 60% and correct it.<br><br>   
Line 276: Line 243:
  
 
----
 
----
AGE - STAT  
+
<p id="SCRIPT">SCRIPT TRICKS</p> 2020-11-30
 +
<blockquote>
 +
List trick :<br><br>
 +
Its well documented that list cannot be nested ( see http://wiki.secondlife.com/wiki/List ). So that list1 = [1,2,3] and list2 = ["A","B","C"] cannot be translated into list3 = [ 1,2,3,["A","B","C"]] .
 +
<br>I use list a lot in queries , mainly dataservice or html queries . Listing the query key is a way to transmit data to the reply of these functions in the form [queryid, variable1 , variable2] .
 +
<br><br>
 +
But what if you need to transfer a list to the query like [queryid, list1, list2] in our exemple having a query list like [queryid ,[1,2,3],["A","B","C"] ].
 +
<br>
 +
Use llList2CSV to encode the embeded list and use the reverse llCSV2List to decode it . Doing this way the query list in our exemple is queryid+llList2CSV(list1)+llList2CSV(list2) . This translate for our exemple into  list1 = "1,2,3" and list2 = "A,B,C" so that query list is [querid, "1,2,3","A,B,C"]. Getting back the orginal data as list1=llCSV2List(query,1,1) and list2 = llCSV2List(query,2,2)
 +
</blockquote>
 +
----
 +
<p id="AGE">AGE - STAT </p>
 
<blockquote>
 
<blockquote>
 
We are all getting older , really and virtual. Virtually you have a rez date , that is a date you created you avatar in a grid. That rez date for that grid derive your age measured in days and show up in your profile. The other day , in my little test grid , I had a new born HG visitor. This attracted my attention cause it peculiarly young to be hg jumping when first register into a grid. If you new to opensim  even if former SL resident , HG jump is not something that come natural. Your first days in a new grid will usually be devoted to getting around and  installed in your new world . So it intrigued me as to what is the age distribution of my visitors. I have a 30 days rolling graphic presentation of the number of visitor per day and daily tally time done with osl draw functions that you can check and grab in gimisa5 hypergrid dome . So I though why not add a plot of age distribution on it.   
 
We are all getting older , really and virtual. Virtually you have a rez date , that is a date you created you avatar in a grid. That rez date for that grid derive your age measured in days and show up in your profile. The other day , in my little test grid , I had a new born HG visitor. This attracted my attention cause it peculiarly young to be hg jumping when first register into a grid. If you new to opensim  even if former SL resident , HG jump is not something that come natural. Your first days in a new grid will usually be devoted to getting around and  installed in your new world . So it intrigued me as to what is the age distribution of my visitors. I have a 30 days rolling graphic presentation of the number of visitor per day and daily tally time done with osl draw functions that you can check and grab in gimisa5 hypergrid dome . So I though why not add a plot of age distribution on it.   
Line 282: Line 260:
 
On grid that have profile activated in opensim.ini / robust.ini (see this for more detail http://opensimulator.org/wiki/UserProfiles) right clic  on the avatar and asking for profile will give you avatar name including ,home grid url with port and born date and age in days and general profil data via profil tabs. To gather statistics you need to have access to those figures in scripts. For local user a script can access the born date via  llRequestAgentData(key, DATA_BORN) ref:  http://wiki.secondlife.com/wiki/LlRequestAgentData .  
 
On grid that have profile activated in opensim.ini / robust.ini (see this for more detail http://opensimulator.org/wiki/UserProfiles) right clic  on the avatar and asking for profile will give you avatar name including ,home grid url with port and born date and age in days and general profil data via profil tabs. To gather statistics you need to have access to those figures in scripts. For local user a script can access the born date via  llRequestAgentData(key, DATA_BORN) ref:  http://wiki.secondlife.com/wiki/LlRequestAgentData .  
 
<br><br>
 
<br><br>
The problem is that no command exist that will provide you with that data for HG visitor. All the scripts can provide about HG visitors is the name with llDetectedName() script or llKey2Name or oslGetAgent(). It is possible from the name information to get the url of the avatar home location. With a bit more gymnastic using a xml_rpc request to the home server of the visitor you will finaly get the born date of the visitor coded as unix time stamp. That time can be  translated using LlGetUnixTime into age in days. TADA!!! A demo of that solution is available in gimisa3 welcome.Just touch the age cube.  
+
The problem is that no command exist that will provide you with that data for HG visitor. All the scripts can provide about HG visitors is the name with llDetectedName() script or llKey2Name or oslGetAgent(). It is possible from the name information to get the url of the avatar home location. With a bit more gymnastic using a xml_rpc request to the home server of the visitor you will finaly get the born date of the visitor coded as UNIX time stamp. That time can be  translated using LlGetUnixTime into age in days. TADA!!! A demo of that solution is available in gimisa3 welcome.Just touch the age cube.  
 
<br><br>
 
<br><br>
 
</blockquote>
 
</blockquote>
  
 
----
 
----
PERFORMANCE  
+
<p id="PERFORMANCE">PERFORMANCE</p>
 
<blockquote>
 
<blockquote>
I know you probably know this . As you witness with experimented hoster for opensim they usually restart their region at frequent intervals. But how much important this practice is . Using linux top command I was able to obtain the following data after 24 days of opensim uninterupted operation of my little grid. top - 08:04:34 up 24 days,  2:54,  1 user,  load average: 6.48, 5.68, 5.27
+
I know you probably know this . As you witness with experimented hoster for opensim they usually restart their region at frequent intervals. But how much important this practice is . Using Linux top command I was able to obtain the following data after 24 days of opensim uninterupted operation of my little grid. top - 08:04:34 up 24 days,  2:54,  1 user,  load average: 6.48, 5.68, 5.27
 
<br><br>
 
<br><br>
What does this mean. Well load average three numbers are for 1min 5min and 15min average of the load on the machine, The number themselves  means the number of CPU cycle necessary to process the items in queue. So is 6.48 CPU cycles bad. No if you have 12 CPU to handle the task they will team up to take only 1 clock tick. But this is very bad if you only have 2 CPUs teaming as in my case . It translate into sluggish server response on teleporting to region and rezzing object. Script processing is also painfull.  
+
What does this mean. Well load average three numbers are for 1min 5min and 15min average of the load on the machine, The number themselves  means the number of CPU cycle necessary to process the items in queue. So is 6.48 CPU cycles bad. No if you have 12 CPU to handle the task they will team up to take only 1 clock tick. But this is very bad if you only have 2 CPUs teaming as in my case . It translate into sluggish server response on teleporting to region and rezzing object. Script processing is also painful.  
 
<br><br>
 
<br><br>
 
Now what is happening after restarting the 4 simulator running on my computer. top - 12:00:04 up 24 days,  6:49,  1 user,  load average: 1.36, 1.49, 1.66. Yes this is the same load, gimisaOS grid. Same 4 simulator with same content now takes up 1.66 15min average load a very acceptable value on a 2 CPU chips.
 
Now what is happening after restarting the 4 simulator running on my computer. top - 12:00:04 up 24 days,  6:49,  1 user,  load average: 1.36, 1.49, 1.66. Yes this is the same load, gimisaOS grid. Same 4 simulator with same content now takes up 1.66 15min average load a very acceptable value on a 2 CPU chips.
 
<br><br>
 
<br><br>
To restart you region you can use the estate manager window and on the debug tab you can hit the restart button. This function is accessible to any estate manager. For server system operator the console command  region restart bluebox restart 15sec  15 will do a restart in the next 15 second. But these method will require your attention everytime you want to restart you region.  
+
To restart you region you can use the estate manager window and on the debug tab you can hit the restart button. This function is accessible to any estate manager. For server system operator the console command  region restart blue box restart 15sec  15 will do a restart in the next 15 second. But these method will require your attention every time you want to restart you region.  
 
<br><br>
 
<br><br>
 
For an automated method one can use the above feature with a OSL script. One can enable OsRegionRestart opensim scripting function and put an appropriate timer on it to restart the region at interval (ref: http://opensimulator.org/wiki/OsRegionRestart) . An example of such a script is available in gimisa5 store.Just drop this box in any region you have estate management rights and  it will restart at interval set by timer.  
 
For an automated method one can use the above feature with a OSL script. One can enable OsRegionRestart opensim scripting function and put an appropriate timer on it to restart the region at interval (ref: http://opensimulator.org/wiki/OsRegionRestart) . An example of such a script is available in gimisa5 store.Just drop this box in any region you have estate management rights and  it will restart at interval set by timer.  
Line 351: Line 329:
 
5 1 * * 5 /home/gimisa/Bureau/python/remoteResart.py 225
 
5 1 * * 5 /home/gimisa/Bureau/python/remoteResart.py 225
 
</pre>
 
</pre>
 +
<br><br>
 +
After about a year of using the method above I notice that some script were hanging and  a general deterioration in the simulator behavior happen  even if the CPU usage was apparently good. It seem the remote restart available through the remote admin simulator command ( http://opensimulator.org/wiki/RemoteAdmin:admin_restart ) or through the estate manager window is not performing a deep enough restart in comparaison to a cold quit command. 
 +
<br>
 +
So as presented in the following link http://opensimulator.org/wiki/Automating_Tasks  and since I am using ubuntu screen , its possible to send a direct command to the simulator via a screen -xS screenName -X stuff  "alarm restart in 1 minute " to alarm, quit , and restart the simulator. So I replace the simulator.admin_restart from the python routine above with a screen  command and replace that bash routine in my crontab job list.
 +
<br><br>
 +
The code is :
 +
    #!/bin/bash
 +
    screen -xS $1 -X stuff "alert region restart in 2 minutes
 +
    "
 +
    sleep 1m
 +
    screen -xS $1 -X stuff "alert region restart in 1 minute
 +
    "
 +
    sleep 30
 +
    screen -xS $1  -X stuff "alert region restart in 30 secondes
 +
    "
 +
    sleep 20
 +
    screen -xS $1  -X stuff "alert region restart in 10 seconds
 +
    "
 +
    sleep 5
 +
    screen -xS $1  -X stuff "alert region stopping will restart in 5 minutes
 +
    "
 +
    sleep 5
 +
    screen -xS $1 -X stuff "quit
 +
    "
 +
    sleep 600
 +
   
 +
    screen -X -S $1 quit
 +
   
 +
    sleep 5
 +
   
 +
   
 +
    case $1 in
 +
        "go" )
 +
        sh /home/gimisa/goar.sh
 +
        ;;
 +
        "g3" )
 +
        sh /home/gimisa/g3.sh
 +
        ;;
 +
        "gi" )
 +
        sh /home/gimisa/gi.sh
 +
        ;;
 +
        "g4" )
 +
        sh /home/gimisa/g4.sh
 +
        ;;
 +
        "g5" )
 +
        sh /home/gimisa/g5.sh
 +
        ;;
 +
       
 +
        esac
 +
<br><br>
 
</blockquote>
 
</blockquote>
  
 
----
 
----
MESH  
+
<p id="MESH">MESH</p>
 
<blockquote>
 
<blockquote>
 
I have made a whole series of tutorial in gimisa5 about mesh , mesh and material , mainly blender  importing up to rigged avatar creation see paragraph bottom of article for new addition. I also work out a comparaison between prim, sculpty and mesh as building block for your project. The limitations of each medium is  spell out for each of those tool and illustrated in the different tutorials . But I lately came across this article from http://blog.nalates.net/2015/10/01/second-lifes-limits/#more-15460  where they indicate that not only there is a upper limit on material of 8 and total of triangle count per object  of 174,752 for you mesh,  which was already documented . But they mention there is also a limit per material of 175,752/8 = 21,969 triangles . This later limit is not documented (but would explain failure of loading a MESH even if everything else is in order). Validating this situation in loading up in my grid I did not witness any effect for a mesh with one material having a total triangle count OVER 21,969. Nevertheless the step to improve you builds in this respect is the same as the step to overcome the material count limit of 8 as suggestion in my tutorial,is  to split the work in multiple objects,  that you import together so they combine properly in world.  
 
I have made a whole series of tutorial in gimisa5 about mesh , mesh and material , mainly blender  importing up to rigged avatar creation see paragraph bottom of article for new addition. I also work out a comparaison between prim, sculpty and mesh as building block for your project. The limitations of each medium is  spell out for each of those tool and illustrated in the different tutorials . But I lately came across this article from http://blog.nalates.net/2015/10/01/second-lifes-limits/#more-15460  where they indicate that not only there is a upper limit on material of 8 and total of triangle count per object  of 174,752 for you mesh,  which was already documented . But they mention there is also a limit per material of 175,752/8 = 21,969 triangles . This later limit is not documented (but would explain failure of loading a MESH even if everything else is in order). Validating this situation in loading up in my grid I did not witness any effect for a mesh with one material having a total triangle count OVER 21,969. Nevertheless the step to improve you builds in this respect is the same as the step to overcome the material count limit of 8 as suggestion in my tutorial,is  to split the work in multiple objects,  that you import together so they combine properly in world.  
<br>
+
<br><br>
 
So keep an additional eye on your triangle counts if you doing object for import. My way of doing this is to do my object. Then assign material. Split my final build per material.  Make sure I dont exceed the triangle count limit per material.  Sometimes  I recombine  a maximum of 8  object into one in a logical way to do my final object(s). There is nothing wrong in leaving the object splitted which give additional flexibility with only one face ( similar to sculpty)  at the cost of larger linked object set. As far as I can see UVmaps will follow properly in the recombination so that texturing will still be maintain proper inworld.  
 
So keep an additional eye on your triangle counts if you doing object for import. My way of doing this is to do my object. Then assign material. Split my final build per material.  Make sure I dont exceed the triangle count limit per material.  Sometimes  I recombine  a maximum of 8  object into one in a logical way to do my final object(s). There is nothing wrong in leaving the object splitted which give additional flexibility with only one face ( similar to sculpty)  at the cost of larger linked object set. As far as I can see UVmaps will follow properly in the recombination so that texturing will still be maintain proper inworld.  
 +
<br><br>
 +
Not so lately ( 2016-01 ) I have added four new tutorial about meshes. They  can be found in the import-house in gimisa5. Two are rather advance UVTexturing using clone tool and the other one is about patching holes via the blender grid tool . The other two are more accessible to none blender initiates. One is about making 3D lettering using blender text tool to import inworld. Without much knowledge of blender it is possible to intuitively create lettering text that can be converted in mesh to DAE file and import inworld. The second tutorial in the Mesh import house is  about creating 3D object out of simple pictures using autodesk cloud software freely available for small project. Its amazingly simple to use and the results are awesome. The 123dcatch depot in itself is a source of very interesting mesh constructions for you to explore.
 
<br>
 
<br>
Lately ( 2016-01-18 ) I have added four new tutorial about meshes. They  can be found in the import-house in gimisa5. Two are rather advance UVTexturing using clone tool and the other one is about patching holes via the blender grid tool . The other two are more accessible to none blender initiates. One is about making 3D lettering using blender text tool to import inworld. Without much knowledge of blender it is possible to intuitively create lettering text that can be converted in mesh to DAE file and import inworld. The second tutorial in the Mesh import house is  about creating 3D object out of simple pictures using autodesk cloud software freely available for small project. Its amazingly simple to use and the results are awesome. The 123dcatch depot in itself is a source of very interesting mesh constructions for you to explore.  
+
Lately ( 2016-03) I have added a tutorial on how to create mesh using regular picture set. The tutorial provide an example using a del arte mask mesh creation using as few as 9 pictures. The internet line tool to do that will created  stl extension that can easily be converted and repaired using blender. The tutorial and de la arte mask can be found in the import mesh tutorial building in gimisa5 of my little test grid.
 
</blockquote>
 
</blockquote>
 
+
<br>
 
----
 
----
MONEY
+
<p id="MONEY">MONEY 2020-11-17 </p>
 
<blockquote>
 
<blockquote>
 
I dont think this need definition in Real World. But what about Opensim. My idea here is experimentation and play money. A monopoly of opensim sort of to have fun and play with. My idea is to use coins as point to collect statistics from visitor in my experimental grid. The money system and component help achieve that result by providing supporting data on transactions . There is a good article about it here so I dont need to repeat that information  (http://opensimulator.org/wiki/Money). Money not being a core Opensim element its implementation is left to third parties .  The one I use for experimentation is http://www.nsl.tuis.ac.jp/xoops/modules/xpwiki/?OpenSim%2FMoneyServer version 0.8.2.0 . Its a current installment at time of writing this article.  Its not built using  new mono add ins feature (see http://opensimulator.org/wiki/Developing_OpenSim_Addins ) . Nevetherless its download and build was rather straightforward in my case ( linux ubuntu box). I did  follow the read.me instructions provided with the download successfully.  
 
I dont think this need definition in Real World. But what about Opensim. My idea here is experimentation and play money. A monopoly of opensim sort of to have fun and play with. My idea is to use coins as point to collect statistics from visitor in my experimental grid. The money system and component help achieve that result by providing supporting data on transactions . There is a good article about it here so I dont need to repeat that information  (http://opensimulator.org/wiki/Money). Money not being a core Opensim element its implementation is left to third parties .  The one I use for experimentation is http://www.nsl.tuis.ac.jp/xoops/modules/xpwiki/?OpenSim%2FMoneyServer version 0.8.2.0 . Its a current installment at time of writing this article.  Its not built using  new mono add ins feature (see http://opensimulator.org/wiki/Developing_OpenSim_Addins ) . Nevetherless its download and build was rather straightforward in my case ( linux ubuntu box). I did  follow the read.me instructions provided with the download successfully.  
 +
<br> But if you prefer an already compiled version already setup to work with 092. Please download http://profil.gimisa.ca/files/NSL_money.zip
 
<br>
 
<br>
<br>Basically the steps are:
+
<br>Otherwise the steps are:
 
<blockquote>
 
<blockquote>
 
<br>    1)move the file in appropriate folders ( opensim  and opensim/bin )  
 
<br>    1)move the file in appropriate folders ( opensim  and opensim/bin )  
Line 377: Line 408:
 
</blockquote>
 
</blockquote>
  
<br><br> My moneyServer.ini is available in the dome of gimisa5 region should you be interested in that. I did not implement the helper part. I have direct access to database of my server which makes it much simpler to adjust money balance using sql language. So is it to gather statistical information from the database collection.  
+
<br><br> My moneyServer.ini is available in the dome of gimisa5 region should you be interested in that. I did not implement the helper part. (updated) I have no choice but to include a helper in order to give land to someone else. I did not implement the one proposed by NSL. Instead I use the following  instruction  by Fleep to implement  helper.phg  http://opensimulator.org/pipermail/opensim-users/2012-September/010946.html.  For the rest I have direct access to database of my server which makes it much simpler to adjust money balance using sql language. Since it is only to gather statistical information from the database collection I am not too concerned about safety or incorrect transfer.
 
<br><br>The interest for me is that now All of the LSL function related to money become available.  llSetPayPrice,  llGiveMoney, llRequestPermissions. Also as the object buy function and pay function with a set value. All those will trigger the money(key id, integer amount) event that should prove very interesting to explore.
 
<br><br>The interest for me is that now All of the LSL function related to money become available.  llSetPayPrice,  llGiveMoney, llRequestPermissions. Also as the object buy function and pay function with a set value. All those will trigger the money(key id, integer amount) event that should prove very interesting to explore.
 
<br><br>
 
<br><br>
 
I noted in my early experimentation that the money event has a problem. The event cannot handle more then one function. That is ONE line of code. A work around I found is to make the two variable provide by money event ( id and amount) global and to use a timer to operate the supporting functions to be implemented.  
 
I noted in my early experimentation that the money event has a problem. The event cannot handle more then one function. That is ONE line of code. A work around I found is to make the two variable provide by money event ( id and amount) global and to use a timer to operate the supporting functions to be implemented.  
<br><br>More important,  in my case,  I have an experimental grid with only me as resident. So play money is for my HG visitors. I notice on installation that the money system does not work for them since they are grid outsiders. I am great full to developers that provides  the code of their work in open sourcing. With the help of a C# introduction book and a bit of fiddling I was able to modify  the code to make my HG visitors happy. HG visitors rezzing in the grid are granted the initial amount set in moneyServer.ini. They can do then same as grid resident and  make transaction with those coins for the  length of their stay. On a subsequent visit to the grid, they retrieve their previous balance and proceed with play money fun. As usual you can test by making a visit to my test server at 3d.gimisa.ca:9000. All regions have money enable. If server fails to catch your arrival, as it happen at time, please consider changing region. That most of the time solve the issue.   
+
<br><br>More important,  in my case,  I have an experimental grid with only me as resident. So play money is for my HG visitors. New release in progress  for OpenSim-0.9.0Dev had support now for HG visitors.  I am great full to developers that provides  the code of their work in open sourcing. I notice a flaw on the execution when NPC are created AFTER arrival of new visitors in regions . The balance to purchase is report at zero for any transaction of existing visitors. With the help of a C# introduction book and a bit of fiddling I was able to modify  the code to correct that situatiion an make that release functional to me. HG visitors rezzing in the grid are granted the initial amount set in moneyServer.ini. They can do then same as grid resident and  make transaction with those coins for the  length of their stay. On a subsequent visit to the grid, they retrieve their previous balance and proceed with play money fun. As usual you can test by making a visit to my test server at 3d.gimisa.ca:9000. All regions have money enable.  
 +
<br><br>
 +
<blockquote>
 +
Someone ask me what was my sql requests command I was using. So to get transaction with date and visitors this is the one I use:
 +
<br><br>
 +
SELECT sender,objectUUID,objectName,from_unixtime(transactions.time),robustOS.GridUser.UserID
 +
FROM money.transactions,robustOS.GridUser
 +
where robustOS.GridUser.UserID like  CONCAT( money.transactions.sender  ,'%') ;
 +
<br><br>
 +
For per user amount this is the one I am using:
 +
<br><br>
 +
SELECT money.balances.balance
 +
,money.userinfo.avatar,money.userinfo.serverurl
 +
,robustOS.GridUser.UserID
 +
, from_unixtime(robustOS.GridUser.Logout)
 +
from money.balances,money.userinfo,robustOS.GridUser
 +
where money.balances.user = money.userinfo.user
 +
and robustOS.GridUser.UserID like  CONCAT( money.balances.user  ,'%') ;
 +
</blockquote>
 
<br><br>
 
<br><br>
 
</blockquote>
 
</blockquote>
  
 
----
 
----
LANGUAGE
+
<p id="LANGUAGE">LANGUAGE</p>
 
<blockquote>
 
<blockquote>
 
Opensim is an international application. There is grid hosted in many countries. The  viewer supports a number of language that can be set in preference either to be system language or manually entered to fit the user need. This is the same idea as a web browser. For the  web browser the language  information is available to servers so the user experience can be adapted for the visitor language. The same is also possible  to the opensim server / viewer. A script function supports the adaptability of the interaction with the user. The function LlGetAgentLanguage (see http://wiki.secondlife.com/wiki/LlGetAgentLanguage for more detail) is actively supported since 2015 for all grid users.  
 
Opensim is an international application. There is grid hosted in many countries. The  viewer supports a number of language that can be set in preference either to be system language or manually entered to fit the user need. This is the same idea as a web browser. For the  web browser the language  information is available to servers so the user experience can be adapted for the visitor language. The same is also possible  to the opensim server / viewer. A script function supports the adaptability of the interaction with the user. The function LlGetAgentLanguage (see http://wiki.secondlife.com/wiki/LlGetAgentLanguage for more detail) is actively supported since 2015 for all grid users.  
 
<br><br>
 
<br><br>
Unfortunately , this function still does not support the Hypergrid visitors. The function in that case will reply with the default language set by developers ( en-us ) . So I did seek in to try to have a better look at what is going on . A little check in SL shows that this function only works for a request about an avatar that is in the region of the request for language. This would be compatible with  a direct request to the client viewer. I did validate the way the code is made for this function in opensim.  Its design is through call to database. The database information itself is updated when the user logs in. So there is no direct exchange from the function call that the viewer would reply to. The result is fine for local users as the information is refresh in grid database when they log in. But since Hypergrid visitors by definition belongs to an other grid their language information is store in the visitors grid database and not made available to visited function call.  
+
Unfortunately , this function still does not support the Hypergrid visitors. The function in that case will reply with the default language set by developers ( en-us ) . So I did seek in to try to have a better look at what is going on . A little check in SL shows that this function only works for a request about an avatar that is in the region of the request for language. This would be compatible with  a direct request to the client viewer. I did validate the way the code is made for this function in opensim.  Its design is through call to database. The database information itself is updated when the user logs in. So there is no direct exchange from the function call that the viewer would reply to. The result is fine for local users as the information is refresh in grid database when they log in. But since Hypergrid visitors by definition belongs to an other grid their language information is store in the visitors grid database and not made available to visited function call.  
 
<br><br>
 
<br><br>
So I had to jump in an see if a direct communication is feasible between the viewer and server so that the server can request information out of the viewer after connection to the opensim server. See Hacking Opensim bellow.
+
So I had to jump in an see if a direct communication is feasible between the viewer and server so that the server can request information out of the viewer after connection to the opensim server. See Hacking Opensim bellow. The conclusion of this effort is that its not possible to obtain the avatar language information, from its viewer configuration settings, out of the login process.  
 
<br><br>
 
<br><br>
 
</blockquote>
 
</blockquote>
  
 
----
 
----
HACKING OPENSIM
+
<p id="OPENSIM">HACKING OPENSIM</p>
 
<blockquote>
 
<blockquote>
 
I started trying to hack opensim to answer my language question above. I got the source of opensim 0.8.2.0  here  http://dist.opensimulator.org/ .Download the source and run the runprebuild.sh so that the solution file are generated.Then in order to read the source of openism 0.8.2.0 I needed mono-develop in linux or microsoft studio in window. Since I work from Linux , I use the former. MonoDevelop can  open the opensim.sln file and  provides access to the source code and reading of all  the code files. With it I am also able to directly  "build"  and "run"  or "debug" the opensim server solution. I can connect my viewer to it and make test as I like. Adding break point in debug mode and using some other debug technics. I had fun exploring  the server code in action. But trying to make sense of all those files is not obvious to a new comer. There is this web page  provided for developers  http://opensimulator.org/wiki/Codebase_overview that got me going . I also found the  discussion between Diva and cinderblocks in mantis 7157 ( http://opensimulator.org/mantis/view.php?id=7157 ).  
 
I started trying to hack opensim to answer my language question above. I got the source of opensim 0.8.2.0  here  http://dist.opensimulator.org/ .Download the source and run the runprebuild.sh so that the solution file are generated.Then in order to read the source of openism 0.8.2.0 I needed mono-develop in linux or microsoft studio in window. Since I work from Linux , I use the former. MonoDevelop can  open the opensim.sln file and  provides access to the source code and reading of all  the code files. With it I am also able to directly  "build"  and "run"  or "debug" the opensim server solution. I can connect my viewer to it and make test as I like. Adding break point in debug mode and using some other debug technics. I had fun exploring  the server code in action. But trying to make sense of all those files is not obvious to a new comer. There is this web page  provided for developers  http://opensimulator.org/wiki/Codebase_overview that got me going . I also found the  discussion between Diva and cinderblocks in mantis 7157 ( http://opensimulator.org/mantis/view.php?id=7157 ).  
Line 408: Line 457:
 
</blockquote>
 
</blockquote>
 
<br>
 
<br>
The AgentPreferenceModule uses a delegate call on region creation. This is typically an event handling function. Every time a cap is created this delegate event is added with the appropriate variable .scene.EventManager.OnRegisterCaps += delegate(UUID agentID, OpenSim.Framework.Capabilities.Caps  . This call register the capacities for AgentPreferences and UpdateAgentLanguage and provide for support by the viewer. In the  login the viewer replies to that capability with some appropriate response.  But when an avatar teleport to a new region the related capability is announced just the same  as in the login process but NO answer  is received to this announcement from the viewer. I am clueless as to how to induce the viewer to provide the information as I have no idea how this part of the job is done . In order to understand better the viewer to server communication next step is to use the pcampBot supplied with the source code of the opensim. Using an separate instance of monoDevelop I select the pcampBot solution and in the menu I set the option  for the run argument the credentials of your bot avatar as follow after creating that account in local test grid:
+
The AgentPreferenceModule uses a delegate call on region creation. This is typically an event handling function. Every time a cap is created this delegate event is added with the appropriate variable .scene.EventManager.OnRegisterCaps += delegate(UUID agentID, OpenSim.Framework.Capabilities.Caps  . This call register the capacities for AgentPreferences and UpdateAgentLanguage and provide for support by the viewer. In the  login procedure, the viewer replies to that capability with some appropriate response.  But when an avatar teleport to a new region the related capability is announced just the same  as in the login process but NO answer  is received to this announcement from the viewer. I am clueless as to how to induce the viewer to provide the information as I have no idea how this part of the job is done . In order to understand better the viewer to server communication next step is to use the pcampBot supplied with the source code of the opensim. Using a separate instance of monoDevelop I select the pcampBot solution and in the menu for that file  I set the option  to the run and debug that program with the argument required including the credentials of your bot avatar as follow after creating that account in local test grid:
 
<br><blockquote>  
 
<br><blockquote>  
 
firstname Test  -lastname User  -password 12 -l http://127.0.0.1:9000/  -s "home"  -b n -c
 
firstname Test  -lastname User  -password 12 -l http://127.0.0.1:9000/  -s "home"  -b n -c
 
<br></blockquote>
 
<br></blockquote>
But deception running it fails with delegate error in openmetaverse. So the bot is not created. Doing same direcly in terminal did the same error . Downloading 0.8.2.1 and running pcampBot from stable version did same. So no luck there...
+
But deception running it fails with delegate error in openmetaverse. So the bot is not created. Doing same direcly in terminal did the same error . Downloading 0.8.2.1 and running pcampBot from stable version did same. So no luck there ...
 
<br>
 
<br>
 
</blockquote>
 
</blockquote>
 
----
 
----
HACKING VIEWER
+
<p id="VIEWER">HACKING VIEWER</p>
 
<blockquote>
 
<blockquote>
 
Following my language tread my next stop from above is to tackel the viewer communication. I was not successfull in getting a viewer compile. But I found this C# library that contains some basic viewer code . http://lib.openmetaverse.co/wiki/Main_Page  . Following instuction in this page I was successfull in downloading the source code with project file and to build and run it in  debug mode  with monodevelopp on ubuntu 14.04 . There is a nice little application attached to this code call testClient that you can run. In monoDevelop you select that projet folder , and in the pull down menue edit its option to add in the run  argument the credentials of your bot avatar as follow after creating that account in local test grid<br>  
 
Following my language tread my next stop from above is to tackel the viewer communication. I was not successfull in getting a viewer compile. But I found this C# library that contains some basic viewer code . http://lib.openmetaverse.co/wiki/Main_Page  . Following instuction in this page I was successfull in downloading the source code with project file and to build and run it in  debug mode  with monodevelopp on ubuntu 14.04 . There is a nice little application attached to this code call testClient that you can run. In monoDevelop you select that projet folder , and in the pull down menue edit its option to add in the run  argument the credentials of your bot avatar as follow after creating that account in local test grid<br>  
 
<br><blockquote>   
 
<br><blockquote>   
--first Test --last User_0 --pass 12 --loginuri="http://127.0.0.1:9000"
+
--first Test --last User_0 --pass xx --loginuri="http://127.0.0.1:9000"
 
<br></blockquote>  
 
<br></blockquote>  
<br> Also tick the run on external console if you want to be able to provide inputs. <br>     
+
<br> Also tick the run on external console if you want to be able to provide inputs via terminal. <br>     
 
Then simply set as startup project in the pull down menu with that solution selected and proceed with running it in debug mode . <br>
 
Then simply set as startup project in the pull down menu with that solution selected and proceed with running it in debug mode . <br>
 +
Type help in console and look in amazement your bot solution with numerous commands available for testing. Thanks to Hiro for this work .  Its a great upgraded  NPCs ... Naturally it requires an account for each bots. But unfortunately for my language test testBot does not seem to reply to AgentPreferences.
 +
<br>Fortunately and thanks to Latif Khalifa  Radegast in  C#  with source is available here  http://radegast.org/wiki/Radegast .  Its a  minimal viewer text base with only with a bit of graphic interface. Once downloaded and runprebuild is done it can be open with monoDevelop and compile and run in debug mode.  Its a bit more equipped then testBot and to top it, it react to  AgentPreferences with a predefine setting of "en". Testing for my language experimentation reveal that there was no way for a direct request from the opensim server to obtain the language configuration direcly from radegast. At least no way I could find. If someone has suggestion I will be happy to read them .
 +
<br><br>
 
</blockquote>
 
</blockquote>
Type help in console and look in amazement your bot solution with numerous commands available for testing. Thanks to Hiro for this work . Works better then pcampBot and with lot more available function. Use help in console to have the list . Its a great upgraded to NPCs ... Naturally it requires an account for each bots. But unfortunately for my language test testBot does not seem to reply to AgentPreferences caps when it logins Now thanks to L Radegast a C# minimal viewer is available at  http://radegast.org/wiki/Radegast_Download . This one will also work once you downloaded the source and run the runprebuild.sh . Its a bit more equipped then testBot and to top it, it react to  AgentPreferences caps.  
+
----
 +
<p id="LANGUAGE">LANGUAGE SOLUTION</p>
 +
<blockquote>
 +
Well I was out of ideas to solve the language problem, and suddenly I  cross the path of Ernie Serieman. He suggest to use the web kit embedded with the  viewer to obtain the language just the same as  one get the language from  a web  browser . To do that he put up a script that use media on prim. By magic his script show the user language right on the media on prim face. The point was to be  able to use that information in a script same as  llGetLanguage(). With a bit more work we got it to work as plan. Thanks to Ernie for this bright idea and his help with this. This solution has a lot of advantage. It works with HG and local visitors and it does not require database storage. Sole problem it only work with media on prim active . A demo version is available in welcome of my little grid.  
 +
</blockquote>
 +
<br>
 +
----
 +
<p id="ONLINE">ON LINE INDICATION</p>
 +
<blockquote>
 +
Lately ( 0.8.2) I have notice its difficult to create friend link for HG people across grid. Not that the link does not appear and the calling card does not get exchanged between friends. But some friend link seem to be broken for  the online indication  as it fails in its accuracy to indicate proper online status. Note you can still instant message these friend if they are online but the message will not save if they are not on lineOne way to solve the issue is to move to  the grid your friend is. This will show his online status correcly and will allow off line message saving. Some time ago (2012) I had made a phone system base on HTML server capability of opensim to communicate between grids. Communication using these was possible between closed  and open opensim grids as well as SL . That little tool also included a online indicator which is simple enough to work rather well even under 0.8.2. Should you have an interest in that please visit gimisa5 tutorial area for you test copy . 
 +
</blockquote>
 +
----
 +
<p id="EVENT">EVENT</p>
 +
<blockquote>
 +
Event can be gathering like danse or live performance. I like srcipting so here we mean scripting events.  Timer is an event in scripting .  It is trigged at the end of the delay your specify in your script.Its low lag for long delays (minutes) . You have many events that can trigger scripts reaction . Touch (clic object) collision sensor html request are other exemple.  There is an interesting Mantis http://opensimulator.org/mantis/view.php?id=7061  that discuss Timer limit and in general offer guidance for events in opensim .  
 
<br><br>
 
<br><br>
 +
For exemple timers are trottle to a delay not lower then 0.5 second. This makes timer very poor when use as progression clock in non physic movement as the human eye will see anything higher then 0.1sec (10fps and lower).  In this tread it says if you need a faster timer, consider using the not_at_target() event which will fire every frame. Beware that might be a lagging idea.
 +
<br><br>
 +
I think that that mantis tread is offering very good guidance from Melanie and should be consulted for detail. I retake a large part here cause its sound information that should be easy to find for whom ever is interested in scripting his world. See SCRIPT PROBLEM.  above for more detail on the effect of abuse of some of the event available in scripting and how hard it is to find the offending source once release inworld .
 +
<br><br>
 +
Collision is mention as one of the worst  event to handle in term of lag. Collision contrary to touch can happen many times as the object bounce back on it .  That is why a low lag trick is to turn everything not needing contact with  to phantom.  Its interesting that inworld people will avoid going through a wall even if the wall is phantom just because its a wall. Physics step size corresponds to 11fps internally, so the  length  for an object collision to be detected is speed divided by  fps . For exemple a 30ms speed object under 11fps  we will compute about 3m for the size of the object  in direction of contact needed for detection. At walk speed 1ms the same  lenght is compute to  about anything thicker then 0.1m . That is why colision between avatar works well while firearms bullet collision is tricky and use llCastRay .
 +
<br><br>
 +
So Melanie recommands  NO listeners if they can be avoided, ABSOLUTELY NO LISTENERS on channel 0. I will add that Dialogue is more approriate then channel 0  for object commands. In generale osMessageObject is better for object direct communication. But copy of object need to be specifically addressed. And for a reason I ignore object inworld have changed UUID on me so  this solution is not perfect expect a bit of tweeking to gain performance. 
 +
<br>
 +
As she says every script on the receiving side needs to wake up, even if all it does is discard the request with a IF . Stuff that uses chat commands, use specific listeners so the filtering is done by the sim, not the script. So to me in other words use many specific listener instead of many IF .  Also as she says  It's cheaper to wake one script multiple times instead of many scripts one time and that is  true for all event I would say. So one event handler per object is probably desireable.
 +
<br><br>
 +
Same idea linkMessaging is better as more specific than listen . And the better if  specific link is targeted. 
 +
<br>
 +
Finaly she point to avoiding  physics like the plague. llKeyFrame is your friend for non physic movement. Also  Repeat raycast or sensor is laggy too. Use a packed message protocol, messages have overhead so of you can pack more than one message to one object do it .
 +
<br><br>
 +
Thanks to Melanie to have provided insigth into better scripting form the developper standpoint.
 
</blockquote>
 
</blockquote>
 +
----
 +
<p id="MEMORY">MEMORY</p>
 +
<blockquote>
 +
gimisOS is running on two machines. And as I am building and pilling script  I get more and more slugish response. So I was wondering if my work load is properly spread. One of the thing that makes a respond sluggish on a server is if you dont have enough ram for the task . System is using swap to swing pieces of data or code not use for a while in exchange for free space to take in new stuff.That mean that if all your simulator data is not in memory the swap is call for in the rescue and cpu has to work to get that data back in memory and sent it to your user. So here is a take of my memory usage and simulator division. :
 +
<br>
 +
<br>
 +
{|
 +
! style="text-align:right;"|Server
 +
!regions
 +
! Mem size(Mb)
 +
!Swap(Mb)
 +
!Threads !
 +
!Scripts 
 +
!Prims   
 +
!OAR(Mb)
 +
|-
 +
|g5  
 +
|5   
 +
|3,758      
 +
|33     
 +
|94     
 +
|1,593
 +
|13,314  
 +
|153
 +
|-
 +
|g4
 +
|4,6
 +
|2,025
 +
|396
 +
|82
 +
|1,491
 +
|17,100  
 +
|107
 +
|-
 +
|g3
 +
|3,rose
 +
|1,856        
 +
|0
 +
|95
 +
|1,008
 +
|7,085  
 +
|37
 +
|-
 +
|gi
 +
|1,7,8,9 
 +
|1,935      
 +
|374     
 +
|113  
 +
|618
 +
|8,859  
 +
|35
 +
|-
 +
|go
 +
|2   to the other by 256m or more of  empty space
 +
|460        
 +
|2 to the other by 256m or more of  empty space
 +
|54  
 +
|13    
 +
|53
 +
|-
 +
|ro
 +
| -  
 +
|164        
 +
|4
 +
|23
 +
|-
 +
|my
 +
|  -    
 +
|40      
 +
|17
 +
|37    
 +
|-
 +
|total 
 +
|10 
 +
|10,238      
 +
|826
 +
|        
 +
|4,723
 +
|46,411
 +
|-
 +
|
 +
|
 +
|11,064
 +
|(mem + swap)
 +
|}
 +
<br>
 +
You might notice that a bare bone simulator pick up about half a gig for running with only one region. You might also notice that the quantity of prim is not an indicator of memory load so is script number . Something more indicative is the size of the corresponding OAR . So my two machine should have 6 Gb of ram to face the load and a good spread would be g5,g3 and the remaining on the other one .
 +
</blockquote>
 +
----
 +
<p id="RELIABILITY">RELIABILITY</p>
 +
<blockquote>
 +
Is an important element of any server. Adding features is nice but if these features are not reliable to perform each time consistently its a problem. And if after a while the system crashes because of accumulation of micro failure its even worst. Unfortunately because of the nature of open source opensim and the creation content done unequally by users ( like me!! ) Opensim is prone to instability that lead to crashes. In average one or two crash a week is happening on my region even on weekly restarting of the simulator. Its hard to pin what exactly lead to that crash specially with the message provided in log for linux system where open file is not identified. And even if it was that message is more meaningful to developers then to casual operator like me. So for all those good or not so good reason I have added a routine in my cron job to validate if the simulator is running.
 +
<br>
 +
Running on linux I edit my cron tab to add that checking routine every so often ( 4 hours ) with the name of the screen session like:
 +
<br>    sh checkRunning.sh g1 g5 with my opensim starting bash being g1.sh and g5.sh and my screens names being g1 and g5 .
 +
<pre>
 +
The Code is :
 +
    #!/bin/bash
 +
    for var in "$@"
 +
    do
 +
      if ! screen -S $var  -X select . ; then
 +
          sh ~/$var.sh
 +
          echo 'restart' $var  $(date ) >> ~/log/$var.log
 +
      fi
 +
    done
 +
</pre>
 +
</blockquote>
 +
----
 +
<p id="CONSOLE">CONSOLE COMMANDS</p>
 +
<blockquote>
 +
Those are the commmand you can use to control and get information from you running simulator or grid server. The list and detail can be found on this web site here [http://opensimulator.org/wiki/Server_Commands opensim console command list ]. Help can be obtain on those command by typing help direcly in console.  You will then get a lit of commandes available at the console your working in . The reference page is not updated as it seem some command name have changed ( version 0.8.2.1) . ( server or simulator ) For example
 +
<pre>
 +
    delete object uuid <UUID> should be ''delete object id <UUID>''
 +
    show  object uuid <UUID> should be  ''show object id <UUID''
 +
</pre>
 +
</blockquote>
 +
----
 +
<p id="CHILD AVATAR"><span id="GRID"><span id="REGION"><span id="VARREGION"><span id="VIEWER REACH">GRID LAYOUT</span></span></span></span></p>
 +
<blockquote>
 +
<br><br>      What is the impact of grid layout and what about varregion and regular region effects. Let start with viewer reach. The reach maximum value is 1024m . That set distance act like a fog that limit the perception of object. Note that for people with low graphic card reducing that value help performance by reducing the number of object the card has to handle .
 +
<br><br>      That is an avatar will perceive an object and apply level of details to it from that set value down.  Like in real life you perceive object detail as you move closer to them .  In openism / second life  the switch distances for an object are proportional to the object "radius", which is the half-diagonal of the bounding box. It can be calculate as r = sqrt(x*x + y*y + z*z)/2, where x, y and z are the dimensions of the object in meters. The first switch, high to medium LOD, is at: rvlf * r/0.24; the next at 4 times that distance, and the last at 8 times. For a 1m  cube,that is  3.3, 13 and 27.
 +
<br><br>      Sound complex , let try to shed a bit of light on this idea. A good representation of the level of detail of an object is its triangle count. A standard prim cube of 1m x 1m use  (6 x 9 x 2)  108 triangles in all its faces as seen from a 3.3m location. At a 13 m the viewer will present only ( 6 x 4 x 2) 48 triangles and finally at 27m the viewer will present ( 6 x 1 x 2) 12 triangles.
 +
<br><br>      So what does that have to do with grid layout. I might need to be corrected here but every time you log in a region you get sent all the object texture and shapes detail to your reach distance. If the scene is static and you dont move that is all you need for rendering. The proof of that is when the region lag a lot, rotating on yourself is always performed and rendered properly. 
 +
<br><br>      A static scene like a picture is limited in interest . Moving is what give life to virtual. Moving in the scene can be rendered by simple recalculation done at the graphic card . But  moving updated information is required to present object that were previously out of your reach distance and to correct  object/avatar that themselves are moving. in the scene.
 +
<br><br>      Grid layout yes, we are getting there. When an avatar log in a region it creates child avatars. There is a maximum of 8 child avatar created in  each of the region adjacent to the landed region. This allow the other region information to be communicated to the viewer. This is the mechanism providing perception of  object at the reach distance across the region boarder. More importantly these are the ONLY region the avatar can perceive cross boarder. That is even if the reach distance is 1024m and the avatar is standing on the middle region of huge grid , he will only perceive object in the region that have created child avatar for him .
 +
<br><br>      Is this fact important for Grid layout. You bet. Say I want to create a huge city . With opensim 0.9 its possible to stack varregion side by side and say make a  12,288m x 12,288m plot. We cant go with varregion size higher then 8,192 so you would be a bit short with only one varregion. You could divide it say in 3 x 3 of 4096 x 4096 varregion.. But if I am correct , in any of those case your avatar standing on the city center would have child avatar in a surface representing a huge area compare to the  reach distance of the viewer. Anyhow the viewer will not handle more then the reach distance . Nor will it reach further then the neighbourhood where child avatar are created. This is important performance consideration cause on regular region of 256 x 256m viewer reach distance of 1024 is not accommodated in practice since standing on the middle of a region the avatar can only see 128+256 = 384m in any plane except height. 
 +
<br><br> So if your selection is to accomodate 1024, with at minimum continous reach, you would contemplate varragion of 2048x2048 to fit that reach distance to the closes possible. In this case 6 x 6  of 2048 x 2048  varregion would be feasible. What if size is bigger. This is similar to having a reach of 64m in regular region, the cost is minimally to create the 8 child avatar. In any case the visitor will not see more then his reach capabilty.
 +
<br><br>      But if you needs is not as large and performance is your concern, then you prefer people NOT to perceive scene object from you neighbors .So the trick in that way of thinking is opposite and you want to have an empty region ( no region at all ) in all direction centered on your scenery. So that NO child avatar are created around you region that will drain down uneceesary overhead and viewer bandwith when reaching boarders with stuff from you neightbourgh.  Once you have establish a no man land zone around your area, selecting varregion size is up to how much of you scenery should be perceived in one glow.  So one region of 8132 square would be your maximum in this respect.  While standard region size of 256x256, with teleporter sending people in layer of  1024m in height is still a valid sizing to consider particularly for smaller areas in my opinion. By the way should you not know opensim supports construction over the 4096 limit. I have seen scene made at 8000m on top of a regular 256x256 regular area.  So varregion already exists for a long time heightwise!!.
 +
</blockquote>
 +
----
 +
<p id="ROBUST">ROBUST (update 2020-12-13</p>
 +
<blockquote>
 +
When executing the simulator as a standalone either hypergrid access or not  you get two part. The grid service like login and assets and the simulator services like physic and avatar rendering functions. The simulator  is using mutlitread in scripting and avatar rendering. Multi tread is the ability to execute multiple processes concurrently. The grid part is on the other hand single treaded meaning that it executes one service after next. In stand alone mode thow its normaly not intended to have multiple opensim instance running and connecting to each other. The way to run multiple region is done one one opensim instance by define as many region as one want in region directory and have only ONE opensim instance running. This is the way diva distro is proposing. Simple and efficient if your needs are limited to a few regions as the rule of thumb is one region per cpu plus one for the opensimulator process. In this way when performance degrade one have to think in speading the load differently. The way proposed by opensimulator is the robust server to split the grid services ( logging , asset ... ) from the simulator itself.
 
<br><br>
 
<br><br>
 +
The idea of Robust is the service server of a grid. Robust is dicussed here http://opensimulator.org/wiki/ROBUST .Its  possible to connect many simulator run on different computer to the robust instance run on an other machine. This is the way use by large grid like osgrid.  The configuration of running instance of osgrid can be found here  https://www.osgrid.org/donation_usage.php . Not all service can be run separately so osgrid is a good exemple of feasible splits.  Without going to deep one can see that osgrid uses multiple robust instance and multiple opensim instance on different computers . Its configuration is through robust.ini or as explain through a file effectively named in the startup arguments.
 +
<br><br>
 +
I dont have a large grid but I use multiple computers so running robust is the way for me for a while now . But my asset is growing since 2010 as opensim assets handling is never to delete any. So each time you create or change a notecard ,  texture you upload even duplicate , end up cowling in the asset server ( more about FSasset in next article ) . So I though to try running multiple instance of robust too and separate assets service on an other computer. So my idea is to have appropriate robust.asset.ini for robust instance serving assets and the remaining service in robust.noasset.ini for the other  robust.ini  I found this page very usefull in helping me address this split appropriatly http://opensimulator.org/wiki/Shared_Services_Configuration .
 +
<br><br>Following Diva Cantro presentation about splitting robust services server between LOCAL and REMOTE ref: https://www.youtube.com/watch?v=waxDKGmYWFw I am trying same per her presentation in addition to the asset service split already reported above. The resulting split between the three robust instence is presented in ref: http://3d.gimisa.ca:9090/static/config.html or by visiting my grid hypergrid dome in gimisa5.
 +
<br><br>Doing so I notice that Diva does use direct request to database instead of using  connectors for service from outside of the firewall. She explain in the presentation with help of her hand diagram that its possible to have RobustOUT connect to RobustIN then to database per reference http://opensimulator.org/wiki/ROBUST .  I have applied connector that idea for asset split as describe previously in this article.
 +
</blockquote>
 +
----
 +
<p id="FSASSET">FSAsset (Added note 200320)</p>
 +
<blockquote>
 +
In 2015 Osgrid had a major asset crash. This was an experience for all grid owner as to what can happen if database corruption or hardware failure treat you grid installation. OSgrid like any good service providers had implemented ways to overcome both these disruption by using raid mirroring as related in following article http://www.hypergridbusiness.com/2015/03/avination-helps-save-osgrid-donates-cluster-storage-solution/ .
 +
<br>I am not acquitted any closely with OSgrid operation more then a user is.  I have no clue of the nature of the failure but the article is point to the use of FSAsset as an alternative to whatever OSgrid was doing. I am using MariaDB in for my database which is a fork of MySQL. But the problem remain that large database file size are created when using standard way of storing the asset in the database itself.
 +
<br><br>There is no magic in storing information and the compress asset data has to reside somewhere. Melanie solution is to have it stored in the file system itself instead of the database and use the database as pointers ONLY to the proper asset on disk . This makes the database itself much less subject to corruption and reduced its size to be easily dump for backups remotely.
 +
<br><br>There is more detail about FSAsset setup in http://opensimulator.org/wiki/FSAssets_Service . The article is suggesting to use FSAsset for 50G database size. I decided to go forward even if mine is a mere 15G. My problem is backup of this HUGE database . A backup system can be full backup like raid images , now a day with low pricing for storage space this is the preferred choice. Because of limited resources I am still using incremental backup or what is call snapshots of the drive with the help of DIRVISH a linux backup program. This method takes up much less space due to the incremental nature of the storage. But you can imagine that using this method with database file size of 15G is somehow defeating the purpose. Having smaller database file size and using files system for storage offer the elegant alternative of using system tools and standard backups solutions.
 +
<br><br>One more interest raise by Melanie FSAsset storage is the possibility of database reconstruction using the files already stored in the asset directory. Though I could not find any documents that would support that ,  I am incline to believe that even with destruction of asset database and corruption of part of the asset directory it would be possible to reconstruction the database pointers from the good element of the asset directory structure.
 +
<br><br>Database and large file are MySQL engineered way to speed for large database installation with many users and demanding services. Getting out of that framework has detrimental effect on speed. In normal asset upload I saw no noticeable delays. But I found that speed is the cost when loading large oars of fresh new asset. FSAsset first checks the database to see if there is a pointer to the UUID of an existing  asset when loading oar to avoid loading duplicates and destroy existing assets. So as asset base increase to more then 50G ( the recommended size to use FSAssets) this should trend in reducing the asset handling time  and damper the delay witnessed in freshly loading grid like I did.
 +
<br><br>
 +
About a month after writing this paragraph I have a hard drive crash. It was time to face the music and see if restoring the mysql database and FSasset folder would do the magic. I am happy to report it did....
 +
<br><br>
 +
Note to 0821 grid users. There is an issue with FSAsset database handling on that version. Reference to that mantis is http://opensimulator.org/mantis/view.php?id=7794 . The patch included in that link need to be applied to release version 0821 to correct the problem. If you need a tested compiled version of that correction don’t hesitate to contact me.
 +
</i>
 +
<br><br><i>
 +
undocumented FSasset robust commands:
 +
<br>
 +
show asset stats : provides asset counts
 +
show digest <ID> : provide detail of assetID, storage location and type.
 +
delete asset <ID> :Allow deleting an asset by assetID from asset table.
 +
 +
</i>
 +
</blockquote>
 +
----
 +
<p id="DATA:URL">DATA:URL</p>
 +
<blockquote>
 +
Data:URL replaces a tag reference with direct encoding either of image text or html. They are an interesting tool in web page design to lower the overhead of getting the page to user by embeding the data direcly in the page content instead of by reference.  By doing only one call to server this provide for a more  efficient page loading.
 +
<br>
 +
This way is available to media on prim or to html server via scripting in opensim / SL . The documentation provided by second life can be found here http://wiki.secondlife.com/wiki/LlSetPrimMediaParams/Tricks . Any prim can be use to the limit of 1024 characters as web server or to present content as a web browser where that content is included in a data:URL string.  I have also tested that javascript is available as well as html style formatting. You can find two example of use of data:url in gimisa5 store of my little grid. one as a sound media testing tool i did to validate different codecs and the other one present a picture and text from notecard containing html. You can also find work done by Edison.Rex @hg.zetaworlds.com where data:url is use in Multifunction Nautical Navigation Panel to dynamically present speed and navigation data.
 +
<br>
 +
One very important advantage of DATA:URL use in MOP is full control of dynamic presentation.  While it represent very little load on the server compare to the use of a animate or dynamic texture . One draw back is that viewer are configured by default for MOP on request only which is leaving the content designer to request change to the user setting in order for the presentation to be visible.
 +
</blockquote>
 +
----
 +
<p id="IRC">IRC</p>
 +
<blockquote>
 +
Internet relay chat servers can be use to provide script communication between objects in different region. Something not so easily done with html internal servers.  Reference is provided by both http://opensimulator.org/wiki/IRCBridgeModule#Object_chat_relay_mode and http://allenkerensky.com/ircbridgemodule .
 +
<br>I am using  ngircd as IRC server ref: https://ngircd.barton.de/ . Accepted default except server name and welcome sentence. You can test your server by connecting to it with  any IRC client with the address of your server. That server port 6667 (default)  should NOT be accessible from the net if you want to keep things under control.
 +
<br>You need to copy paste the [IRC] part in your opensim.ini (simulator)  from the link above. This is what mine look like :
 +
<pre>
 +
[IRC]
 +
enabled = true ; you need to set this otherwise it won't connect
 +
server  = 192.168.2.xxx ; change to suite your could be 127.0.0.1
 +
;password = your access to server password if needed"
 +
nick    = gimTest ; any name will do Allen suggest region name
 +
user    = "USER gimGrid 3d.gimisa.ca:9000  * :gridwide bot" ;did not see where this is use
 +
randomize_nick = false ; as suggested by Allen prevent extention to nick
 +
channel = #opensim ; channel you want for your application
 +
port = 6667  ; standard port
 +
relay_chat = false ; if you leave this true it will listen to channel 0 (open chat)
 +
report_clients = true ; it reports when someone log  ( see note * )
 +
 +
commands_enabled = false ; I am not using the command feature
 +
command_channel = 4711  ; command script channel
 +
access_password = "xxx"  ; password
 +
 +
relay_private_channels = true  ; this is where we have object communication
 +
relay_private_channel_out = 4712 ; any script channel you want to llSay to IRC server
 +
relay_private_channel_in =  4713  ; any script channel you want to Listen to IRC server
 +
msgformat = "PRIVMSG {0} : {3} :{1}" ; format of what Listen function receive , {0} is nick of sender, {3} is message , {1} is sender
 +
</pre>
 +
<br>The following is a test script that show how this come about inworld:
 +
<pre>
 +
//gimisa@yahoo.fr
 +
//to use this script avatar type a message inworld on channel 33 . example : /33 Hello World!!
 +
//as seen from script:
 +
integer relay_private_channel_out = 4712;
 +
integer relay_private_channel_in = 4713;
 +
string password="xxx";
 +
string from="TESTER";
 +
default
 +
{
 +
   
 +
    state_entry()
 +
    {
 +
        llListen(33, "",NULL_KEY , "");//to capture the avatar message to send
 +
        llListen(relay_private_channel_in, "",NULL_KEY , "");//to capture message from other object.
 +
       
 +
    }
 +
 +
    listen(integer channel, string name, key id, string mss)
 +
    {
 +
        if( channel==33){
 +
           
 +
            llSay(relay_private_channel_out,llList2CSV([password,from,mss] );//sending message to IRC server
 +
            return;
 +
            }
 +
        llInstantMessage(llGetOwner(),llList2CSV([channel,name,mss]));// receiving message from IRC server and relay back to owner
 +
    }
 +
}
 +
</pre>
 +
<br>
 +
The /33 Hello World!! show up on IRC server as  <gimTest>  Hello World!! :TESTER  and in world as in all other listening regions 4713, gimTest@IRC,  Hello World!! :TESTER . Note that you can set the from to any string you want which is neat to qualify the message further for scripting purposes .
 +
As an additional application note it seem as far as I could test that  you cant use USER chat command like /PRIVMSG in your message to IRC server because the IRC module add a space in front of the message. 
 +
<br>
 +
* Note: that IRC report_clients = true;  cannot be use to report arrival of client in the region the IRC script is running . It reports to all others region you have IRC implemented but not the one seeing client arrival.
 +
</blockquote>
 +
----
 +
<p id="EMAIL">EMAIL  180828</p>
 +
<blockquote>
 +
EMAIL is an other module  of interest at least to me in opensim .  Both EMAIL and IRC are  complementary communicating with  avatar,or  between  avatar and  object . For exemple , a friend pointed at me laterly that my IMs dont get saved. That is IMs made by other in gimisaOS grid show a message saying that it not saved due to message limit.  I dont send my IMs to email cause that option is not available to me in singularity . No idea why, is it a bug ??.
 +
<br><br>
 +
Anyhow, the problem is I use a lot of instant message from object in my scripts to get running status and so on. I have DIVA offline V2 configured in 090 . I have validate that 25 instant messages from all sources is all that get save in database for delivery when you back on line. I do receive the one that appear in database but the other that are cap off and  never stored  are simply drop. No warning in scripts, but  warning is effectively provided in IMs status message to attentive  emailing avatars.
 +
<br><br>
 +
I could send my instant message to IRC instead of IMs to me to save on the limit and keep the 25 storage capability for avatar to avatar messages only. But this is only partial solution. Obvious solution is EMAIL. It would be nice to find why my singularity will not accept sending offline IMs to my configured email is one thing . And  using the scripting function already available to object IMS to  emails is an other. I will not repeat here the very good tutorial made  http://liftedpixel.net/blog/posts/getting-llemail-to-work-in-opensim. Even if done for diva distro this tutorial is accurate and  is getting you almost there.
 +
<br><br>
 +
Ya almost. The module ini [SMTP] portion that you will find in opensim.ini need address of you prefered SMTP server with credential to access it . Configuring this data is not different then configuring you account in outlook or any email client you use. You need the same information , so look into you email account info and complete the ini data as required is all it takes.
 +
<br><br>
 +
Well almost, if your account is  like mine, you hit a soft spot with the encoding requirement. Most of smtp these days use some kind of encoding for credential information ( passwords ) . And the opensim  EMAIL module does not have encoding information integrated in configuration ini file. (something that certainly could be corrected if of interest to developpers ).  So to connect to external smtp server that need encoding you off luck unless as suggested you find one that dont use encoding.
 +
<br><br>
 +
And on a linux machine .. yes ubuntu again . You can install a number of smtp servers. But having you own email server come with all kind of issue and troubles that you would certain be happy to avoid when considering that all you need is offline IMs capabilities via email. Nevertheless its possible to install postfix a mail server for local email only . Refer to WIFI email further down this page if this solution is of interest to you.
 +
<br><br> To the rescue linux offers a very tiny SMTP mailer call nullMailer. Its a snap to install and configure to DIRECT your emails to a email server of your choice ... including encoding !! This is not a tuto to install it but if you need help come my way , it will be a pleasure.
 +
<br><br>
 +
So arm with nullMailer what you do .. Ya one more step , cause nullMailer is only SENDING email you need something that will receive the one on the module side of opensim and relay it to nullMailer. What I use is the piece of code here running on python.
 +
<br>
 +
<pre>
 +
import smtpd
 +
import asyncore
 +
import subprocess
 +
 +
class CustomSMTPServer(smtpd.SMTPServer):
 +
   
 +
    def process_message(self, peer, mailfrom, rcpttos, data):
 +
        print 'Receiving message from:', peer
 +
        print 'Message addressed from:', mailfrom
 +
        print 'Message addressed to  :', rcpttos
 +
        print 'Message length        :', len(data)
 +
print 'Message              :', data
 +
cline = 'echo "'+data+'" |  mail -s "'+mailfrom+'" rcpttos'
 +
return subprocess.check_output(cline,shell=True)
 +
 +
 +
server = CustomSMTPServer(('0.0.0.0', 1025), None)
 +
 +
asyncore.loop()
 +
</pre>
 +
<br>
 +
These few lines above from  python2.7  will do the magic. So that you can input in your ini file the following very simple credentials , where this python file and opensim operate on same machine. 
 +
<pre>
 +
    ;# {SMTP_SERVER_HOSTNAME} {[Startup]emailmodule:DefaultEmailModule enabled:true} {SMTP server name?} {} 127.0.0.1
 +
    SMTP_SERVER_HOSTNAME = "127.0.0.1"
 +
 +
    ;# {SMTP_SERVER_PORT} {[Startup]emailmodule:DefaultEmailModule enabled:true} {SMTP server name?} {SMTP server port?} {} 25
 +
    SMTP_SERVER_PORT = 1025
 +
 +
    ;# {SMTP_SERVER_LOGIN} {[Startup]emailmodule:DefaultEmailModule enabled:true} {SMTP server user name?} {}
 +
    SMTP_SERVER_LOGIN = ""
 +
 +
    ;# {SMTP_SERVER_PASSWORD} {[Startup]emailmodule:DefaultEmailModule enabled:true} {SMTP server password} {}
 +
    SMTP_SERVER_PASSWORD = ""
 +
</pre>
 +
<br><br>
 +
Please note that this crude SMTP server is not available from outside grid on port 1025 so it cannot receive external mail .Can this be abuse ... Oh yes like anything, but its functionnal minimum and yours to have fun only !! In your script inworld now you can now use something in line with the following and send the information via email instead of crowding your instant messages.
 +
<br>
 +
<pre>
 +
string emailAddress = "gimisa@yahoo.fr";
 +
string emailHeader = "Someone touched me!";
 +
 +
default
 +
{
 +
    touch_start(integer num_detected)
 +
    {
 +
 +
        key id = llDetectedKey(0);
 +
        string name = llDetectedName(0);
 +
 +
        llEmail(emailAddress, emailHeader,
 +
            "I was touched by: '" + name + "' (" + (string)id + ").");
 +
 +
        llSay(PUBLIC_CHANNEL, "Email has been sent.");
 +
    }
 +
}
 +
</pre>
 +
<br>
 +
</blockquote>
 +
----
 +
<p id="FITTED">FITTED vs BENTO</p><span id="BENTO"></span><span id="BODY"></span>
 +
<blockquote>
 +
I salut Gaia work in doing avastar and support. For the sake of making this  discussion lets call FITTED the adjustable mesh body and lets call RIGGED the rigid original skeleton ( rigid for  Breast and Butt ) . He has provided his bento rig in https://blog.machinimatrix.org/avatar-workbench/ that has all the deformation bone required for fitted mesh body using standard sliders.
 +
 +
Now come bento . The bento skeleton present officialy by SL for blender  ( http://wiki.secondlife.com/wiki/Project_Bento_Testing)  is RIGGED ( rigid ). Iit cannot be adjusted as a fitted skeleton can.  ( rigid for  Breast and Butt ) . It is missing the deformation bones required for fitting behavior to apply. It had probably been corrected in later releases as maya object but no other release were done in DAE format.
 +
<br>
 +
Anyhow that trigger to probe the behaviour difference between RIGGED body and FITTED clothing.  Having a rigid body allow adjusting the FITTED mesh clothing to the rigid avatar by way of adjusting the cloth  breast and butt while the rigid avatar will stay as is.
 +
<br>
 +
In addition the SL BENTO mesh body can be textured using  skin and clothing texture since it has same UVMAP as system avatar.
 +
<br>
 +
The problem of shape vs clothing adjustment  was formally solved in system avatar by adjusting the cloth attachment  to fit the avatar .  The introduction of fitted mesh avatar which is only a layer on top of the system avatar uses the  sliders to modify the skeleton  which prevent adjusting fitted  body and fitted cloth separately.
 +
<br>
 +
There is many clothing shapes floating around from the former rigid design to the later fitted one. They fit system rest shape with more or less success and at a leaser degree any other shape twist.  Fortunately Gaia has made a nice effort to insure that the work done with their blender plug in  fits the system shape as best as possible given the proper mesh  model shape sizing versus the inworld slider position. So that what you see in blender is what you get in virtual worlds if the two model are adjusted appropriately.
 +
<br>
 +
You can scale a mesh cloth inworld as you want. The armature bone will scale with it so that the weight relation of the bone to the mesh remain the same. There is no way to modify a mesh clothing inworld except with body sizing sliders.
 +
<br>
 +
In my experience with rigged body and fitted mesh clothing where cloth breast and butt can be adjusted separately from the rigid body I saw that it was possible to optimize the fittings of clothing for those parts of the body. The result is very partial since it involves only two adjustment over the total available for the shape. It simply demonstrate the concept that adjustment of the cloth need to be done on its own from the body shape.
 +
<br>
 +
It seem what is needed to get back the freedom of choice once possible with system body and clothing  is to mimic the former behaviour inworld and allow adjustment of the different cloth separately from the shape of the body. This could be done by way of SELECTING the part that the body adjustment slider influence. Future will tell...
 +
<br>
 +
</blockquote>
 +
<br>
 +
----
 +
<p id="RLV">RLV</p>
 +
<blockquote>
 +
<br>
 +
Replacing NPC in area where NPC functions are not active for the user was the idea behind exploring RLV. RLV is the acronym for restrain love. This is a  feature available in certain viewer that with client consent  allow certain script controls. The full spec of this feature can be found at http://wiki.secondlife.com/wiki/LSL_Protocol/RestrainedLoveAPI and an example of the script control that can apply is provided with http://wiki.secondlife.com/wiki/Quick_Collar .
 +
<br> 
 +
The idea is to create an alternate avatar that can obey script function . One famous such bot is Corrade http://grimore.org/secondlife/scripted_agents/corrade . Corrade give scripting access to all function a viewer have. NPC are more limited in the command available and RLV is easier to implement to match  same feature as NPC. Naturaly the cost is a full f ledge agent load on the server compare to lesser load a NPC presents.
 +
<br> RLV can be use with script control to attach/detach an item from inventory. The attachment script can then animate and  move the BOT. In addition its possible to use a script to teleport a BOT from one area to an other something NPC cannot do. The RLV functionnalities become necessary as a work around in version 090 as its not possible to use the regular lsl script function  llTeleportAgent or llTeleportAgentGlobalCoords to teleport an agent using an attachment  in opensim.  With RLV the function lOwnerSay( "@tpto:<X>/<Y>/<Z>=force" where X Y Z are global coordinates which make this function equivalent to llTeleportAgentGlobalCoords. RLV provides also a way to rotate a BOT which is hard to do with an attachment. By using  llOwnerSay( "@setrot:<angle_in_radians>=force" ) its possible to do that.It is interesting to notice that the 0 rotation in opensim is with avatar facing east.
 +
<br>Therefor that RLV function need description correction as follows:
 +
<pre>Forces the avatar to rotate towards a direction set by an angle in radians from the north is wrong and its direction to the EAST.</pre>
 +
<br>I have done such a bot for a pet DOG that will follow you in any region that allow scripts. A demo is available in gimisa5 region of my little grid.
 +
<br>
 +
</blockquote>
 +
----
 +
OPENSIM version 090 llMove2Target, llListFindList
 +
<blockquote>
 +
<br>
 +
Two very usefull function if you do scripting. llMove2Target will allow your avatar or physic object  to be moved around with script . The second one I use a lot to do  indirect reference. 
 +
<br>
 +
Problem with move to  target of version 090 is that it get your avatar in fly mode / landing transition when your avatar is moved to something else then flat land . I did a hand to hand movement using this function where two avatars hold hands and this cause erratic behavior that break the synchronization between the two actors. The work around I found for now. Is to set the target z value to 0.5 . The draw back of this work around is that it allow avatar to walk on terrain only .
 +
<br>
 +
The problem with list find list is a bit tricky . If you store a string variable in list you can easly convert it to an integer by extracting the value to with llList2Inter function . But contrary to 0821 if you try to find a string like 123 with a search on an integer like [123] it will fail. So there is now differentiation in the search between both types . Using ["123"] in the search will be successful. That brakes a few function I have including the object sorter I did to help make sense of large inventory .
 +
<br>
 +
See example of work around for those function in gimisa5 store.
 +
<br>
 +
<br>
 +
</blockquote>
 +
<br><br>
 +
----
 +
<p id="BACKUPS">BACKUPS</p>
 +
<blockquote>
 +
<br>
 +
Backups is the most important strategy for system reliability. There is many method and software to help you in that task.  I present my receipt using linux server system  yours to adapt. There is three type of backup. Full backups , incremental backups and a variance of it call snapshots. I use G4l to fully backup the disk drive every 6 months. https://sourceforge.net/projects/g4l/ . And I use  dirvish as a  snapshot utility that provide me with the flexibility of incremental daily backup with the convenience of a snapshot where you select the date and the content  to restore. The detail of my setup can be found in http://3d.gimisa.ca:9090/static/backup.html . 
 +
<br>
 +
</blockquote>
 +
----
 +
<p id="CACHE">CACHE</p>
 +
<blockquote>
 +
<br>
 +
In opensim there is server cache and viewer cache. Clearing cache in viewer is often done to correct corruption or to simply clean it of unnecessary cumulative stuff. Server side is use by the simulator to allow faster transmission of asset without having to go back to asset server. See http://opensimulator.org/wiki/AssetCache for a presentation of the server side cache.  Lately Alexandra RunningBear from osgrid ask me if I was using server side cache to help for lag. My answer was that I have created FlotsamCache.ini from
 +
FlotsamCache.ini.example  with the defaults included  it the file.<br>
 +
        ; Set to false for no file cache<br>
 +
        FileCacheEnabled = true<br>
 +
<br>
 +
Alexandra kindly pointed out that since I have more then one simulator running; each one of them is running his own cache in location specified. Which is by default:<br>
 +
<br>        ; cache directory can be shared by multiple instances
 +
<br>        CacheDirectory = ./assetcache<br>
 +
<br>
 +
But since in my case I am using the SAME instance to run different simulator (see my configuration for detail) . ALL simulators use the same cache location. The default file cache timeout is set to 48 hours. So each simulator check to see if the asset in the cache was not access within 48 hours and delete it from cache. This is much less then optimum as every one of the simulator is trying to control the cache for its own assets. So she suggest using disabling time out and use  a manual approach to cache control. In order to do that the configuration need to be changed for:<pre>
 +
        ; How long {in hours} to keep assets cached on disk, .5 == 30 minutes
 +
        ; Specify 0 if you do not want your disk cache to expire
 +
        FileCacheTimeout =0 ;was 48 default
 +
 +
        ; How often {in hours} should the disk be checked for expired files
 +
        ; Specify 0 to disable expiration checking
 +
        FileCleanupTimer = 0 ;was  168.0  ; ( 7 days )
 +
</pre>
 +
So now that the cache is manualy controled how do I do that ??? In linux that mean a cron job and in window a scheduled task. My system being linux the following address the cron job. The job itself is rather simple  as follow:
 +
<pre>
 +
file name cache.sh:
 +
#!/bin/bash
 +
dat=$(date --date="-30 days" +%y/%m/%d)
 +
dat="fcache expire $dat"
 +
 +
echo $dat
 +
 +
screen -xS screenNAME -X stuff "$(echo $dat)
 +
fcache status
 +
"
 +
echo done
 +
the crontab command in this case is :
 +
5 1 * * 0 sh cache.sh
 +
</pre>
 +
The crontab run cache.sh every Sundays at 1:05 . The job execute a console command in the simulator running under screenNAME and clean cache for 30 days old assets. Also it requires a status of the cache so you can tweak the setting to optimum  value for your case.
 +
<br>
 +
</blockquote>
 +
----
 +
<p id="VIRTUALBOX">VIRTUAL MACHINE</p>
 +
<blockquote>
 +
Combining Opensim a virtual world with a Virtual Machines is an interesting idea. VirtualBox is a software to run a machine inside a real machine and opensim is a virtual life  you real life can enjoy. To have your own world , you can use the predefined download from the major grids and attach a region to them. Osgrid , Metro, Neverworldgrid, and Zetaworld to name a few that offers that possibility.
 +
<br><br>
 +
If you want to have your own thing on the metaverse planet, one choice is to use the download at opensimulator ( ref http://opensimulator.org/wiki/Download ) . Out of the box it will install as one region standalone. For hypergrid, use diva distro. ( Ref: http://metaverseink.com/Downloads.html ) This distribution allows an easy install of a hypergrid enabled standalone. Another choice is sim-on-a-stick. A diva distro flavor installed on a USB stick that you can run easily by simply plugging in the stick in your machine's usb port.( ref http://simonastick.com/ ). It dates a bit now with OpenSimulator 0.8.0 post-fixes. Also available and current in release is ,  diva built DreamWorld, and robust grid DreamGrid ( ref https://www.outworldz.com/outworldz_installer/).
 +
<br><br>
 +
When Lisa Laxton from IMA came to me about an installation on her rented server for grid.metaversedepot.com she had choices from all above. In addition, she had the choice to use the no longer supported MOSES-in-a-box (ref https://github.com/M-O-S-E-S ) not current and not hypergrid enabled. She tested all of the above solutions but really wanted a better solution that was platform agnostic for anyone to use. DreamGrid is a nice easy to use tool but it is limited to the Windows operating system. The Windows operating system is also not free for anyone to use like Linux. Other operating systems like Mac and Solaris are also not supported. As demonstrated by the MOSES team, the free to use VirtualBox will run on all of these operating systems and allow the creation of VM's to host Open Simulator.
 +
<br><br>
 +
So the idea is to have ROBUST hypergrid enabled Open Simulator grid using multiple virtual machines with a clonable VM (for adding simulators/regions) that will run in the free VirtualBox software for any major operating system? If so, is it also possible to simplify installation and administration without a graphical user interface so it can be install on servers?
 +
<br><br>
 +
So install the virtualbox software ( ref https://www.virtualbox.org/wiki/Downloads ),  then import the virtual machine image to start the grid. And run !! ... Hmm, not so fast !!! The difficulty in opensimulator installation is ports. Virtualbox cannot solve that nor any of the above distributions. I am sorry to say its not easy to do for everyone. Luckily for rented servers like Lisa, a mechanism is in place to help port access settings.
 +
<br><br>
 +
So virtualbox is easy to install, set, and run on a server. What else is it good for?  Plug and play ...lol!!  You can have a machine running, save state, change stuff, etc. If you realize you did wrong you can fall back to a saved state. You can clone a machine and have two simulators ready in minutes ( adjusting for ports ). You can send that clone to someone else to be part of your grid. It could, I believe provide sim on demand. That to be developped.  Backup is as simple as cloning the machine. ( This is a large file. ) Any problem or extra load on one simulator does not interfere with the other running machines because of the inherent segregation between them. It also provides protection to the host system as it remains out of reach from the guests.The buzz word is flexibility. The limit is yours.
 +
<br><br>
 +
But what are the drawbacks? Large space counted in Gs for running a 180MB program. Limited resources by simulator that will likely affect performance compared to the same install directly on a host. Management of machines parked.  Operating experience will tell over time.
 +
</blockquote>
 +
----
 +
<p id="SEARCH">SEARCH (updated 220220 )</p>
 +
<blockquote>
 +
 +
DIVA has done a proof of concept about searching capability in opensim. The module required are part of the diva distro that can be find on her web site http://metaverseink.com/Downloads.html and for people that dont use diva simulator standalone distribution a addon is availbable to provide the appropriate coding. Detail on her work can be found here: http://www.metaverseink.com/blog/news/metaverse-ink-search-for-opensims/ . Metaverse search option are available at this location  http://metaverseink.com/docs/tips.html .  Please note Metaverse search facility is broken since about begining of the year as it was before and  as it was never intended for full fledged support as opensim searching tool. Any grid owner can implement his own search facility using the simulator datasnapshot data with the help of the two php sources file ( search.php and register.php)  added in in the zip link provided at then end of this article.
 +
 +
As explain here http://metaverseink.com/docs/listing.html  To create your owne address search location using the above is as  simple as populating the opensim.ini file with  your site data. For exemple for my location  (3d.gimisa.ca:9000 ) the opensim.ini dataSnapshot  configuration is changed as follow with data_services pointing to metaverse search location in addition to my own internal location search facility :
 +
<pre>
 +
[DataSnapshot]
 +
    index_sims = true
 +
    data_exposure = minimum
 +
 +
    gridname = "GiMiSa"
 +
    ; 1 hour
 +
    default_snapshot_period = 13600
 +
    snapshot_cache_directory = "DataSnapshot"
 +
    data_services="http://192.168.2.105/register.php;http://metaverseink.com/cgi-bin/register.py"
 +
</pre>
 +
 +
Added 190901, As anyone  will notice the data collection is a simulator function. Its results can be pull from anywhere and use by anyone to make a search facility as did DIVA in her example. This is exacly what Fred did with dreamgrid with http://www.hyperica.com/Search . To use it  modify your datasnapshot registration field as follow and you will allow searching via his web page. You can also use the search object I did in gimisaOS similar to the one I present to access  my own grid objects. I leave metaverse ink there to show you that more then one search facility can be use even if its does not seem to be active anymore:
 +
<br>
 +
<pre>data_services="http://myownfacility.com/registration.py;http://metaverseink.com/cgi-bin/register.py;http://www.hyperica.com/Search/register.php"</pre>
 +
If you do like I did your own searching facility for your grid to use the viewer to access the search results you need to configure a [Search] option as detail in the following link. More recent version from Kcozens updated  https://github.com/kcozens/OpenSimSearch (My work is using this OLDER source :  https://github.com/OS-Development/OpenSim.Search) . You probably could now use Kcozens version in replacment for following. ( not tested )
 +
<br><br>
 +
This link dates and correction of  the query.php included in the reference is necessary. You might also need a more up to date (opensim 0901 ) compatible version of the OpenSimSearch.dll Both are included  in the link bellow . Please note that at the time the search facility did not includes classified ads as that feature was to come with the profil module. Please not that in order to get the classified ads  working you need access to the grid database contrary to the other features  that have NO particular access requirment except the creation of its own database. The query.php included as the following link includes that feature. If you dont have grid info the module will work anyway without the classified ads feature.
 +
<br><br>
 +
I just completed coding the  eventparser.php to add the event search feature to my grid. This php routine connect to http://yourworlds.eu/hypevents web site and parse the event published there from multiple grid and populate the events table of the ossearch database. You can then use the viewer search event tab and get the event information coming from this web site inworld. Thank to Fred (https://github.com/Outworldz/DreamWorld) for his precious indications . 
 +
Right clic this link and save in on your computer to get your files http://profil.gimisa.ca/files/OpensimSearch.190922.zip
 +
After 092 nov build it requires a new compiled version of OpenSimSearch.dll you will find it here : http://profil.gimisa.ca/files/OpensimSearch.210215.zip
 +
<br>
 +
Search via viewer and a demo object searching  can be found and tested in your friendly gimisaOS grid.
 +
 +
</blockquote>
 +
----
 +
<p id="IM">INSTANT MESSAGES (210715)</p>
 +
<blockquote>
 +
They are the backbone of social interaction in opensim alone with local chat and voice. This feature works very well in local grid where two avatar or an object to avatar communication is possible across the entire grid. HG INSTANT MESSAGE is the ability to communicate with other avatar across grid. The general spec of that initiative is given by DIVA in her 2011 blog ref : http://www.metaverseink.com/blog/hypergrid/friends-and-im-over-the-hypergrid/ . In 2013 she release a addon that eventual got integrated in opensim core. This initiative was a success within DIVA distro but was never fully successful in core implementation. The role of the secret key is explain by DIVA in the following terms:
 +
<br>
 +
<blockquote> "An HG friendship establishes 2 pairs of data, each stored in each user’s user services. That data is “signed” with a random number known only to the 2 services and the simulator where the friendship was established, so that, even if the user services (hg friends, to be precise) are exposed to the Internet, no one but the holders of the signature can manipulate the friendship data". </blockquote>
 +
<br>
 +
The friend database include two entry. One is all friend to you. And the other is the opposite HG People friend  to local grid users. That secret key stored in friend database is used to  allow to  be notified when you login/logout (and vice-versa), to  change your objects (and vice-versa), to  see you on the map (and vice-versa), etc. All services would be affected equaly if the secret key is the determining factor of the problem. But they are not . And this discrepancy in service rendering, online indication, IM delivery and so on is an indication that the trouble is a question of how each of this service works. What is puzzling is that ONLINE indication should be a simpler feature yet easy to make work properly. If we follow DIVA spec the intended action is that ONLINE status should follow the HG traveller in his quest. As long as he is traceable by his friend the  HG friend should be shown online. IM messages and other friend service should be equally successful. At this current version 0901, the only reliable way to have contact with HG friend is to move along to their local grid to confirm online indication and establish contact.
 +
<br>
 +
I have extended the discussion with an example test and discussion to overcome the limitation of a user page gaciously offered by opensimulator.org. See http://profil.gimisa.ca/opensimCommunication.pdf
 +
<br>The above communication document is still valide with 092 september release. But Since a few months now has raise a busy exception to IMs sent by people replying to your IMs . I though it was my configuration that needed update and then started checking the source code activating debug messages. Finaly I found that https://mosthugs.win/ had look at the situation and found a cure that work for me .
 +
</blockquote>
 +
----
 +
<p id="TOS">TOS</p>
 +
<blockquote>
 +
No, this is not a discussion about GDPR. If you want information or directive about GDPR, search with google. This text is rather about help with installing DIVA TOS addon to a grid. 
 +
<br><br>
 +
DIVA TOS is a simulator query for acceptance of the TOS, with a constraint of ejection if not accepted. Its a simulator function ( opensim.exe).  As a simulator function, it works on each running simulator where it's installed. Any region visited by a user that have DIVA TOS enabled will will need to validate the user for TOS (accept or decline). Any region without it will disregard the requirement. Once a TOS is accepted in any regions it will not get any new request for that user unless a TOS change warrant this new acceptance.
 +
<br><br>
 +
The process of installing TOS involves ONLY the simulator and should be relatively easy since diva has an addon available for this function noted in her simple addon steps per reference.
 +
    ( Ref: http://www.metaverseink.com/blog/diva-addons/wifi-and-other-diva-addons/  )
 +
 +
If I write to you it's because well, it did not go that easy !!!!.  To figure out my mistake, I went to the original DIVA distros. Diva includes the TOS feature for a long time now so it should be a snap to see how its done in a her standalone distro then port that to a grid. ( ref: http://www.metaverseink.com/Downloads.html. )
 +
<br><br>
 +
Well this investigation step did not go that easy either as these are broken with both DIVA 0821 and DIVA 0900 distros.
 +
V
 +
So, instead of talking to you about what does not work, let me drive straight to what does. In DIVA distro 0821 and 0900 what I found was wrong first is the tos.html file. It needed to be modified. The DIVA version, if I am correct, is expecting information both in the GET QUERY link and in the reply POST of the tos.html page. Unfortunately, as I could test, the GET part gets lost and is not picked up by the code when submitting the post. Diva Wifi addon is geared to receive the information from that html file and sets a TOS field in the gridUser database table. The service.TOS is the code in diva wifi responsible to receive your acceptance post. I needed to modify it since now all the information is provided by the post portion the tos.html. I am not C# developper so I did best with what I know. Armed with  these changes DIVA distro 0821 is working in providing a TOS request to visitors and recording it properly.
 +
<br><br>
 +
So back to the grid now. Simple enought I believe a new tos.html and a change in service.TOS. Did I say service.TOS? Oops the TOS addin Diva is providing is for simulator so its not at all a direct replacement for the code in wifi!!
 +
<br><br>
 +
So, I had to get the source of DIVA TOS addon. Downloading the source and compiling  of Diva addons is rather well explained here ( ref: https://blog.inf.ed.ac.uk/atate/2015/04/06/diva-wifi-on-windows/  ) and the Diva addon source available here . ( ref:  https://github.com/diva/diva-distribution/tree/master/addon-modules. But hum, no TOS addon per say!!! 
 +
<br><br>
 +
So back to square one. It wont take you long to see the red flags when starting your simulator caused by some missing parts in the TOS addon module. You need to copy two files from the diva distro to implement the missing portion. Those are the Diva.OpenSimServices.dll and the Diva.Interfaces.dll. You also need the TOS.ini modified to point to these with this configuration (GridUserService = "Diva.OpenSimServices.dll:GridUserServicesConnector") .
 +
<br><br>
 +
So now you get an uncomplainng TOS addon module that will load nicely and that will greet your visitors with a TOS text and acceptance buttons. You have a web page to accept the TOS that will be presented to them and an accept button to update the  TOS field in the grid server database. Perfect ... well not quite. When the TOS module come back 5 minutes later to see if you have accepted the TOS, it can't get the reply. Damn, sorry but it kicked you out.
 +
<br><br>
 +
A good reason for this is that the data field TOS is missing in gridUser table on the grid server side which is something that wifi doesn't seem to implement. So creating the field is straight forward with the following sql command. ( use robust; ALTER TABLE GridUser ADD TOS char(128); ) So now it writes something to the database. But still kick you out even if you accept the TOS. Hum!!  I find that the answer is not pushed back to the simulator when requested by the TOS module.
 +
<br><br>
 +
But going around the missing pieces of information, I found that the some modification to the grid server was required to send the proper TOS information to the simulator TOS module.  So here are the changed to dll files to be applied both to grid and simulator for the DIVA TOS to work with version 0821 and likely for 0900 (later not tested) . 
 +
<blockquote>
 +
In grid server side the following dll need to be modified. :
 +
 +
<br>........OpenSim.Data.MySQL.dll
 +
<br>........OpenSim.Services.Connectors.dll
 +
<br>........OpenSim.Services.Interfaces.dll
 +
<br>........OpenSim.Services.UserAccountService.dll
 +
<br>and in grid server addin-registry wifi addition you need to modify the 
 +
<br>........Wifi.dll
 +
<br>........tos.html
 +
<br>in the simulator the following file need to be modified:
 +
<br>........Diva.Interfaces.dll
 +
<br>........Diva.OpenSimServices.dll
 +
<br>........OpenSim.Services.Interfaces.dll
 +
<br>and in addin-registry you need to modify the
 +
<br>........tos.ini
 +
</blockquote>
 +
The required files here ( http://profil.gimisa.ca/TOS.bin.zip )  and  source files  here.( http://profil.gimisa.ca/TOS.source.zip )   
 +
</blockquote>
 +
----
 +
<p id="WIFI">WIFI  emails</p>
 +
<blockquote>
 +
I have been ask to look at WIFI email notification. Either for new client or for forgotten password. DIVA failed to send mail ,even with ssl authentification on port 465 or TLS on port 578 with proper certificates installed in mono per DIVA suggestion.( ref: https://github.com/diva/d2/wiki/Wifi)
 +
<br><br>I did also test a simple C# routine to send a test email. I did input the same credential I use with my email client unsuccessfully either. Only port 25 without identification seem to work properly with mono C# emails.
 +
<br><br>
 +
There is not many smtp server anymore that handle port 25. In case yours dont , the solution I found was to install postfix a full mail server. And to direct wifi to localhost , port 25 , providing a default return email and no password configuration as follows in wifi.ini setting.
 +
<blockquote>
 +
<br>    ;;email working with internal postfix routing
 +
<br>    SmtpHost = "localhost"
 +
<br>    SmtpPort = "25"
 +
<br>    SmtpUsername = "your@returnEmail.com"
 +
<br>    SmtpPassword = "nopassword"
 +
</blockquote>
 +
The postfix configuration to use is local only so you dont risk getting identified as spammer by routing unwanted stuff. In this configuration you have to use a real return email as SmtpUsername in wifi otherwise the email will be rejected.  I did not install any mailer so that system emails are not forwarded. Install postfix with local configuration  when requested. It did not work out of the box for me .  I replaced it by the following, for postfix null client ref: http://www.postfix.org/STANDARD_CONFIGURATION_README.html#null_client
 +
<blockquote>
 +
<br>myhostname = vmbox1.localdomain
 +
<br>inet_interfaces = localhost
 +
<br>myorigine = $mydomain
 +
<br>relayhost =
 +
<br>mydestination =
 +
</blockquote>
 +
With this setup wifi email were now forwarded appropriatly on install in ubuntu 16.04 .
 +
</blockquote>
 +
----
 +
<p id="BULLET">PHYSICS</p><span id="UBODE"></span><span id="PHYSICS"></span>
 +
<blockquote>
 +
Everyone know it the sciences field that study nature and properties of matter and energy. In opensim its the simulator motor responsible for movement.  In opensim you can set an object to be physical in edit panel build tool. Doing so allow the object to be moved by virtual physics forces.
 +
<br>In opensim there is a number of physics engine that one can use. You will find the configuration option about physics in opensim.ini file startup section. As of opensim 0901 the choices are:
 +
<blockquote>
 +
<br>    ;; Default is BulletSim
 +
<br>    ; physics = OpenDynamicsEngine
 +
<br>    ; physics = BulletSim
 +
<br>    ; physics = basicphysics
 +
<br>    ; physics = POS is a basic physics with collision.
 +
<br>    ; physics = ubODE  Ubit modification to ODE physics
 +
</blockquote>
 +
Arm with that I wanted to do a bowling game. That game needs physics plug in to calculate the trajectory of the ball in motion and its final impact effect on the pins at the end of the alley.
 +
<br><br>This is a very demanding application for a simulator. A bowling alley is oiled for two third of its length. So the ball is sliding until it hits the higher friction surface where it starts a rolling action. The spin imposed by the bowler on the ball will take effect in that portion and result in a hook change in direction.  Following impact the ball interaction with the pins it hits will changes its trajectory while multiple collision between pins itself must be rendered.
 +
<br><br> Opensim using bulletsim and ubODE was able to render the game successfully. I noted  a few point of interest between the two engines.
 +
In bullet it was possible to set the physic feature of the objects to  the REAL values of  ball weight, pin weight, and alley friction. In ubODE physics it was necessary to use complementary scripting function osSetInertiaAsSphere for the ball and oSetInertiaAsCylinder to obtain similar results.
 +
<br><br>A ball is an interesting object in physics. When sliding it can be seen as a cube. Friction is minimized on the first part of the bowling alley so movement speed should be constant and trajectory be a straight line. In the second part of the alley friction is more important and should cause rolling instead of sliding. So the spin the bowler impose on the ball would have  little  effect on the ball trajectory until it reach the high friction area of the alley . Then we expect a rapid change of the ball direction in line with the spin imposed by the bowler. That is called the hook effect.  Its similar to golf or baseball where spin of the ball and friction cause the ball trajectory change.
 +
<br><br>Bullet rendered that behavior as expected. Under ubODE it was necessary to consider a draging effect. In theory a rolling ball will continue rolling  because there is little friction involved to  stop its movement. But reality as we know is different and there is some dragging effect that will slow the ball rotation . The dragging effect on a 15m alley in bullet was neglectful but in ubODE physic it was important enough to warrant compensation. 
 +
<br>You will find both bowling alley demos in my grid.
 +
</blockquote>
 +
----
 +
<p id="LANDING_POINT"> LANDING - POINT - <span id="TELEHUD"> TELEHUD</span></p>
 +
<blockquote>
 +
 +
Landing points are define on a parcel using about land window. In  the buttom of options tab you will find teleport routing. Select  landing point  and use  set button to set location where you stand will  force any one coming in your land via map or Landmark  to rez at the define location. The landing define is unique and applicable to all including you .
 +
<br><br>
 +
By contrast deleting the set point but keeping the forced teleport routing to landing points you  can use the estate/region window to define a telehud and spawning points . These users landing points will NOT be applicable to you as owner.
 +
<br><br>First rez a cube make it small phantom and transparent. You optional can name it telehud.  While still selecting the object in construction window ,  select Region/Estate window , region tab,  and hit the Manage Telehud button. With the telehud object you just created still selected you should be able to connect it as telehud with the connect button. If not make sure you select the telehud object . That is it.  That is you landing point now . The connection is like a bookmark to the location of the telehud object. What is fun is that you can move that telehud object anywhere you want and the landing point will be adjusted accordingly .
 +
<br><br>You can add additional spawn point using the same interface. Spamn point are alternate landing points to the telehud. The spawn point use is  either selected when the number of people in other spawning location is too big or simply when the selected teleport location is closer to the spawn point on the map.
 +
<br><br>To create addition spawn point rez an object where you want it. Hit the add spawn point on the telehud manager interface to define it . You will see a location in the manger window. Its the difference berween the new spawn point and the connected telehud. The object use to define the additionnal spawn point can be delete as its data is recorder with the telehud. Moving the telehud also move the spawn points.
 +
</blockquote>
 +
----
 +
<p id="C#">C# - XENGINE - <span id="MRM">MRM</span></p>
 +
<blockquote>
 +
C# IN XENGINE:  C# is  supported as scripting language by XENGINE module same as  OSL and the default LSL scripting languages. In order to allow C# the XENGINE ini section needed  AllowedCompilers = lsl, cs . The advantage of XENGINE is that you can miss match language and write part of the script with LSL, OSL function and part of script in C# . The flip coin inconvnient is that you cant attach libraries  "using libraries" in your script .
 +
Exemple of connecting outside object to inworld done by Jeff Kelley in 2011 illustrate the capabilties of xengine C# scripting. http://opensim-users.2152040.n2.nabble.com/Scripting-Having-fun-with-C-and-UDP-td6325728.html You will find an exemple of the XENGINE C# application in my store.
 +
<br><br>
 +
C# with MRM . MRM stand for mini region module . As explained here https://web.archive.org/web/20091221025159/http://www.adamfrisby.com:80/blog/2009/03/mrm-scripting-coming-to-opensim-soon/  that is a mini region module still active in opensim code that provide support for C#. Done by Adam Frisby in 2009 or so to help in developping code in opensim . One can implement C#  as a script instead for testing or for ponctual application. Here none of the XENGINE LSL/OSL scripting function are available but one can use opensim as well as system code library. See http://opensimulator.org/wiki/Getting_Started_with_Region_Modules .  You can find a few exemple of the scripting power of MRM in https://forums.osgrid.org/viewtopic.php?f=5&t=2869. There is also ( untested ) XMRM by JohnMcCarlfery https://github.com/JohnMcCaffery/XMRM an extension of OpenSim's MRM capability to allow scripts to be written externally and loaded in world. You will find an exemple of MRM C# in my store.
 +
<br><br>
 +
Opensing C# as scripting source has high treath level as it give access to all system funtions. One way to limit the treat is to assign a unique user as able to run such script by populating the [Startup] section of opensim.ini with the GrantCS = UUID .  In the case of XENGINE  the scripts will not compile with error. In the case of MRM the script will save but not run. 
 +
</blockquote>
 +
----
 +
<p id="OAR">OAR  CONVERTER</p>
 +
<blockquote>
 +
Its possible to convert OAR files from opensim to COLLADA for UNITY3D or to glTF .Opensim can export objects to  collada files but they are not compatible with Unity. A complete 3d scene can be  exported in opensim  to OAR file then converted to a collada dae document compatible with unity import tool . The tool location is at http://www.nsl.tuis.ac.jp/xoops/modules/xpwiki/?OAR%20Converter .
 +
<br><br>Similarly a oar file can be converter to glTF format. The GL Transmission Format is use for efficient transmission and loading of 3D scenes and models by applications. The glTF format can then be use to be presented as webgl with threeJS javascripts  as demonstrate in following link or import  in blender 2.8 and later using appropriate add on. The tool location and detail is available at  https://misterblue.com/oars/
 +
</blockquote>
 +
----
 +
<p id="SLURL">SLURL</p>
 +
<blockquote>
 +
Is well describe in this web page. http://wiki.secondlife.com/wiki/Viewer_URI_Name_Space . This post look at three subdomaines of SLURL application. The teleport and the worldmap app for opensim hypergrid application and the default root application for local grid. Lets start with the later.  secondlife://Region/x/y/z/, is a SLURL that you can post in  local chat or in IM that an avatar can clic. In that case the avatar will be teleported in the local grid region and if specified coordinates of the grid they are in . Since its a URL the Region name need to be Escaped for URL format.
 +
<br><br>
 +
Passing a SLURL inworld is the equivalent of sending a teleport offer to someone so what is the point of doing so . Contrary to teleport offer that will bring the avatar to you , the SURL can send the avatar anyplace . Its more like sending a LandMark.
 +
<br><br>
 +
The interest come in scripting. Its not possible for a script to present the world map unless the proper function is called in a touch event. A script could give a LandMark.  But the view on map button of that landmark  is not working for hypergrid landmark. But its possible to present the SLURL. By clicling the SLURL worldmap application the map is presented with the grid and region requested. (ex:  secondlife:///app/worldmap/3d.gimisa.ca|9000|gimisa3 ) where the region name is escaped if necessary.  So that you can show that region on the map of the avatar without him touching the object. Similarly you can also offer to teleport him using SLURL teleport. (ex:  secondlife:///app/teleport/3d.gimisa.ca|9000|gimisa3 ). Contrary to Hop://grid:port/region url . ( ex hop://3d.gimisa.ca:9000/gimisa3) the SLURL will work with ALL viewers.
 +
</blockquote>
 +
----
 +
<p id="PARTNER">PARTNER</p>
 +
<blockquote>
 +
Partner creation is not part of viewer function. So one cannot simply create the link with the viewer. Searching the web for the required tool one find Ferd dreamworld https://www.outworldz.com/cgi/freescripts.plx?ID=1115 . But that script is only the inworld function and will only work with its back end routine supplied with dreamworlds https://www.outworldz.com/outworldz_installer/ Searching the source in https://github.com/Outworldz/Dreamworld I could find the necessary code in RegionMaker.vb that compiled into start.exe. But could not get further with this information on my linux setup .
 +
<br><br>
 +
So I had to move on with an alternative I found done by djphil. https://github.com/djphil/ospartner That did not work out of the box either. But it did after a bit of fiddling that you will find here http://3d.gimisa.ca:8880/SL/ospartner.zip .
 +
<br><br>
 +
It simple to install by unziping the file in you wep site server root  directory. This install assume that the web server is on same machine ( localhost ) as the grid server .  You then need to edit the config.php file in ospartner/inc/ subdirectory and provide the credential to access your grid database .
 +
<br><br>
 +
The new web page for partnering will offer a login page for you and your future partner avatar. The proposer log first and invite his future selected between his grid friends . The future logs after and accept the partnership . Then both have to log inworld to see the result and celebrate!! If sadly the partnership has to be end simply log back in partnering web page and delete the partnership . I provide an inworld object using media-on prim to point to my grid partnering web page that can easly be modified for your own use for people that prefers and inworld object.
 +
</blockquote>
 +
----
 +
<p id="AO">AO</p>
 +
<blockquote>
 +
<br><br>
 +
AO in opensim. stand for an Animation Override ("AO"). Its a scripted attachment which replaces standard animations (walk, jump, stand, run, etc.) with animations selected by scripter.
 +
<br><br>
 +
One need to know that AO works differently in OpenSim.  Thanks Melanie, in 2009 she introduced a CHANGED_ANIMATION event that is triggered allowing the AO script to apply the selected animation instead of the default one on each action of the avatar. Details can be found here as to why this was the best way to handle AOs with script example to use: http://opensimulator.org/wiki/User:Dz/AO
 +
<br><br>
 +
Futher development were introduced with version 0901. Now the function llSetAnimationOveride is AVAILABLE. It works by replacing the current animation define for each avatar animation state with the one selected by the scripter . So now the animation definition is replace instead of its animation implementation on each change_animation events. Its documentation is found here: http://wiki.secondlife.com/wiki/LlSetAnimationOverride
 +
</blockquote>
 +
----
 +
<p id="INTELLECTUAL PROPRIETY">INTELECTUAL PROPRIETY IN OPENSIM</p>
 +
<blockquote>
 +
This is not a technical discussion per say but my creator reflection on what is the implication of creating/importing  stuff in Opensimulator. Opensimulator is a software use to provide a service. So opensimulator software responsibilities is in the hands of the one running it. There is two main part in the opensimulator software . The grid services and the simulator services. The grid service is responsible for storing the raw assest while the simulator is responsible for import / export or creation of the assets.
 +
<br><br>
 +
Opensimulator software does not provide a TOS as part of his data but some distribution do. The lack of TOS does not implies the lack of responsibility between service provider of opensimulator and creator of intellectual propriety depending on the country of service. Since opensim is similar to Linden Lab second life software and since linden lab operate in USA. Their case can be use as example of acceptable practice in that country. According to their TOS ref: https://www.lindenlab.com/legal/intellectual-property-infringement-notification-policy its possible for a creator to present his creation case and get offending assets remove form the service provided. From the text presented its clearly the responsibility of the creator to defend his rights. In layman term who don't say anything agrees! In in the case that linden lab act on the notification they can do so ONLY on the extent of their service to users.
 +
<br><br>
 +
So what does it means for a distributed service like opensimulator which is an interconnected service offered by a multitude of service providers. Many has compare opensimulator to the 3d web. For the web content creator that want to address propriety rights also need to contact the offenders  Internet Service provider (ISP) and represent his rights to each of them. And in the web case ISP will only act for their own domain of services. Creator in opensimulator face the same situation . They have to present their  case  to each operator of the software and ask their cooperation . In addition when opensimulator is accessible via web they also can contact their hosting Internet service provider for action. For further reading here is an interesting case story https://ryanschultz.com/2018/07/28/intellectual-property-issues-in-opensim-hypergrid/
 +
<br><br>
 +
So what does that say . Lets give the last word to https://fairuse.stanford.edu/overview/website-permissions/websites/
 +
</blockquote>
 +
----
 +
<p id="UPDATE">UPDATE</p>
 +
<blockquote>
 +
    Is the action of downloading opensim official release located here http://opensimulator.org/wiki/Download and comparing the ini file for change with existing one. I use meld to do that . https://meldmerge.org/  I check the dates on them first as most dont change and if necessary validate my existing files against  bin files  opensim.ini, Robust.HG.ini.example and in config-include directory I validate GridCommon.ini.example, FlotsamCache.ini.example and osslEnable.ini. I use a modified version of GridCommon where I refer to gimisa.ini via an include statement for all my particular situation. See for more detail about that in ROBUST paragraph above. I cant compile the latest version of opensim  but those who do can update at any time by pulling the development version and follow the instructions to compile it themselve.
 +
<br><br>
 +
In between release opensim compiles a nightly version that is available here http://opensimulator.org/dist/OpenSim-LastAutoBuild.zip . Sometime that is a bit too experimental and might compromise your existing production instlalation. A safer approach is to use existing grids compiled version offered by a few of grid owners. They are  pull from development and compile as is or modified for the particular need of the grid. The remain compatible with opensim project mainly the one from osgrid.  The following is not an exhausted list of the one available:
 +
<pre>
 +
*dreamgrid: https://github.com/Outworldz/DreamWorld
 +
*lanani: http://mosthugs.win/
 +
metro : https://hypergrid.org/download/metropolis-os_091_DEV_PLUS.zip
 +
neverworld: http://www.mediafire.com/file/0wx6vmsi9twbfxy/Neverworld_region_server.zip/file
 +
osgrid; http://danbanner.onikenkon.com/osgrid/osgrid-opensim-08162019.v.0.9.1.64c56fc.zip
 +
zetaworld: https://files.zetamex.com/zetaworlds/ZetaSim-b5-REL-preconf.zip
 +
</pre>
 +
These are generously offered to you in order to connect your simulator to their grid. You can use those likewise  official release by doing the same comparaison effort mention above. Each of these zip file contain the SAME copy of the liscense which state that redistribution and use in source and binary forms, with or without modification, are permitted. But Its a good consideration to ask the issuing grid owners  permission and mention in your grid that you using their work to run these alternative release.
 +
<br><br>
 +
*Lanani offer binaries stable and ready to use similar to an opensim release.<br>
 +
*dreamgrid too offers binaries stable and ready to use.  You needs a bit more work to locate the  compiled files in the usual bin sub diretory of opensim directory itself  which you will find under the OutworldzFiles directory. The bin compiled version has in addition the many  diva*.dll that will allow you  to fire up diva under grid mode should you like to do that. Yes opensim is that modular dll modules defines its options. In the same way you can also use globit economy as is or shut off its dll.  You can as well run a basic standalone mode by renaming the appropriate dll.off and configuring  the  ini  apppriatly .So doing an update with dreamgrid as your source of binnaries is possible even for a  Mac or Linux machine. It comes out to not only compare you ini files but also you dll content to match the options you want to update with.
 +
</blockquote>
 +
----
 +
<p id="RENT">RENT</p>
 +
<blockquote>
 +
This article is presenting an adaptatation of Ferd rent box ( https://www.outworldz.com/cgi/freescripts.plx?ID=557 ) to populate search facility for land renting and monitoring.
 +
<br><br>
 +
Rent, in opensim is the action of obtaining a piece of land call a parcel. That parcel could be any size from 16m2 to a full 4,194,304m2 ya that is 8x8 256x256m !! You can either obtain that land from the simulator owner direcly. The simulator owners  can sell you the land and make you an estate manager for that land so you can use it to your liking. You can also rent that piece from someone already getting it from the simulator owner and subdivising it for use by tenants.
 +
<br><br><p id="PARCEL"></p>
 +
Landlord can use an object to manage his parcels  offering. That object put on the land of interest give the futur tenant a way to communicate with the landlord to obtain rights to use that parcel  for building for a time. That object call a rental box is basicalling sending an IM to the landlord for him to allow you access to the land of choice. An other way to manage land offering is through the search facility of the viewer. People have parcel available for lease can set that parcel for sale for 0 or any price up and tick the available for search feature of the parcel window. The landlord is an estate owner or manager of that area so he can reclaim the land at the end of the lease. The box offers the help to micro managment the parcel by allowing leasing IMs, end of lease period warning, lease extension and lease re-newal while communicating with landlord on lease termination.
 +
<br><br>
 +
When using the datasnapshot openSearch , the search data is store in the ossearch database parcelsales table  and populated through the datasnapshot process. See searching article above for detail on OpenSearch facility. The idea is to use the rental box to post the rental data instead of the datasnaphot and provide real time status of the parcels for lease. So that the landlord has a clear picture of the situation via a web page or a media on prim inworld object.  I am providing through the following link the php code to parse and obtain available lease through the Ferd modified rental box while the inworld object can be obtain by visiting your friendly gimisaOS grid.
 +
<br><br>
 +
I am also providing a tenant monitoring function. The following zip file includes the parcelmonitoring table creation mysql command and the  web page php script to obtain tenant last online date and number of prim in the leased parcel. The intent is  to help lease managing on a free parcel . Also included inworld in gimisaOS grid  is a media on prim object to access the web page. The Lease Agreement notecard included with the rental box  discloses this monitoring in the exemple provide.
 +
<br><br>
 +
http://3d.gimisa.ca:8880/SL/osRent.zip
 +
<br><br>
 +
</blockquote>
 +
----
 +
<p id="OSL">OSL FUNCTION ( update 210508 ) </p>
 +
<blockquote>
 +
Using oslfunction is a plus in opensim. You can have more detail on OSL function in http://opensimulator.org/wiki/Category:OSSL_Functions  . OSL function access depend on object owner cause of treath level . Threat leave are documented here : http://opensimulator.org/wiki/Threat_level . This article is about how I test for OSL function availability for the object owner so that my script can react properly . The principle is that a failing osl function will cause a crash of the event calling it in XEngine and a failure of the script that will require reset under YEngine so the following only work for XEngine. See  further development under opensim 092 at the end of article for YEngine / XEngine environment .
 +
<pre>
 +
variable definition with few function use in the subject script:
 +
integer os_GetAvatarList=-1;
 +
integer os_GetAgentIP=-1;
 +
integer os_IsNpc=-1;
 +
integer os_SetSpeed=-1;
 +
integer os_TeleportAgent=-1;
 +
integer  os_MakeNotecard=-1;
 +
integer  os_GetGridLoginURI=-1;
 +
integer os_GetInventoryDesc=-1;
 +
 +
 +
DEFAULT STATE_ENTRY(){
 +
llSetTimerEvent(.1);
 +
}
 +
</pre>
 +
In the following timer I test each function so I know which one fails. But one could make it simpler by testing all function at once.
 +
Success is when the timer function reach its end . I test function by function when == -1 . And repeate the timer.
 +
If function succeed next pass see its value as 1 if fail it value is 0 . So I can test next one and so on.
 +
When the timer reach the end after testing all function. I can act on its status by sending a message,  replace it or and abort the script.
 +
<pre>
 +
 +
    timer(){
 +
        llSetTimerEvent(.0);
 +
        if( os_GetAvatarList == -1 ){
 +
            os_GetAvatarList=0;
 +
            llSetTimerEvent(.1); if the
 +
            osGetAvatarList();
 +
            os_GetAvatarList=1;
 +
        }
 +
        if (os_GetAgentIP==-1){
 +
            os_GetAgentIP=0;
 +
            llSetTimerEvent(.1);
 +
            osGetAgentIP(llGetOwner());
 +
            os_GetAgentIP=1;
 +
        }
 +
        if (os_IsNpc==-1) {
 +
            os_IsNpc=0;
 +
            llSetTimerEvent(.1);
 +
            osIsNpc(llGetOwner());
 +
            os_IsNpc=1;
 +
        }
 +
        if (os_SetSpeed==-1) {
 +
            os_SetSpeed=0;
 +
            llSetTimerEvent(.1);
 +
            osSetSpeed(llGetOwner(),1);
 +
            os_SetSpeed=1;
 +
        }
 +
        if ( os_TeleportAgent==-1) {
 +
            os_TeleportAgent=0;
 +
            llSetTimerEvent(.1);
 +
            osTeleportAgent(llGetOwner(),llGetPos(),ZERO_VECTOR);
 +
            os_TeleportAgent=1;
 +
        }
 +
        if ( os_MakeNotecard==-1){
 +
            os_MakeNotecard=0;
 +
            llSetTimerEvent(.1);
 +
            osMakeNotecard("test.test",[]);
 +
            llRemoveInventory("test.test");
 +
            os_MakeNotecard=1;
 +
        }
 +
        if ( os_GetGridLoginURI==-1){
 +
            os_GetGridLoginURI=0;
 +
            llSetTimerEvent(.1);
 +
            homeURL=osGetGridLoginURI();
 +
            homeURL=llGetSubString(homeURL,7,-2);
 +
            os_GetGridLoginURI=1;
 +
        }
 +
        if ( os_GetInventoryDesc==-1){
 +
            os_GetInventoryDesc=0;
 +
            llSetTimerEvent(.1);
 +
            osGetInventoryDesc("");
 +
            os_GetInventoryDesc=1;
 +
        }
 +
           
 +
        if( os_GetAgentIP==0 ){
 +
            mssg(0);
 +
        }if (os_IsNpc==0){
 +
            mssg(1); 
 +
        }if (os_SetSpeed==0) {
 +
            mssg(2);
 +
        }if ( os_TeleportAgent==0) {
 +
            mssg(3);
 +
        }
 +
        if ( os_MakeNotecard==0) {
 +
            mssg(4);
 +
        }
 +
        if ( os_GetGridLoginURI==0 && llGetInventoryNumber(INVENTORY_LANDMARK)==0 && os_GetInventoryDesc==1) {         
 +
            mssg(5);
 +
        }else if (os_GetInventoryDesc==0 && os_GetGridLoginURI==0  && local_grid_URL!="" ){
 +
            homeURL=local_grid_URL;
 +
        }else if( os_GetInventoryDesc==0 && os_GetGridLoginURI==0  && local_grid_URL==""){
 +
            mssg(6);
 +
        }else if ( os_GetGridLoginURI==0 && llGetInventoryNumber(INVENTORY_LANDMARK)==1  && os_GetInventoryDesc==1){
 +
            homeURL=osGetInventoryDesc(llGetInventoryName(INVENTORY_LANDMARK,0));
 +
            homeURL=llGetSubString(homeURL,10,-1);
 +
        }
 +
        if(dbug)llOwnerSay(llList2CSV(["summary result of check opensim script function 1 is ok 0 is not
 +
available:\nos_GetAvatarList",os_GetAvatarList,"os_GetAgentIP",os_GetAgentIP,"os_IsNpc",os_IsNpc,
 +
"os_SetSpeed",os_SetSpeed,"os_TeleportAgent",os_TeleportAgent, "os_MakeNotecard" ,os_MakeNotecard ,
 +
"os_GetGridLoginURI",os_GetGridLoginURI,"os_GetInventoryDesc",os_GetInventoryDesc]));
 +
       
 +
    }
 +
</pre>
 +
For XEngine / YEngine environment things get a bit more complexe for the scripter to know what osl function are available. The above still work under XEngine but will fail with reset required for YEngine. What to do for detection in  YEngine environment if timer test is not available. Then answer lies in yoptions; This is a statement adding YEngine scripting capablitlies. If yoptions is put in second line of the YEngine script.YEngine script has additions redirection instruction including try,catch,and finaly. One can use the reditction to test for oslfunction in the following way:
 +
<pre>
 +
//this script can now be a function instead of using timer.
 +
 +
checkOSL(){
 +
 +
        if(os_Notecard == -1 ){
 +
            os_Notecard=1;
 +
            try {
 +
                string test=osGetNotecardLine("en",0);// testing an existing notecard
 +
            }
 +
            catch(scriptexception ex)
 +
            {
 +
               
 +
                string emsg = yExceptionMessage(ex);//extract the error messge
 +
                if(llSubStringIndex(emsg, "Notecard")>-1 )//check if message contain keywords
 +
                    os_Notecard = 0;
 +
                    //take action later in the script on os_notecard as above for XEngine.
 +
                else
 +
                    throw;//if the error message is not related proceed with standard handling           
 +
            }
 +
           
 +
            finally{
 +
            }//try
 +
        }//addtional if as needed to test all osl function required in project.
 +
        ......
 +
 +
    }//end of function
 +
</pre>
 +
<br>
 +
The cost of using yoptions; is that the YEngine script will not compile and run in XEngine environment with compile error on second line of script.  So under current 092 situation two scripts are required to test OSL functions. This is needed as long as XEngine will remain default script engine. So knowing that  XEngine timer will fail in YEngine environment one need to  add to the XEngine script a if statement to check XEngine with osGetScriptEngineName() and return the timer with no action under YEngine situation. While the YEngine script will take over in YEngine environement to test osl function . And likewise in XEngine environment ( default ) the XEngine will test with timer while the YEngine containing yoptions; will fail running.
 +
</blockquote>
 +
----
 +
<p id="BANDWIDTH">BANDWIDTH</p>
 +
<blockquote>
 +
There is an excellant article on bandwidth presented by firestorm viewer at https://wiki.firestormviewer.org/fs_speedtest . In this article they recommend that people pay attention to their settings and mainly recommend  500kbps when using a wireless connextion and 1000kbps for wired dsl.
 +
<br><br>Why talking about bandwidth. The new 091 release of opensim makes it mandatory that you pay attention to your settings otherwise you might see missing prims or incomplete terrain rezzing,  like what happen to me in gimisaOS grid since I updated. This is a new problem. I never paid attention to that setting before and when I notice the problem I saw that my viewer was set to its maximum. ( 10,000 kbps ) .
 +
<br><br>You got to be a bit more patient to let thing rez specialy if you use the recommanded 500kbps setting as in my case . In gimisa4 it took me 3 minutes to see the integrality of all the prims. Most prim will appear after 1 minutes, and texture will follow for the remaining 2 minutes in the test I made using singularity.
 +
<br><br>Your result might vary since  speed throttling is mainly due to both ends of the connexion. That is with different server connexions and with different viewer connexion one can expect very different optimal speed setting to get all prim and terrain to show up while maintaining a reasonable value of rezzing time . The recommanded value by firestorm is base on their experience with SL. Where server connexion is optimum and the only variable is viewer side connexion.  Lowering the minimum recommanded setting might be necessary if you withness difficulty with prim or terrain  rezzing for your prefered location.
 +
</blockquote>
 +
----
 +
<p id="SSH">SECURE SHELL</p>
 +
<blockquote>
 +
SSH is well known to work with password to log in a remote server. SSH use a  "salt" to encrypt the exchange with the server. The weak point here is to figure out the password. Brute force can be use to test a server util it reveals it. For increase safety a key pair can be generated. Like key and lock in you home . The key has two side a private side that you keep safely in your user computer and a public side that is install  to the server like the door lock to your house. Its  lot harder to pick the server door using this key structure then  to figure out a password. Also the password need you to memorise it contrary to keys.
 +
<br><br>
 +
Keypair is very reliable as long as your private key is well burried in your computer. Also Key pair creation is easy  and furthermore dont need to be memorised. In linux machine using following command  in the USER machine and accepting default you can create a ecdsa encoded key. rsa and a number of other coding is also available:
 +
<pre>    $ ssh-keygen -t ecdsa </pre>
 +
<br>Thereafter one need to add the public key by copy direcly its content into ~/.ssh/authorized_keys text file on the  SERVER.
 +
<br>Next step for more security is to diseable the password authentification on the SERVER once access is validated by editing the /ect/ssh/sshd_config and changing following settings :
 +
<br>
 +
<pre>    find and change or create line with :
 +
            ChallengeResponseAuthentication no
 +
            PasswordAuthentication no
 +
        $ sudo service sshd restart
 +
        $ sudo sshd -T  to validate the change.
 +
</pre>   
 +
</blockquote>
 +
----
 +
<p id="CERTIFICATE">CERTIFICATE updated 2020 0828</p>
 +
<blockquote>
 +
A not so known method avaiable with SSH ( secure shell ) is using certificate. The client use the certificate to connect to the server instead of its public key. The server first validate the certificate and allow log in via user private key. Please read Secure server article above for more detail of key pair use ins SSH.  The process in essence  combine the key pair with a certificate avoiding the need to cummulate user public keys in server authorisation.keys file .
 +
<br>facebook provide a glance at how to do this in following web site:
 +
<br>https://engineering.fb.com/security/scalable-and-secure-access-with-ssh/
 +
<br>
 +
<br>Here is a my own step by step to do same so you avoid problem that I encountered . For clarity I define three computers. USER, SERVER, and a one call CERT-AUTHORITY. Now you can only use two computers if you prefer. In this case SERVER will also be your  CERT-AUTHORITY computer.
 +
<br>
 +
<br>On CERT-AUTHORITY computer create a key pair using.
 +
<pre> $ umask 77  # you really want to protect this :-)
 +
$ mkdir ~/my-ca && cd ~/my-ca
 +
$ ssh-keygen -C CA -f ca
 +
</pre>
 +
<br>STEP 1 : Copy the ca.pub key to /etc/ssh/ca.pub of the SERVER computer . Change the permission of ca.pub to 0644 with <pre>$ chmod 0644 ca.pub</pre> .
 +
STEP 2: Still in SERVER computer edit the servers /etc/ssh/ssh_config and add the following line at end of file. Then  save and restart your  sshd server with command line and validate its properly configured  :
 +
<pre>  $ sudo edit  /etc/ssh/sshd_config
 +
      add at end of file : TrustedUserCAKeys /etc/ssh/ca.pub
 +
      in openssh 8.2 it seem the certificate sign with RSA is not consider secure enough.
 +
      Either you use the CERT-AUTHORITY with an other encoding.
 +
      Or to keep same certificate you need to add RSA to the list of approved encoding:
 +
      CASignatureAlgorithms ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa
 +
      save sshd_config.
 +
      $ sudo service sshd restart
 +
      $ sshd -T </pre>
 +
STEP 3: Re-do these 2 steps to any other server you want to recognise the certification credentials using ca.pub key.
 +
<br>
 +
<br>STEP 4: moving to USER computer.
 +
<br>
 +
<br>STEP 5: Creat user key set by repling to questions with following command. You can use a passphrase if you like and you can name your key if you want . Never replace an existing one. You cant move the key afterward to default key directory or  define a location of your choice direcly via following command question answers. :
 +
<pre>$ ssh-keygen -t ecdsa </pre>
 +
STEP 6: I use gimisa-I7 as key file name in step 5 to identify my user in gimisa-I7 laptop. I copy it afterward in ~/.ssh directory of my user in USER laptop. 
 +
<br>
 +
<br>STEP 7: I copy gimisa-I7.pub key created above to CERT-AUTHORITY computer where  ca and ca.pub key are .
 +
<br>
 +
<br>STEP 8: I sign the gimisa-I7.pub key with the ca key  where:
 +
<pre>  -s ca is the key signing it. 
 +
        -I is any identification you want to give it . That id will appear in SERVER logs.
 +
        -n is very important and identify the server side user under which the client will log in .
 +
          That user most exist in SERVER computer. and be restricted user to the task of interest.
 +
          Since the certificate can be use for many server/user -n can be followed by name1,name2,name3.... 
 +
        -V is validity of certificate in exemle 52 weeks but h for hours can also be presented.
 +
        -z is serial number and
 +
the command end with the name of the key to be signed.
 +
The result will be gimisa-I7-cert.pub in my case:
 +
 +
        $ ssh-keygen -s ca -I CA4gimisa@106  -n proxy_user -V +52w -z 106001 gimisa-I7.pub </pre>
 +
step 9: Inspect the certificate to see if its per your specification :
 +
<pre>$ ssh-keygen -Lf gimisa-I7-cert.pub</pre>
 +
step 10: Copy back the certified key to USER computer ~/.ssh . You need at least the user private key and the certified public key in default  ~/.ssh or in whatever directory you choose in USER computer for ssh connection to work. Also the user ssh command will search ~/.ssh with name starting with  id_ and the encoding use ( in our case id_ecdsa ) for private AND certificate public key. In order to use a key set name differently one must specify the location of the key with  -i /path/to/mykey. In my case :
 +
<pre>ssh proy_user@server -i ~/.ssh/gimisa-I7</pre>
 +
step 11: now that you are confident that you can access your server without password you can remove the password option . To do this back to SERVER, :
 +
<pre> $ sudo nano /etc/ssh/sshd_config
 +
$ find and change or create line with :
 +
ChallengeResponseAuthentication no
 +
PasswordAuthentication no
 +
$ sudo service sshd restart
 +
$ sudo sshd -T
 +
</pre>
 +
</blockquote>
 +
----
 +
<p id="SOCKS">SOCKS ( revised 2021-03-24 )</p>
 +
<blockquote>
 +
SOCKS is an Internet protocol that exchanges network packets between a client and server through a proxy server.  This article simple point to some experimentation I have done so exchange between viewer and opensimulator is securised. One not familiar with the use of secure shell can read above articles. I would like in this one to peek a look at viewer to opensim exchanges. The description address here only exchange between a  grid and simulator part of local LAN and  exchange  with  a viewer located on the web.
 +
<br><br> My experimentation proposed here is  using secure shell tunnel . What is interesting is that the viewer I tested ( singularity , cool viewer and firestorm )  has socks 5 capabilities available in preference settings . And at least in ubuntu its easy to make a  socks 5 ssh tunnel  proxy 
 +
<br><br>At the origine socks proxy were proposed in viewer to help get accross firewalls. The idea is that a  channel is open through the firewall toward a server accessible to deliver the viewer communication exchange. The same way that someone in an hotel location where communication is not safe use a ssh encrypted proxy tunnel to connect to his office.
 +
<br><br>What is fun when you do that is that the tunnel is encrypted from end to end of the ssh tunnel. If the other end of the tunnel is a openssh server  located directly within the LAN of the grid and simulator server,  you in effect have a complete secure path from viewer to grid. This true exacly on the same principle that you can connect your own viewer inside your LAN  to your own grid. What is happening in both case is  that the code socks request is sent to the local end of the ssh tunnel. That local end decode it as local viewer request.  Now you local modem is seeing a  LAN and request to the public/internet IP address. In that case reverse NAT handling of your modem will connect  you viewer request directly the local  opensim server. That late exchange is totaly located inside the LAN. The reply take the inverse route. The opensim server send its reply to the local ssh socks proxy which encode it to sent it back to remote viewer at other end of the tunnel. 
 +
<br><br>So in the case of my ubuntu USER laptop I create a ssh socks 5 proxy with this command line: <pre> ssh -4 -v -f -N -D 10000 proxy_user@3d.gimisa.ca -p xxxx -i ~/.ssh/gimisa-I7
 +
    where -4 is ipv4,
 +
    -v is for verbose,
 +
    -f is for force continue running,
 +
    -N is not to expect other command
 +
    -D is for creating dynamic port handling.
 +
    10000 is the port selected for socks  ( could be any free one ) and
 +
    -3d.gimisa.ca is how to reach the other end of the ssh tunnel domain
 +
    -p xxxx port use to connect to ssh.
 +
</pre>
 +
Its important that your sshd server be configured for proxy only with the specific user selected in the certificat creation step above as you dont want him to wander around internaly in your LAN. For proxy purpose user can be created as follow in sshd_config:
 +
<pre>Match User proxy_user
 +
        AllowTcpForwarding yes
 +
        X11Forwarding no
 +
        AllowAgentForwarding no
 +
        ForceCommand /bin/false
 +
</pre>
 +
The local proxy did work fine when tested with firefox or google chrome browsers as well as with curl terminal command. But I was disappointed cause the socks5 I tested setting  on  singularity coolviewer or  firestorm failed to connect to LOCAL socks5 proxy with an error message about TCP connection.
 +
<br>ref https://github.com/singularity-viewer/SingularityViewer/blob/master/indra/llmessage/llproxy.cpp 
 +
<br><br>So that was bad news until I found that its possible to run ANY linux command line application through socks with the help of tsocks ( standing for terminal socks ).
 +
<br><br> 2021-03-24: But the following indication does not work anymore for logging to opensim 092 grid. Sorry !!
 +
<br><br>So I remove the socks setting from firestorm.  Then  I installed tsocks and set tsocks configuration file tsocks.conf in LOCAL  /etc directory  to point to the LOCAL socks proxy commenting out path as not required and  changing the following two lines to local socks server.
 +
server = 127.0.0.1 server_port = 10000 .
 +
<br><br>So using the same socks local tunnel still  running I am starting firestorm in terminal  with following command:
 +
<pre>$ tsocks bash firestorm</pre>
 +
This is a perfect solution for a close grid where everything happen between user viewer computer somewhere on internet and grid domain. Where you want total encrypted communication from user to grid.
 +
<br<br>
 +
Please note that HG visitors would be falling outside the encrypted coverage .So that what would happen too when you support simulator outside the grid domain unless you do proxichains yet to be tested on my side.
 +
ref : https://www.binarytides.com/proxify-applications-with-tsocks-and-proxychains-on-ubuntu/
 +
<br><br>
 +
But that protection as effectively encrypted as it is for the COMPLETE exchange of opensim has a cost. ALL the exchange with the grid is channel through the socks tunnel. Which is adding a layer on top of the grid work itself.
 +
</blockquote>
 +
----
 +
<p id="ANIMESH">ANIMESHS</p>
 +
<blockquote>
 +
Is the possiblitity to animate a mesh object. Mainly use to animate attachements but can animate any rezed object. This dicussion here is to discuss the difference between RLV , NPC and ANIMESH to animate, move and control a inworld elements. In this case rerspectively an alternate avatar in restain love viewer control (RLV) , a non playing character  ( NPC )  or an MESH object (ANIMESH).
 +
<br><br>
 +
I will not repeat what is presented in second life http://wiki.secondlife.com/wiki/Animesh_User_Guide  . I will rather dwell in  from the article presented in hypergrid business  https://www.hypergridbusiness.com/2019/10/new-opensim-release/  . It states that animesh is something between an object and a NPC . I would argue that its an object with additional charasteristic between RLV and NPC . For those of you not familiar with both there acronims please see definition links on top of this page.
 +
<br><br>
 +
A RLV is an alternate avatar. A NPC is a rezed avatar and a ANIMESH is a rezed animated object.  An animesh is rez on the region like an object. As an object You can attach two to any of your bones. You can  link it with other prims to make a complete construction. You can use object script command on it.  Animesh MESH is created by weight painted a mesh to an opensim armature via software like avastar  and uploaded the same way you do weighted clothing and avatar you download to wear. That is how  it can use standard  animation.
 +
<br><br>
 +
RLV is abviously created by creating an other account. NPC is created by copying an avatar apparence. NPC and RLV are physic so they react to physic engine use in the simulator. ANIMESH as attachment is physical.As an  object it can be make physical or phantom.  RLV and NPC  possess  a profile. They can issue IM , and have Animation Override  ( AO  )  with default animation  define for  fly walk sleep and so on.
 +
<br><br>NPC have 25 dedicate opensim script command to create move run  fly say sit  touch and control your NPC. While RLV have fewer commands to control them. As avatar RLV can move between region and be teleported anywhere. A NPC  cannot cross boarder neither be teleport out of their original region of creation and will deseapear on restart of the region .  Animesh should be able to cross region as object. \ldo ANIMESH have 3 specific script for animation. 
 +
<br><br>
 +
Please refer to my inworld REX compagnion dog where  you can compare between the three flavor . The new ANINMESH should work fine in BULLET and UBODE physic in opensim version 0911 and up. Rex mesh is link to a prim to give it physical stability. It uses vehicle script to move. I find that  the vehicle action  is not as refine  as NPC  move and the lack of AO give a poor transition between animation.
 +
<br><br>
 +
With ANIMESH it can be hard to combine multiple separate animated  links in one creation. For exemple REX can be leashed to follow up his master. Something easy to do with RLV , a bit more difficult with NPC. Also easly done if you attach the ANIMESH to the avatar. But getting more complex as animated linked object. The leash work with the colar fit to the dog. With NPC or RLV the colar  need simply be attached to work fine. In ANIMESH it  need  to be weighted to the armature.  I believe its best that the colar be part of the dog instead as being link as a separate mesh. ( not tested )
 +
</blockquote>
 +
----
 +
 +
<p id="YENGINE">YENGINE (update 21-07-27)</p>
 +
<blockquote>
 +
Yengine is presented in article in Hypergrid business https://www.hypergridbusiness.com/2019/10/new-opensim-release/ and mention in opensim release notes http://opensimulator.org/wiki/0.9.1.0_Release . Since opensim 092 Yengine has a documention page ref: http://opensimulator.org/wiki/YEngine . In addition to XEngine capabilities YEngine has a better compilation and memory managment allowing memory to be release after script execution.  Please note that scripts in opensim are limited via opensim.ini configuration to ScriptStackSize = 2048 ScriptHeapSize = 1024 per scripts. Also Yengine can be specified with the first line of the of the script as //YEngine:lsl . Since 092 YEngine also offers yoptions. With this keyword  ( yoptions; ) in second line of script the YEngine offer additional redirection instructions  ( switch,break,continue, try catch and finally,constant,short circuit AND and OR). The cost of using these option is that the keyword itself yoptions: if present in your script will break compatibility with XEngine. Meaning that a compile error will happen on the second line of your script containing yoptions; when compiled using XEngine default. ( see OSL article for more info on using both scripting engine in same object) .
 +
<br><br>
 +
XENGINE is the existing default scripting engine for OSL and LSL function as of 0911. The region default engine can be specified in configuration file.  YENGINE is available if configured in simulator as alternate to XENGINE or as main engine. YEngine can also be specified with the first line of the of the script as //YEngine:lsl but the purpose is defeated since XEngine and YEngine cannot be allowed on same simulator.  YENGINE is ALMOST fully compatible with XENGINE. Scripters must be aware that LOCAL variable are not compiled the same in XEngine and YEngine on version 092. In C#  the language under X or YEngine, a local variable is usualy local to the bloc it is define in.. So for exemple:
 +
 +
<pre>
 +
If( true ) {
 +
    string Local="valueInIf" ;
 +
    llSay(0,Local): // will say valueInIf
 +
}
 +
string NewLocal = "valueOutOfIf"
 +
llSay(0,NewLocal): // will say valueOutIf
 +
</pre>
 +
 +
In YEngine the above will compile properly . In XEngine this will generate an error . So for certainty scripters should both create and compile scripts as usual in XEngine then swtich to YEngine to do one more compiling in YEngine to make sure they work in both the two environments.
 +
     
 +
 +
Existing  XENGINE script can be complile in YENGINE. But YEngine is more strickly compliant with C# and error might pop out that have to be corrected. The reverse is also true given correctng error and omiting the use of yoptions. As recommended above its best to compile existing and new script in both script engines. And unless validated in both environment there is difficulty for  script to pass through region with different script environment.
 +
<br>
 +
<br>
 +
Knowing which scripting engine environment the script is acting in  with help of osGetScriptEngineName() is NOT available to every one with script rights anymore in version 092. So its getting more difficulty to know specialy if the region is not per standard OSL rights . On way to find what function is available to use is to test it .  On a XEngine environment a OSL function not available to owner will spell an error in debug channel and cause the event to fail. Using of timer is possible to detect that situation and act accordingly. In YEngine environment the same event will freeze the entire script and require manual reset. In YEngine the use of try/catch function allow detection of that situation with keyword detection of error message.But the try / cacth feature does not compile in XEngine. So two scripts are now required to validate / use a osl function . One with XEngine timer and the second with YEngine try /catch. Using a link message to test the function you need will allow your script to run properly in any of the two situation .  I have done one such testing twin script available in your friendly gimisaOS store see osl function article for details.
 +
<br><br>
 +
Please also note that YEngine and XEngine cannot be enabled at same time . You have to watch opensim.ini config statement in [Startup] section  select  DefaultScriptEngine = "YEngine"  make sure its the YEngine that is selected.  Also  [XEngine] section make sure  ; Enabled = false then in [YEngine] select ; Enabled = true .
 +
 +
</blockquote>
 +
----
 +
 +
<p id="BAKE ON MESH">BAKE ON MESH</p>
 +
<blockquote>
 +
Is a new feature presented with 09 opensim version where one could transfer the standard textured clothing from the avatar standard body to the avatar mesh body he is wearing.
 +
<br><br>
 +
In 2016  people started  to wear Lara mesh body. That early mesh body was using appliers to provide for apparence modifier of the mesh body. It had a draw back that you would start by rezing nude in a region then clothing would be added on as you woould be rezing. A friend came to me asking if I could do something for body that would not appear naked. So I did  rigged and a fitted FEMALE body consisting of a two layer body. The two layer idea was so that you could wear your skin on one layer and any basic underwear on the second layer just like one do with standard bodies.Those layer were compatible with standard paint on clothing so you could wear any clothing that was using standard texture like  shirt coat, pents or tattoos.
 +
<br><br>One feature my friend ask me was to use a hud so she was able to transfer to the mesh body  any standard textured clothing she was wearing. on her STANDARD body shape. She had quiet a collection of clothing and was despointed no to be able to use it with her new body shape.  So did I do her a hud to do so. It was taking anything she was wearing as skine,underwear, tattoos, skirt , pents , shoes and would paint it back on the mesh body I did for her.
 +
<br><br> Well three years later that feature is now an integral part of the viewers where you can copy all the textured clothing you wearing on your standard body to a mesh body compatible with standar body UVMAP.
 +
<br><br> You start by wearing all you want in term of standard textured clothing on your standard avatar.Then you attach a compatible mesh avatar made with standard UVMAP. Edit it like an object.  Edit  face and select  head , upper or lower body part . Instead of the standard inventory use the bake tab and select the corresponding head,  upper or lower body part where you will now apply the corresponding combination texture. The corresponding standard body portion will deseapere like if you had applied alpha to it and the mesh body portion will be textured with the conbination of texture corresponding to your selection.
 +
<br><br>
 +
What is greate about that is as it was with my own hud is  that any old textured clothing that is still in your wardrobe and was either your doing or sold to you  could be use to bake on you new mesh body. The  mesh body I did is still available in store in gimisa5 but now with this new feature you dont need the hud. I did test successfully the 6 original baked layer namely :
 +
<br>BAKED_HEAD, BAKED_UPPER, BAKED_LOWER, BAKED_EYES, BAKED_SKIRT, BAKED_HAIR . I know my mesh model dont work with the new added bake layer namely:
 +
<br>BAKED_LEFTARM, BAKED_LEFTLEG, BAKED_AUX1, BAKED_AUX2, BAKED_AUX3 .
 +
<br><br> If you prefer to test with  a much better opensource for opensim mesh body you can get Roth2 and Ruth2 from the following location: https://github.com/RuthAndRoth/Ruth . Or one can also work with machinmania ( avastar ) available bento model here : https://blog.machinimatrix.org/avatar-workbench/ .
 +
</blockquote>
 +
----
 +
<p id="LOG">LOG</p>
 +
<blockquote>
 +
Have two meanings. Action of connecting to a server. Noun meaning record of actions. Both meanings are applicable to opensim. This paragraph is about recording actions in opensim . The recording of server execution is made with the log4net. log4net is documented here: https://logging.apache.org/log4net/  . Its xml parameter are found in OpenSim.exe.config  and Robust.exe.config files in opensim distribution.
 +
<br><br>
 +
Level of logging appender and the like can be configured in these files as describe here http://opensimulator.org/wiki/Logging . The default logging provided with execution record presented in console and saved in OpenSim.log and Robust.log . Since I use multiple instance of OpenSim.exe and Robust.exe this logging definition is not enought to a proper monitoring of the servers operation. I prefer  a file per instance identified per instance and created per day of execution.
 +
<br><br>
 +
There is a few ways to do this but the following propose mine. First I use the appender defintion in the exe.config file. The appender default is as follows:
 +
<pre>
 +
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
 +
      <file value="OpenSim.log" />
 +
      <appendToFile value="true" />
 +
 +
    what I use is :
 +
 +
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
 +
      <file type="log4net.Util.PatternString" value="log/OpenSim.${logName}" />
 +
      <rollingStyle value="Date" />
 +
      <datePattern value="'.'yyyy-MM-dd"/>
 +
</pre>
 +
The change will create log file in log sub folder and append the date to the file name to create a new log file per execution day. I need to have a different name per instance. I use the execution command to start the server in the following mannner.  Where "logName" is use to define the log as per following:
 +
<br><br>
 +
<pre>
 +
 +
logName="THIS-INSTANCE"
 +
export logName
 +
 +
screen -h 9000 -amdS screenName mono  OpenSim.exe -inidirectory="./configTHIS-SERVER"
 +
</pre>
 +
The logName  provided in export is use to create the log file per value="log/OpenSim.${logName} . The inidirectory directive is use to define specific parameter not relevant in this discussion . Please see following link for detail on that directive.  http://opensimulator.org/wiki/OpenSim.exe_Command_Line_Options
 +
</blockquote>
 +
----
 +
<p id="CONFIGURATION">CONFIGURATION</p>
 +
<blockquote>
 +
Opensim is very modular and each created  module provides means to configure its features by way of reading parameters in files. The standard files used for that purpose are OpenSimDefaults.ini  OpenSim.ini  Robust.ini. Robust.ini is dedicated to Robust.exe and OpenSim.ini is dedicated to OpenSim.exe.  The OpenSimDefaults.ini has all opensim default value for OpenSim and is left as is.  In regards to Robust.ini see my paragraph on Robust.  An interesting characteristics of opensim is the preference of parameter specification mainly use for simulator parameters. The config-include directory provid a three level of supperseeding parameters from OpenSimDefaults.ini .  OpenSim.ini and ./config-include files. The include instruction in  [Includes] section of file provides for the chain of supperseeding file set. 
 +
<br><br>
 +
To explain this lets edit OpenSim.ini and modify  the [Startup] module by adding a  new parameter  specifiedFile = "OpenSim.ini" .  The OpenSim.ini specifies the architecture in the last line of the file. This exemple use hypergrid architecture. The next file you edit in the specification chain is located in config-include directory as GridCommon.ini . Lets add there too by modifying by adding a [Startup] module specification with new parameter  specifiedFile = "GridCommon.ini" .
 +
<br><br>
 +
Now we run OpenSim.exe in usual way and get the test parameter specifiedFile by using config show Startup.  You should find specifiedFile and obtain GridCommon.ini.
 +
<br><br>
 +
In my grid, I am using OpenSim.exe command line option -iniconfig  in running my OpenSim. This option allow me to have a third lever of file specification to customise each regions . To illustrate I am adding a [Startup] specifiedFile = "regionX.ini"  in this new file located under  -iniconfig ./config-regionX . And now find that the Startup parameter for specifiedFile is regionX.ini . This clearly presents the supperceeding of that last files parameter reading over any other specification of the same parameter done in previous file.
 +
<br><br>
 +
Lately in opensim 092 issue nov 21 2021 I got problem with this way of doing things related to scrips and  IMs.  I notice that [XEngine] , [YEngine] , [Messaging] and [Groups] specified in GridCommon.ini did not superseed the orginal one in OpenSim.ini using same methodology as above. If you already using OpenSim.ini direcly to specify these group you are not affected by this problem. In my case I am adding the prevaling values using -iniconfig command line option in ./config-regionX directory . ref: http://3d.gimisa.ca:9090/static/config.html
 +
</blockquote>
 +
----
 +
<p id="COPYBOT">COPYBOT</p>
 +
<blockquote>
 +
I am rather dispared. Someone came to me with a copyright claim.  As an honest grid owner I have no clue what to do . !!! I did delete it from my regions but then what?
 +
<br><br>
 +
In opensim the creation process start in a region of a simulator. It includes rezzing any of 13 predifine prims from the building tool.  It also includes downloading assets to inventory like texture animiation sound and mesh.  In both case the newly addition creator is define. A creation would be limited if you could not combine those different elements into an object . That object call a link set in opensim is defined by its root prim .
 +
<br><br>
 +
Since in  opensim creation is actualised as database table entries, we can study the creation process on the database stand point .  So rezzing any of the 13 predifine prims inworld creates an entry in the  simulator prim table. That entry key is the UUID affected to  that prim. When the linkset is created the root prim link UUID is affected to all the other link of the set as sceneGroupID. You can get sceneGroupID by right clic on the object and copy the key to see it.
 +
<br><br>
 +
The data store in the simulator database is not permanent. If you take the object offworld it will be erase from the simulator database.  It then become an asset in you inventory object folder. We will leave aside if you create or modify a script or modify a notecard in you object or if you store a prim in one of your creation prim. 
 +
<br><br>
 +
In term of database taking your creation to inventoy produce a new entry in the inventoryItem table and in the asset table. Those two tables are part of the database accessible to robust process. A unique assetID is attached to you created object in both those table. The inventoryItem table keeps a record of you current inventory of all avatar. In my case, with FSasset,the asset table contains a pointer to a gzip file in my file system of all the data necessary to retrieve your creation. 
 +
<br><br>
 +
Now let say someone else grab your creation. It get in her inventory and creates an entry in asset table just like the creator first and subsequent modifications.  Deleting a creation of your inventory remove that entry in the database inventoryItem. Reference to your creation still exist if other avatar have obtain a copy of your creation. To get rid of your creation in my grid would mean that I  scan the whole inventoryItem table to clear your creation. But all in all as you might have notice the asset table still contain pointers to  all the creation ever made and modified in the grid.
 +
<br><br>
 +
Michael Lorrey presented both in opensim community conference ( OSCC )  2019 and 2020 the idea of using bitchain to secure creation in opensim. Crista Lopes (Diva)  published a post on april 2020 ref here http://www.metaverseink.com/blog/hypergrid/content-protection-an-incomplete-proposal/ to allow to support Digital Millennium Copyright Act (DMCA) claims to grid ownsers.  Diva contemplate a database implementation of bitchain like record of all transaction on a given creation.  Diva article highlights the difficulty in implementing a database solution to tracking transactions.
 +
<br><br>
 +
As presented by DIVA the honest grid owner has no way to know before hand that a given creation is factice. His act is dependant on a DCMA claim. And the killing difficulty for the grid onwer is that opensim does not offer any tool that would help him chase the offending creation.
 +
<br><br>
 +
A Grid owner need to act on centralised inventory and asset content. But tracing the numerous entry made for a creation is difficult as pointed above. Unless the grid is a close grid opensim make matters even worst by the distributed nature of the simulator database portion of the grid. It become an impossible task to remove inworld offending object already rez in regions of opensim whose database are attach to distributed simulators.
 +
<br><br>
 +
If bitchain like record not a solution would a key pair like used in ssh be one. The idea is to revisit the creation and permission system to use key pair.  That is to be able to download an item in a grid the creator would have to provide a public key kept by the grid owner. The creator keeps the private key. An exchange just like use in ssh connection is happening to allow the creator access to rez a prim. I mean there  is no check to rez a copy of an existing creation as long as the public key is in the grid owner hands.  God mode and the like tools would not have access to that key. The object whos permission is changed after creation would need validation by the creator private key and only him could make that change not the owner of the object. Naturaly any grid owner could fiddle with that too. So as Diva mention we have to clearly identify honest from dishonest grid owner.
 +
<br><br>
 +
Would that work for hypergrid. In one scenario the public key  cantd be exported to other grid. So the creator has to register to any grids he want his creation to be accessible by providing his public key to allow object transfer. The trust chain is one between creator and grid owner.  That would be a forward looking way to lock out factice object. But nothing would prevent somenone to register with a grid as a creator and import copybot stuff. But honest grid owner could act on DCMA complain and easly identify the offender in database with his public key and act accordingly. Then removing the key itself from his records so it cant be use anymore to import stuff.  That does not eliminate simulator from having offending asset but would prevent taking that object to inventory for any users. 
 +
<br><br>
 +
On a second senario hypergrid visitor can get object from an other grid even without public key of creator available.  Which would lead to actual situation and defeate the purpose greatly imparing hypergid exchange. Web market would have to  follow same rules and only allow selling to approved grid by creator.
 +
<br><br>
 +
The problem of trust is very difficult to solve unless there is a flip side mechanism. There is great tooling in opensim to allow one to create things but nothing allow a creator to remove his creation from a grid. The key pair could be made to allow that and provide a deletion mechanism to registred creators. A creator in possesion of the appropriate private key should be allowed the tool to remove his creation from a simulator or from an entire grid.   
 +
</blockquote>
 +
----
 +
<p id="WELCOME">WELCOME</p>
 +
<blockquote>
 +
This is to explain how to configure a region of your grid as the welcome landing either for local and optionaly for HG visitor separatly. Those happen in robust.ini as its a grid setting. This is helpfull for people that want to visit your grid by searching its URL or as default home people for local user. 
 +
<br><br>So edit robust.ini file and find the [GridService]. It works with specify one region name as follow Region_regionName ( its better that that region has no space in its name ). Then the parameter is set by keyword as follow with exemple in my grid :
 +
<br><br>
 +
Region_gimisa3 = "DefaultRegion, FallbackRegion" ( this is for both local and HG unless you specifiy following)
 +
<br>
 +
Region_rose = "DefaultHGRegion"
 +
</blockquote>
 +
----
 +
<p id="PROBE">PROBE</p>
 +
<blockquote>
 +
In my case I use a prim sphere that I rez and put red so I can spot it easy.  And name it probe. I use it in order to locate a script that reply with an error in log file . <br>The YEngine compile error in my case present itself  like this :
 +
<pre>2021-05-16 15:34:14,860 WARN  - OpenSim.Region.ScriptEngine.Yengine.XMRInstance <[YEngine]:
 +
reduction errors on dtHxl9noi5mwBG0JSHm4KwRHA7RN4aRnMzaxypcFeE6 (asset://d54c8d46-92f6-404e-aa22-e82dd723ebf0)
 +
2021-05-16 15:34:14,861 INFO  - OpenSim.Region.ScriptEngine.Yengine.XMRInstance [YEngine]: - <98.07865, 88.19283, 21.24479> Primitive:New Script
 +
2021-05-16 15:34:14,861 INFO  - OpenSim.Region.ScriptEngine.Yengine.XMRInstance [YEngine]: - (5,7) Error: invalid operator
 +
2021-05-16 15:34:14,861 INFO  - OpenSim.Region.ScriptEngine.Yengine.XMRInstance [YEngine]: - (6,24) Error: expecting arg type
 +
2021-05-16 15:34:14,861 INFO  - OpenSim.Region.ScriptEngine.Yengine.XMRInstance [YEngine]: - (7,4) Error: <br>looking for var name, type, state
 +
or default, script-defined type declaration
 +
2021-05-16 15:34:14,861 INFO  - OpenSim.Region.ScriptEngine.Yengine.XMRInstance [YEngine]: - (8,0) Error: <br>looking for var name, type, state
 +
or default, script-defined type declaration
 +
</pre><br>
 +
The error as spell out above is about a script name "New Script", in line 5, 6 7 and 8. In a prim call "Primitive" . The asset uuid provided in the error message  is no help to find the object inworld. But the location is very usefull  <98.07865, 88.19283, 21.24479>. To use it ,  I copy the location including "< >" from the log file. Then InWorld,  I make sure I zoom on the probe object to follow it when it moves. ( camera constrain off ) . Then I edit my probe location and hit the lower coordinate p button the one in front of inworld Z coordinate . The probe now moves at the location of the problem prim . I edit linked part and clic on the prim near the probe that happen to be named "Primitive" . Check content and find  the "New Script". Correct the error et voila!! 
 +
</blockquote>
 +
----
 +
<p id="MULTITHREAD">MULTI-THREAD</p>
 +
<blockquote>
 +
What does it mean for a script. Most script works with events . A trigger that starts its action . Like touch , sit, timer, listen. Once trigger the script goes on one step at the time through its application to the end of the event in question. Then wait for or execture the next event and so on.
 +
<br><br>Is it multi-thread. You dont know as that depends how the underlying execution is performed by opensim. But regardless,  could I improve performance by writing a script task so splitted in smaller scripts instead of a main one.
 +
<br> To answer that I invite you to an experimentation . I did a loop count down of 100,000,000 as the MAIN thread . The time to exicute it on my system with no one on an empty sim for my  main thread of  100,000,000 count down , resulting time  is 14.158000 . When that is done, the main I script sends a Message_linked to start three scripts.  All those three script ( slave ) are splitting work and each  counting down from 33,333,3333 . The result is presented bellow. What do you expect respectively. Rolling drums . About  15 / 3 give or take 5 sec ya??
 +
<pre>
 +
main 100,000,000 time 14.158000
 +
2-slave 33,333,333 time 7.255000
 +
1-slave 33,333,333 time 7.196000
 +
3-slave 33,333,333 time 7.305000
 +
</pre>
 +
Oups 2 secondes error ??? One could think the difference ( 2 sec ) is due to some overhead . But then counting to 1,000,000 / 3 would also lag by about the same amount ( 2 sec ) from the slave count to the main total count /3 . And its not the case. See:
 +
<pre>
 +
3-slave 3,333,333 time 1.142000
 +
2-slave 3,333,333 time 1.125000
 +
1-slave 3,333,333 time 1.141000
 +
main 10,000,000 time  2.117000
 +
</pre>
 +
But interestingly it take about half time to run a third of the count compare to main time. Does that hold.
 +
<pre>
 +
main 100,000,000 time 14.102000
 +
6-slave 16,666,667 time7.216000
 +
5-slave 16,666,667 time7.229000
 +
3-slave 16,666,667 time7.171000
 +
4-slave 16,666,667 time7.177000
 +
2-slave 16,666,667 time7.141000
 +
1-slave 16,666,667 time7.142000
 +
</pre>
 +
Ya. So its not very efficient to do multi task a count down split in six does not give 6 time less.Nor a count down divided in 3.Checking for 2. We get again same timimg . My test is done using YEngine. The result can be better understand from following reference, YEngine executes script events using preemptive multitasking.
 +
This means that, at certain control points or when told, a script may release execution, being placed on a queue waiting for its turn to execute again.The released execution thread goes on processing other scripts. So that looks like time slicing already. ( http://opensimulator.org/wiki/YEngine )
 +
<pre>
 +
main 100,000,000 time 14.195000
 +
2-slave 50,000,000 time7.290000
 +
1-slave50,000,000 time 7.349000
 +
</pre>
 +
So ya whatever the split 2,3 or 6 we get same timing saved that is about half of what one task would have result with. And that is regardless of the task at hand . Counting down to 10,000,000 or to 100,000,000. So splitting you script work into smaller scripts has some merit but  a lot damped by the preemptive multitasking YEngine does. That is  when the work in question is purely computer dependant. If on the other hand what your doing has to wait for say user input. Then splitting it might then be advantageous. The old say do it for the user takes all its value here.
 +
</blockquote>
 +
----
 +
<p id="SOURCE">SOURCE</p>
 +
<blockquote>
 +
How to access the source code of opensimulator is a question you might have.
 +
<br><br>
 +
You can download the source  current and older file set from  http://opensimulator.org/dist/  . One you have unzip it to your work folder you have to pre-build it to create the "solution" files . The pre-build is straight forward running the "runprebuild.bat" or "runprebuild.sh" depending if you are under linux or window.Then build the binnary files using nants  and run the application as explain in the source files. You can also take a look at any of the files using a standard text editor opening each and every of the many .cs files . You can find specialised text editor that will highlight the .cs syntaxe . But that is very tedious and impossible to use for exploration / debuging for a large project like opensimulator.
 +
<br><br>
 +
To have look at the source coding itself I am using monodevelop for ubuntu. Available in ubuntu 18.04 its not updated anymore but Still working in ubuntu 20.04 see here ( https://ubunlog.com/en/monodevelop-ide-instalacion-mediante-ppa/ ) With monodevelop you can open the C# opensim.sln solution  file that will show the complete project C Sharp application tree. With monodevelop You can modify build run and debug the solution tree and appreciate all the work put into opensimulator virtual reality.
 +
<br><br>
 +
Since ubuntu 20.04 you can also get microsoft freely provided visual studio CODE . This app will allow to open solution file. I followed the instruction provided in this web page to get it working under ubuntu 20.04 ( https://linuxize.com/post/how-to-install-visual-studio-code-on-ubuntu-20-04/ ) . Once that is done you will need to install vscode explorer to see the solution tree the way monodevelop presents it . ( https://marketplace.visualstudio.com/items?itemName=fernandoescolar.vscode-solution-explorer  ) . BUT you CANT build your /bin DLL with visual studio code . As explain in this web page ( https://code.visualstudio.com/docs/editor/tasks ) .  Nant is your choice , using virtual studio CODE as an upgraded text editor to modify the .cs files via the solution tree. So debuging in these condition is hard.
 +
<br><br>
 +
Using  microsoft window environment is possible.  First get the "free" microsoft visual studio (https://visualstudio.microsoft.com/vs/pricing/) . If you use virtual studio make sure to  select the C# package while you complete your installation. I notice that you can open the opensim "project" direcly from opensim source.  But doing so created more trouble then running the runprebuild.bat provided with opensimulator source. Once the solution tree is created you can open the OpenSim.sln solution file . Using visual studio afterward is very similar to monodevelop where you can edit debug and run the code source.
 +
</blockquote>
 +
----
 +
<p id="HOSTING">HOSTING</p>
 +
<blockquote>
 +
Hosting your virtual world and running you opensimulator is a no brainer with dreamgrid. https://outworldz.com/outworldz_installer/Grid/  Dreamgrid is an installer providing a web server with associate opensim helper function. It also provide database support and opensim dll and execute files . Its an opensource project with source here https://github.com/Outworldz/DreamWorld . Source is licensed as AGPL 3.
 +
<br>Mister blue also offers a docker that simplifies opensim server installation. His project is opensource too at https://github.com/misterblue/opensim-docker/ with Apache License 2.0. I am not familiar with using docker. But a few years ago I did a virtual machine base on Virtualbox https://www.virtualbox.org/ . Using it  I tested an opensim deployment for a full grid with grid.metaversedepot.com and a region in hg.zetaworlds.com. The idea of both Docker and VirtualBox is to simplify software deployment by including its environment in the distribution files. It allow user to run an application in a preset machine that one can deploy on any system. In the case of VirtualBox . One have to install the VirtualBox application either on window linux MAC and solaris.  Then to download and run the virtual box file predesign for opensimulator.
 +
<br><br>
 +
Opensim technical requirment is proportional to the simultaneous visitor count you get compounded by the visible asset load. Contrary to belief you dont need that fast a cpu capability to handle opensim server if your visitor count is low. Most of the presentation job is done by the visitor viewer. What is important is the internet service speed your internet service provider is giving you. Specificly the upload value in mb/sec.
 +
<br><br>
 +
The difficulty to install opensim at home is mainly one of handling request by router.  NAT (Network Address Translation) is an issue.  Dreamgrid is helping you handle that and so is opensimulator see  http://opensimulator.org/wiki/NAT_Loopback_Routers . Grid owner should understand at this point that hosting at home mean becoming a server service, This service include a number of function provided by your computer. That needs your consideration as window personal computer is not a server software. Its not optimised for the task neither is it specifically secure for it .
 +
<br><br>
 +
I have been running opensim for over 10 years now at home with old computers. My internet connexion is 10MB/sec uplink . I am using linux ubuntu. I have a setup that includes three cheap dlink modem . One of which is dedicated to opensim server with its wifi service OFF. I host regular region size ( 256m x 256m ) that are serounded by water giving maximum viwer reach limit of  512m. The result is  I can receive 3-4 visitors simultaneous with acceptable lag as long as they are not too complex by themselves. I dedicate the 3 machines on same LAN exclusively to opensimulator . Most importantly free of personal or professional information. Full configuration can be viewed in configuration topic.
 +
</blockquote>
 +
----
 +
<p id="GRIEFER">GRIEFER</p>
 +
<blockquote>
 +
People that like testing you facility. They will do all sort of thing to attrack your attention to difficulies with your installation. In opensim you have different tool to help deal with those testers. The hard part is to identify them . One way to do that is by monitoring what they do in your region. I made a monitoring tool you can find in gimisaOS. One sure way to counter measure those visitors is with backups. OAR is a sure way to get back on your feet after a griefer visit. See above article on  OAR if you dont know what OAR means . Also for estate manager, I did a tool to remove these visitor once identified. But this tool only act once the griefer are log in. Contacting your grid owner is usefull. For local user  the grid owner can act to remove those avatar access. In addition they can modify the LoginService by adding the mac address of the machine use for griefing. For HG visitors grid owner can prevent those people to access the grid. First They need to be identified from log . Then entry the required identity characteristc in robust.ini configuration file GatekeeperService. Grid Owner will find the required griefer grid http data and Mac address found  in the log file when the griefer log in the grid.
 +
<br><br>
 +
Please note there is no reliable way to prevent smart hackers to access an opensimulator hypergrid world.  So as stated above backups is the best security measure you can deploy. 
 +
<br><br>
 +
<pre>
 +
[GatekeeperService]
 +
 +
    ;; If ForeignAgentsAllowed is true, make exceptions using AllowExcept.
 +
    ;; Leave blank or commented for no exceptions.
 +
    AllowExcept = "http://griefer.com:8002, http://enemy.com:8002"
 +
   
 +
    ;; If ForeignAgentsAllowed is false, make exceptions using DisallowExcept
 +
    ;; Leave blank or commented for no exceptions.
 +
    DisallowExcept = "http://myfriendgrid.com:8002, http://myboss.com:8002"
 +
 +
    ;; Allow banning via hashed MAC must be set in both [GatekeeperService] and [LoginService]
 +
    DeniedMacs = "YOURLONGMACTRSING ANOTHERMAC"
 +
</pre>
 +
</blockquote>
 +
----
 +
<p id="MODFUNCTION">MODFUNCTION</p>
 +
<blockquote>
 +
Detail reference is provided with http://opensimulator.org/wiki/OSSL_Script_Library/ModSendCommand and http://opensimulator.org/wiki/OSSL_Script_Library/ModInvoke . The first reference show how to  send a generic text command interpeted like a link message script to all MODFUNCTION  C# modules in the simulator . The second methode defines C# funtion  that can be called through the script like a predifine Script routine. The original work was done by justincc ref https://justincc.wordpress.com/2010/07/16/passing-data-between-a-script-and-a-region-module-with-modsendcommand/. For a simulator user adding a pre-programmed C# function is or rather was as simple as adding the corresponding dll file to the bin directory of the simulator. The file is pick up by the mono addin mechanism ref https://www.mono-project.com/archived/introduction_to_monoaddins/  and properly integrated in the routine calls. To be successfully running the MODfunction with  XEngine or YEngine must be activate with option:  AllowMODFunctions = true  in the respective script engine section.
 +
<br><br>
 +
Using monodevelop or visual study  one can create the source ModFunction solution  in C# .In order for the Modfunction to work as explain above one must take advantage of the mono addin mechanism. Taking the ModSendCommand from above reference as exemple of implementation . First create a directory call ModSendCommand under the addon-modules directory of the project source. Then create a subdirectory called Modules and a new file call prebuild.xml.  That file will contain instruction to assemble the solution with the opensim source. ( see exemple in link http://3d.gimisa.ca:9090/static/addon-modules.zip ) . Finaly under the Modules sudirectory create or copy from exemple for the modSendCommand.cs .
 +
<br><br>
 +
We then need to use the prebuild.xml we just create to add the content of ModSendCommand to the tree of our opensimulator source. To do so run the runprebuild.(sh or bat) file at the command line prompt in opensimulator source directory . Then use  monodevelop  to open the opensimulator source where you will find the newly added ModSendCommand solution including its reference directory. You can correct add edit remove the references from its directory as well as modify the source code as you need to implement your own version of ModSendCommand. Then proceed with build of the ModSendCommand source . Then run opensim project either in debug or relase mode taking care to edit your opensim.ini,  config-include and region ini file appropriatly. Inworld in the simulator region of interest create the script provided with the exemple and run it to see the usual "Hello World" greating message confirming everything works as plan .
 +
<br><br>
 +
Now  I notice under 092 that when I stop the simulator and restart it to join the region again to get greated one more time NOTHING WORKS. No error , the new module simply dont load. Its mot pick up at all by the mono addin mechanism. In OSCC2022 Ubit told me that for safety reason the MODFunction feature is removed . I notice in test that the addin mechanism creates a directory bin folder call addin-db-002 . A few subfolder down in the addin-cat is maddin files.  These include one maddin fle for each opensimulator module.  One of which is MyRegionModule,0.1.maddin  responsible for Justincc exemple of the hello world function. That name come from the modSendCommand.cs source file assembly declaration :  [assembly: Addin("MyRegionModule", "0.1")] .
 +
<br><br>
 +
Why talking about that maddin file? Because the solution I found to work around the problem is to delete the MyRegionModule,0.1.maddin and then restart the region simulator. When doing to the scrpt printing "Hello World" will work again until you restart the region once more. Creating a bash command deleting the maddin directory 1 each time you restart the region simulator is the simplest way I found to cure the problem.  I did the same exercise with modInvoke command and got the same solution to delete the corresponding ModInvokeTest,0.1.maddin file to get it to execute again after simulator restart.Since deleting the whole directory of mandin does not seem to create any issue I did proceed to remove that directory with the bash file then all the MODFunction integrated in the simulator work as expected.
 +
</blockquote>
 +
----
 +
<p id="NAT">NAT</p>
 +
<blockquote>
 +
Its a router feature that translate addresses to road map a bit like google map routing but convers only the next step. NAT LOOPBACK is of interest here. Its technically explain in ref (  https://community.tp-link.com/en/home/stories/detail/1726  ) Its effect applies if you run your opensim server localy to the router like me at home.
 +
<br><br>
 +
Taking my case for exemple . My server public address is 3d.gimisa.ca:9000  . And my region are spread accross many other ports . Changing my old DIR-615 router for a newer DIR-825 created a mess because now NAT LOOPBACK is not allowed. For someone like you reading these line access to my grid did not changed. But  for me behing on the local side ( LAN ) of the router I cant get a correct route from my router to access my own grid!!
 +
<br><br>
 +
Why is that so . To increase safety  modern router dont allow a NAT LOOPBACK. That is accessing to public  ( WAN ) ip address that redirect back in you local network ( LAN ). That is call a loop back for the network address translation. Preventing that loop back is blocks an intruder to you local LAN to access a local machine via a known server internet address. But if you want to serve your grid from home also mean taking this risk . There is ways to mitigate this risk by isolating your grid from user machines. see previous article here. 
 +
<br><br>
 +
So what to do depends on your grid setup. If its on only one machine running simulators (regions),  opensim server (robust) and viewer (firestorm) you could redirect calls to from yourself to yourself.  Please note this represents the higher risk in term hacking if your machine already have personal information. Anyhow its done with the host file on your machine. On Windows, open as administrator the hosts file, which is located under C:\Windows\System32\drivers\etc. On Mac and Linux, edit the /etc/hosts file using sudo for administator. Then specifiy the routing required. See for details (http://opensimulator.org/wiki/NAT_Loopback).
 +
<br><br>
 +
But I have multiple machine serving my web site , robust servers and region simulators and I use a laptop for the viewer. So the above solution is not applicable and a smarter solution is needed. Trying with the DLINK software prove impossible to set . So The solution I have choosen  is to use openwrt as presented in reference . (http://opensimulator.org/wiki/User:Thomax:nat-loopback) . OpenWRT is a replacement to you router software . Its based on linux and very versatile. It even come with a great user interface call LUCI. ref ( https://openwrt.org/ ) . I invite you to  visit the reference web site for further information.
 +
<br><br>
 +
In my case router internet  address at the moment for 3d.gimisa.ca is 184.161.12:239  and its local router address is 192.188.2.100. The region server is on 192.168.2.106  and the robustOUT server is on 192.168.2.108. I also have web server ,ftp servers and other regions on other machines but for the sake of this article we will keep it simple. To sum up port 9000 is open for robust on machine 108 ( 192.168.2.108 ) ,  and port 9100-9130 are open for region on machine 106 ( 192.168.2.106)
 +
<br><br>
 +
To configure my router using openWRT rev 22.03  I use the luci port forward section of the openWRT. 
 +
<pre>
 +
We need two rules.
 +
 +
Rule 1:  for the 9000 port forward to machine 108 to address robust OUT service:
 +
Protocol TCP,
 +
source zone WAN ,
 +
port 9000
 +
the destination zone lan,
 +
internal ip  192.16.2.108
 +
port 9000.
 +
On advance setting tab tick NAT loopback 
 +
Confirm "Use external IP address" that  appears by default.
 +
Leave the rest as is.
 +
 +
Rule 2 : for the regions simulator ports 9100-9130 forward to machine 106:
 +
Protocol TCP UDP,
 +
source zone WAN ,
 +
port 9100-9130 the destination zone lan,
 +
internal ip  192.16.2.106
 +
and port 9100-9130.
 +
On advance setting tab tick NAT loopback 
 +
Confirm "Use external IP address" that  appears by default.
 +
Leave the rest as is.
 +
</pre>
 +
I follow the same principle to recover access to my web site, other regions and  server.That is one rule per port series per machine.
 +
</blockquote>
 +
----
 +
<br>
 
Hope it helps<br>
 
Hope it helps<br>
160402  gimisa@yahoo.fr<br> 3d.gimisa.ca:9000
+
2023-01-28 <br>
 +
 
 +
[mailto:gimisa@yahoo.fr email gimisa]<br>

Latest revision as of 07:32, 20 November 2023

I am opensim user and simulator operator sharing my notes so its useful to others. Clic on orange word for note on subject or skim through as you prefer :


VOCABULARY: my understanding of the following terms.

   #AIML: Artificial Intelligence Markup Language  is a specialized xml  with defined tag for conversational bot.</p>
   #AGE: Normally not ask from a woman. But in opensim  its the number of days since you first rez in the grid.
   #ANIMESH: In opensim is the possibility to animate a mesh object with standard animations. 
   #AO: Stand for Animation Override a function that allow avatar to have other animation then the default ones.
   #ARC:  Avatar Rendering Cost, a relative figure that provide indication as to the load an avatar represent. 
   #BACKUPS: Is very important if you want reliability in case of failure.
   #BANDWIDTH: in opensim  refers to a band of transfer speed and is express in kilo bytes per seconds. kbps) 
   #BAKE ON MESH: is a feature to use standard texture clothing on mesh body. 
   #BENTO; is one kind of body armature consisting of additional bones for face, hands, leg and wings for animations.
   #BODY: in opensim its what the avatar wear his skin on . There is 3 kind rigged, fitted and bento bodies. 
   #C#: is the language supporting opensim. It is an object oriented Microsoft programming language with extensive library. It can be run in linux using mono. 
   #CACHE: Software component that stores data so future requests for that data can be served faster
   #CONFIGURATION: is done in opensimulator by specifying different characterisits governing opensim via specific files. 
   #CERTIFICATE: Its use with SSH (Secure Shell)  to certify access to a given opensim server. 
   #CHILD AVATAR: A number of mirror avatar creates in adjacent region. This is the mechanism by which the viewer is aware of the other adjacent regions. 
   #CONSOLE: in opensim its the dos or Linux running screen. This screen provide information and takes commands.
   #COPYBOT: in opensim its using a modified viewer to get content without respecting onwership limitation .
   #DATA:URL: is a string that can be use instead of URL that provide a web page or part of a web page content.
   #EMAIL: In opensim is the capability to send/receive email from script from/to inworld objects. 
   #EVENT: In opensim its an avatar gathering moment. 
   #FITTED: Fitted Mesh is a technique in which an avatar's collision bones are used to add further deformation detail to an avatar or clothing.
   #FSASSET: In opensim its asset storage using the files system instead of the database. 
   #GRIEFER: Visitor that wants to help you test your installation.
   #HOSTING: In opensim it means running your own simulator.  
   #IM: in opensim is the abbreviation letters for instant message a mean of private communication between avatar or between object and avatar. 
   #IRC: Internet Relay Chat in the context of opensim can be use to allow script communication between object of different regions. 
   #MEMORY: Memory is important in opensim to support the transmission of all the asset required to present a virtual world. 
   #MODFUNCTION:  is C# region module communication  function allowing interaction with script Engines both XEngine and YEngine .
   #MULTITHREAD: Basically it mean share computer resources in the most effecient way. But what about scripts? 
   #ONLINE: In opensim the indication that a user in rez in a grid.
   #GRID: One ore more simulator (SIM) supported by one or more robust.exe instance. 
   #INTELLECTUAL PROPRIETY: according to wikipdia includes intangible creations of the human intellect.
   #LANGUAGE: Opensim is an international virtual world. Lots of language coexist in the virtual world. 
   #LOG: Have two meanings. Action of connecting to a server. Noun meaning record of actions. 
   #MONEY: Everybody know what it is . Even in opensim.
   #MESH: In virtual universe its an imported collada file that creates a 3 object instead of using sculpty or prims.
   LOD:  Level of detail is the mechanism by which the scene object details are reduce with increasing distance.
   LSLWIKI: Old script page that you can still access at http://lslwiki.digiworldz.com/
   #LANDING POINT: is a position define to assign a teleport landing location in your land. (See TELEHUD) 
   #MRM : is the mini region module create by Adam Frisby to allow scripting in C#.
   #MOP Media on prim: the possibility to present a web page content on the face of a prim. 
   NPC: Abbreviation for Non Player Character.  The NPC is a bot, a computer controlled skim down player that you can rez in your world.
   #NAT: its a router feature that translate addresses to road map a bit like google map.  
   #OAR: Archiving file for region. 
   #OPENSIM: short for opensimulator. 
            In a stand alone is the service server and simulator for the opensimulator process. 
            In the case of grid stand for simulator only.
   #OSL FUNCTION: Particular opensim scripting function. 
   #PARCEL: a subdivision of a region minimum size is 4mx4m= 16 meter square
   PRIM: is the primitive building block of opensim virtual world . They can be created with in world building  tool .
   #PARTNER: In opensim is a bound between two avatar. Technical its a link presented in the profile of the partnered avatar linking to each other.
   #PERFORMANCE: from school age we know what this mean. But how to help improve it in opensim is a good question. 
   #PROBE: webster says a device used to obtain specific information for diagnostic or experimention. In my case its to find error scripts.
   #RELIABILITY: is the repeatability and consistency of performance.
   #REGION: a 256mx256m = 65,536 meters square area in opensim.
   #RENT: In opensim is the action of obtaining a piece of land ( parcel )  for a time. 
   #ROBUST: this is the grid specialized server that will hold all the common services as compare to opensim that in that case holds the simulator. 
   REZ; Stand for putting a new player, NPC , or  object in a region.  
   REZ DATE: the day you register a new avatar and rezing him in a region of the grid. 
   #RLV: is the acronym for restrain love. This is a feature available in certain viewer that with client consent allow certain script controls.
   SCULPTY: sculpty is a hack that permit  importing regular UV images maps specifically encoded for 3d object creation from RGB to XYZ conversion.
   #SCALE:The relation between dimension. Opensim allow scaling with object editor.  
   #SEARCH: In general trying to find something, in opensim you can find avatar , location and objects. You can also search your inventory . 
   #SCRIPT: Is a written text of a play. In opensim its language to code instruction to play in opensim.
   #SOCKS: As presented by wikipedia, SOCKS is an Internet protocol that exchanges network packets between a client and server. 
   SIMULATOR: also call SIM one opensim.exe instance running supporting one ore more region(s).
   STANDALONE: The simulator and the supporting  services are all run from one instance of opensim.exe
   #SLURL: Is a special kind of Uniform Resource Locator applicable to opensim viewers. 
   #SOURCE: Webster says its a a generative force. In our case its the file sets use to generate opensimulator application.  
   #SSH: Is Secure SHell. And is an encrypted way to communicate with your opensim server remotely.  
   #TELEHUD: is basically a marker(s) to assign a teleport location in your land.
   #TOS: Term of service. Under which condition are you proposing your services. In the case of opensim server or mainly simulator hosting services. 
   TUTORIAL: Short course presenting how to something. In opensim see http://profil.gimisa.ca for some tutorial I did. 
   #UBODE: Is a physic engine improvement done by AJL Duarte  over the original ODE physic. 
   #UPDATE: In opensim its downloading the latest release of opensim and transfer and  inspect ini files for changes to existing configuration.
   #VARREGION: a region with variable dimension. At time of writing limited to square values of multiples of regions (ex. 4x4 = 16 region area). 
   #VIEWER: a software that allow access to opensim virtual world. 
   #VIEWER REACH: is the distance define in the viewer reach window or preference that a user will perceive object. 
   #VIRTUALBOX: A software to run virtual machine, that is a virtual machine running inside a real machine. 
   #WELCOME: Ya everyone is welcome in opensim but that is a specification for the grid entry region. 
   #WIFI: In opensim its a C# http interface created by Diva Cantro more details here. http://opensimulator.org/wiki/Wifi  
   #XENGINE: The opensim module responsible for of the script LSL / OSL  language use in scripting inworld with opensim. 
   #YENGINE: A new improved LSL/ OSL language scripting engine compatible with XENGINE above.  


OAR

I advocate the use of OAR for backup similarly to any other software file extension. I believe that creators in opensim shall be able to save their work as easily as someone using word or excel. Bring it back in aopensimulator.org.orgs easy. OpenSim already allow that through the use of OAR. In opensimulator.org JustinCC introduced OAR file extension and a mechanism to create (save) and upload (load) that file content inworld in any opensimulator . More can be read in http://opensimulator.org/wiki/OpenSim_Archives . That mechanism is available through operator console of the simulator. But not to the majority of creator whom normaly are hosted only and have no console access. I propose here a method to do that with a script inworld to save the region content in OAR automatically. That script command is high treat level as define in opensim. Therefor the intervention of the simulator owner is necessary to allow the function . The best is for operator to create an object and put the following script. The operator should enable the osConsoleCommand command for him in XENGINE script access control section of ini file. See here for detail http://opensimulator.org/wiki/OSSL_Enabling_Functions. Using his UUID the simulator operator can enforce the treat level for osConsoleCommand and rez the object for his guess to use while limiting its use to the script function.
What I propose is a script to automatically save an oar when the prim count change by more then 10 .OAR saving can also be initiated by touch You can find a free copy along with a tutorial about oars and the object oarsaver in the little grid I operate for testing purpose call gimisaOS. You can reach it via Hypergrid using your viewer map with search for 3d.gimisa.ca:9000 or copy paste in viewer local chat the link at the bottom of this page

MOP

updated 170412
Media on prim can be very interesting. The way to add a media on the face of a prim is straightforward selecting a prim face in the build tool and then activating the media of choice in the texture tab media selector ( varies with viewer). Se tutorial in gimisa5 tutorial area for more detail and picture. You should display a picture of some kind ( you can use the same prim by texturing it) as default texture to illustrate to your visitor that you are using media on prim. Most viewer disable the auto play of media prim forcing user to seek them for display. The advantage of Media on prim is that it has no impact server side since the viewer is handling the request via its internal browser. Please note that the view is asynchronous. Specially if video it meaning that what you see is not what other will see or hear on the same prim face. Just like if you are visiting the page by yourself on the web. The web browser in viewer was Mozilla compatible with QTWebKit but has be change to chrome tool kit . Therefor it supports HTML5 tag as </audio> and </video> . The following HTML code to add has been updated for use with the codec supported by HTML5
I am using MOP to overcome the sound limit in OpenSim. A sound file play in world is limited to 10 sec per file. One Technic use to overcome that limit is to cut a longer sound file in 10 sec sections and to piggy back the set with a proper script . That has a detrimental effect on your region cause of the bandwidth required to send the sound file in this way. The advantage is that the sound is heard by all avatar in the vicinity.
.
The way I do that is via MOP. The sound file can be built from any mixer software you like and can have any length. The trick is to convert it to swf (flash) so it can be compatible with any operating system (mac, window, linux ) . There is a number of online converter that will be fine for the job. The file need to be accessible to the web. That is a serious limitation to causal users unfortunately comment on the later as to how to do that direly in opensim would be nice. For now the best is either to rely on hosting providers on the net or install something like tiny. Then you need a wrapper in the form of a standard web page with the following embed tag. <embed src="http://locationOfYourSoundFile/Here.swf" width="100%" height="100%" type="application/x-shockwave-flash" loop="false" autostart="true" > Sorry your viewer does not support flash (swf) </embed>
As a useful alternate in case your user viewer does not support swf is to provide a hyperlink giver on touch of the prim pointing to the same web page. In this way a HTML5 code wrapper can be use in your web page as follow:
<audio autoplay> <source. src="myOriginalFile.mp3" type="audio/mpeg"> <source. src="myOriginalFile.ogg" type="audio/ogg"> <source. src="myOriginalFile.wav" type="audio/wave"> <embed src="http://locationOfYourSoundFile/Here.swf" width="100%" height="100%" type="application/x-shockwave-flash" loop="false" autostart="true" > Sorry your viewer does not support flash (swf) nor HTML5 tags please refer to https://community.secondlife.com/knowledgebase/english/how-to-use-adobe-flash-in-second-life-viewer-40-and-later-r1406/ for more details </embed> </audio>
Using ,Data:url one could refer to sound or media in general available from the web ,directly in a text string instead of having to host it in a web server of his own. One could go as far as reformatting the web page to his own liking and provide dynamic content via script using An exemple of that way of achieving this is available in gimisa5 store in the tool rack . More on that in DATA:URL .
A trick I am using to achieve synchronous MOP effect for visitors is to use scripts. I clear the media on the prim face so it does not start when avatar come into vicinity. Then I use an event like touch to create the media texture . Though the effect is not totally simultaneous test with friends has show that its close enough for use. A made a firework display that is started on touch of the control panel that appears for all people standing in the area. You can get a demo of the effect of this trick by hypergrid visiting 3d.gimisa.ca:9000 and search for gimisa4 region in map.



ARC

ARC, Avatar Rendering Cost is an information the user should be sensitive too for a pleasant grid or hypergrid travel


The load an avatar represent in being rendered is an interesting figure to be considered by user. For local or hypergrid traveling the impact of the integration of avatar in the region scene is more or less loosely represented by that figure. This relative amount can be use comparatively as a guide for the amount represented by the avatar in rendering effort. In general the travelers should pack the avatar with as little as is needed to make a personality to minimize the load the region they are visiting. This is as much to have a pleasant experience for themselves as to help the experience of other by the same principles . They can put in their suitcase the travel avatar and the regular flashy model for convenience so they could switch while they traveling if they are in need to go to something more .
A good tool to judge the weight of one avatar is to use the avatar rendering cost display available in viewers. When activated with shortcut key ctl-alt-sht-C you are displayed a number over your head as well as avatar surrounding you . When green the avatar is good to travel. Yellow is limited while RED is no no. Its an interesting experience to make to remove part of an your avatar outfit and see the impact on that display. Good outfit part does show not only by the look they provide but also by the weight they represent for that results.
People should think about how much a traveling avatar has to transfer to the other grid (HG travel) server and how much information the region server has to handle to render the result they and other in the vicinity sees. This is all their texture, mesh and prim to be added to their scripts compiled. The few second required to render see a lot of activity both in the robust server and the region servers. This time is spent to acquiring that information (prim sculpt mesh shapes , textures, compiled scripts) . The result is use to create the rendering information for the avatar and its numerous child avatars in the region and adjacent regions for the new arrival (max of 9).
More about avatar rendering cost calculation and detail can be read on "http://wiki.secondlife.com/wiki/Avatar_Rendering_Cost"



CHAT_BOT. (R170714)

I use a number of way to interact with visitor. Making the visit more interactive can be a challenge to try to make the visit more interesting. Scripting provides the tool to do that and touch is the perfect function to trigger interactivity while not causing annoyance. Its also low on lag so this is my interactive function of choice. AIML is the language to give brain to your chat bot. Its interest is in the apparent two way communication it provide much like natural languages. There is script to do that inworld in lslWiki but scripting memory is too limited to do a good job so external service is required. I have tried that and will come back to it later.
What I found more intuitive and accessible using the dialogue blue box tool also offered with scripting . It is possible to construct with it a rather easy two way communication in the form of multiple choice discussion. That way is less interactive then a true conversational discussion but can be as attractive as a story book where you are the Hero. Using OSL notecard feature one can rig a notecard to provide for extensive exchange with the visitor. The line length of the OSL card is 1024 bytes ample for supporting multiple choices and trends in the discussion. The visitor reads the story line and make one choice out for the continuation. I use three choices the story direction can take but that is an arbitrary limit. And while at it why stopping to chat lines. The same tool can be use to hand out interactively LandMark, Object texture notecard and the like by referring to them in the story notecard. Add to it sound wave files of story and choice recording and you have a voice reader to accompany you visitor. Put that in a NPC (more about that in AIML) and you have the perfect guide to your exhibit. And top it with choice of language and you have a rather interesting interactive feature pack. A demo and code of that way of using interaction in opensim is available in gimisaOS my little test grid.
gimisaOS landing welcome have two demo Brat at the gimisaOS welcome sign and Joe at the OAR loader both you cant miss them. Joe has also voice in addition to the dialogue blue box both french / English .


I have considered AIML as stated above. There is an old script in lslwiki about AIML decoding done inworld. This method is presented in ALICE chat bot web site http://www.alicebot.org/about.html. It was also integrated in Radegast text viewer . To my knowledge it never took ground in opensim/SL . I guess its cause the feasibility is not there to search notecard bank having a few 100M typical for a bot to be somehow smart . You will find in opensim a well know bar tender bot using pandora bot.( http://www.pandorabots.com/) That bot can be easly configured to use an account you would create in pandora. But unfortunately the terms of service of pandora prevent you from doing so in the following terms:
5.3 You agree not to access (or attempt to access) any of the Services by any means other than through the interface that is provided by Pandorabots, unless you have been specifically allowed to do so in a separate agreement with Pandorabots. You specifically agree not to access (or attempt to access) any of the Services through any automated means (including use of scripts or web crawlers) and shall ensure that you comply with the instructions set out in any robots.txt file present on the Services.


What I did therefor is implement an external server. Unfortunately that make it not an application that can be easily implement by causual user compare to the pandora bot solution. The server use pyAiml a python aiml interpreter that is interrogated by the inworld bot to reply to visitor. I have added to it a personification notecard that override the request to the external server for specific such as gimisaOS grid. Asking about the grid bypass the external request and get the reply from the notecard. You will find walking NPC all around the few region of my test grid . For instance, the dancer in welcome first floor , the lady around pise tower in gimisa5 the firewoman , the paramedic and the two astronaut in gimisa8 nasa exhibit.
I found a way to use Radegast interacting with IMs to present a chat bot discussion through IMs. And while at it I adapted a second server to pyAiml2.0 see https://docs.google.com/document/d/1wNT25hJRyupcG51aO89UcQEiG-HkXRXusukADpFnDs4/pub which has lot more tag to support a smarter bot application. I found a pyAiml2.0 interpreter here where Keith is actually an active developer open to support and suggestion. https://github.com/keiffster/program-y
I dont know if explaining how the server is implemented is something of interest to opensim user platform but certainly an email asking for that information is something I would be glad to reply to.
You can reach the demos via Hypergrid using your viewer map with search for 3d.gimisa.ca:9000 .

SCALING

Scale a mesh can be rather spectacular at time. Any attempt will literally explode out the object and fill you screen with a mess.
Any builders know how to scale a prim. You select the build scale tool grap the guides and expend or contract the prim as you like. An other way is to change the x,y,z size of the object in the prim size data block just bellow position. In opensim the prim upper size limit is set in opensim.ini configuration file. The default size is 256m. But its possible to rez object that are already sized bigger then that. Naturaly scaling them after rezzing will cause the limit to be applied. Similarly scaling down is also limited. The opensim built in limit is 0.01m. That means that any attempt to change a prim x,y,z size to lower then 0.01 will fail and the scale change will not be applied . When you try to scale that low with the guides the scaling down stop and block at that point.
Now if the prim is part of a link set the discussion above also applies and that link will limit the scaling of the whole object when one of it child prims reach either the upper or lower limit imposed. To change the upper limit is rather simple if you have access to your opensim.ini. I have successfully use 512m and 1024m as upper prim size limits. But there is no way to change the lower size limit pass 0.01. There is trick to "see" smaller prim size by using partial transparencies. But when it comes to scaling an object down any prim that one of its dimension falls below 0.01 will block that scaling downward for the whole object so proportionality is maintained.
A mesh is imported as an object of a certain size.The imported size might be far different then its creation size in the 3d software. Regardless the above discussion applies. As long as there is no attempt to scale the mesh object simulator limits applicable are NOT imposed. A simple inspection of a linked set mesh will show that some of its links might contain element that are over the upper limit and or under the 0.01 lower limit. When trying to scale the object system limits will be enforced and if the mesh contain mesh link having smaller dimensions then 0.01 the size of the object will IMMEDIATELY be resized to fit the limit. I have seen case where the a mesh link original size is 0.001 for one of its dimension x,y, or z. This kind of situation will be leading to literally explode out the object with 10x scaling. and fill you screen with a mess.
The solution is easy. Inspect each element for size and correct any value lower then 0.01 up to at least that. Well that is nice for a mesh object with one to few links but what if we talking about few hundreds ( yes opensim can accept a lot of links no limit unless enforce in opensim.ini) . So the justification for a tool I did . The tool is a prim that you add to you link set. Then click /touch. It will inspect each element of the link set for size and correct any value lower then 0.01 up to at least that. The tool will confirm complete. You can then scale down. Unlink that tool and done .
You can get this tool via Hypergrid using your viewer map with search for 3d.gimisa.ca:9000 .

XENGINE

A strange situation happen to me on one region of my test grid. All scripts stop responding for two days. You can stop a script or a whole simulator script set from running by issuing a >> scripts stop command in sim console. This will stop all script and give you a list in console . A very useful debugging feature to know if you have offending script to pin point (more on that in following article) . You can also disable scripts in the debug tab of the estate manager window . These are perfectly normal way to have script not responding in region. That will be indicated by the missing run mark in the check box on the lower corner of the script edition window of any script in the simulator.
But that was not my problem , and I had no idea why it was acting like this . Yes I have added a few scripts more in the late days before that happen. But nothing that could explain a complete failure of xengine in my humble opinion. There was no log entry either to point me in the right direction. So here is what I tried.
1) in console script stop / script start
2) in estate window make sure script is enable
3) restart region from console
4) save oar of region and reload
5) search the net and mantis for xengine trouble

In all these case the script would run for a bit then would stop responding without warning nor indication at script level of not running state. Putty amazing is it.
In the trouble region the script will save normally with save script message appearing in both script window and blue warning. Running tag is normal on script window but no response from script and that is for any script in the region.
The main trouble to me is not a failure but mainly the lack of indication of what is happening in failure mode, at least with something in log or in console window.
I had backups I could roll back but the idea of experimenting is to take the opportunity of a failure to improve and learn so her was my solution for your benefit:

The solution is somewhere in http://opensimulator.org/wiki/XEngine

6)  ; How many threads to start at maximum load
MaxThreads = 100
XEngine will not start more than this many scripts, even if that means blocking script execution


I had 15 for maxThreads value which seem to be the default of opensim install.
Changing it to 100 prove to be a bit on the high side as I had region crash on low memory.
Trying 50 these days and it seem to hold ok.

A few facts should you be interested in details:

A)3d.gimisa.ca:9000 is the a 10 regions grid running under robust stable 0.8.1.
B)Robust and simulators are all served from same machine ubuntu 14.04.
C)Simulator are running from same set of files using alternate config ini.
D)Except for gimisa5 the trouble region , anything else is running normaly.
E)gimisa5 is the only region on its simulator.



SCRIPT PROBLEM

Debuging and mainly finding offending scripts might be hard on users. An impossible task if one dont have console access. Window / Linux provides monitoring means of reporting CPU and/or memory usage. The TASK MANAGER for window and TOP for linux are well know ones among them.

So using such a tool , I notice on one of my simulator a high CPU rate while no one was on any region. Thinking it was a script running wild I used the inworld estate manager debug window to see if it could point me to the problem. It did had a script listing and I try it to disable the few mentionned. But it did not cure my problem. Still using estate manager I disable all the scripts. That had the expected effect of dropping CPU confirming script was the cause of the situation. But which one. I was left clueless. How could I possibly find and investigate the 1600+ scripts of my simulator . Searching google left me with a lot of links but no answers.

What I found useful in that case is to use the console script stop command. Yes it stop all script just like the estate manager disable. But more over it provides a listing of all script in the region. Its easy to copy that list and paste it in a spreadsheet. Then, and that is where it become interesting, its an other easy step to modify that spreadsheet to add the script start console command prefix to each individual script entries and to save that file. Next, using the command-script console command, pointing to that file just created, run that file and restart ALL script . But more over one can fine tune, individually via prefix to each line of the spreadsheet , which script to start, and stop.

Armed with that tool and using a well know iterative technic by trial an error, each time narrowing the number of scripts. I found the single script among the 1600 that had my CPU jump by 60% and correct it.


SCRIPT TRICKS

2020-11-30
List trick :

Its well documented that list cannot be nested ( see http://wiki.secondlife.com/wiki/List ). So that list1 = [1,2,3] and list2 = ["A","B","C"] cannot be translated into list3 = [ 1,2,3,["A","B","C"]] .
I use list a lot in queries , mainly dataservice or html queries . Listing the query key is a way to transmit data to the reply of these functions in the form [queryid, variable1 , variable2] .

But what if you need to transfer a list to the query like [queryid, list1, list2] in our exemple having a query list like [queryid ,[1,2,3],["A","B","C"] ].
Use llList2CSV to encode the embeded list and use the reverse llCSV2List to decode it . Doing this way the query list in our exemple is queryid+llList2CSV(list1)+llList2CSV(list2) . This translate for our exemple into list1 = "1,2,3" and list2 = "A,B,C" so that query list is [querid, "1,2,3","A,B,C"]. Getting back the orginal data as list1=llCSV2List(query,1,1) and list2 = llCSV2List(query,2,2)

AGE - STAT

We are all getting older , really and virtual. Virtually you have a rez date , that is a date you created you avatar in a grid. That rez date for that grid derive your age measured in days and show up in your profile. The other day , in my little test grid , I had a new born HG visitor. This attracted my attention cause it peculiarly young to be hg jumping when first register into a grid. If you new to opensim even if former SL resident , HG jump is not something that come natural. Your first days in a new grid will usually be devoted to getting around and installed in your new world . So it intrigued me as to what is the age distribution of my visitors. I have a 30 days rolling graphic presentation of the number of visitor per day and daily tally time done with osl draw functions that you can check and grab in gimisa5 hypergrid dome . So I though why not add a plot of age distribution on it.

On grid that have profile activated in opensim.ini / robust.ini (see this for more detail http://opensimulator.org/wiki/UserProfiles) right clic on the avatar and asking for profile will give you avatar name including ,home grid url with port and born date and age in days and general profil data via profil tabs. To gather statistics you need to have access to those figures in scripts. For local user a script can access the born date via llRequestAgentData(key, DATA_BORN) ref: http://wiki.secondlife.com/wiki/LlRequestAgentData .

The problem is that no command exist that will provide you with that data for HG visitor. All the scripts can provide about HG visitors is the name with llDetectedName() script or llKey2Name or oslGetAgent(). It is possible from the name information to get the url of the avatar home location. With a bit more gymnastic using a xml_rpc request to the home server of the visitor you will finaly get the born date of the visitor coded as UNIX time stamp. That time can be translated using LlGetUnixTime into age in days. TADA!!! A demo of that solution is available in gimisa3 welcome.Just touch the age cube.


PERFORMANCE

I know you probably know this . As you witness with experimented hoster for opensim they usually restart their region at frequent intervals. But how much important this practice is . Using Linux top command I was able to obtain the following data after 24 days of opensim uninterupted operation of my little grid. top - 08:04:34 up 24 days, 2:54, 1 user, load average: 6.48, 5.68, 5.27

What does this mean. Well load average three numbers are for 1min 5min and 15min average of the load on the machine, The number themselves means the number of CPU cycle necessary to process the items in queue. So is 6.48 CPU cycles bad. No if you have 12 CPU to handle the task they will team up to take only 1 clock tick. But this is very bad if you only have 2 CPUs teaming as in my case . It translate into sluggish server response on teleporting to region and rezzing object. Script processing is also painful.

Now what is happening after restarting the 4 simulator running on my computer. top - 12:00:04 up 24 days, 6:49, 1 user, load average: 1.36, 1.49, 1.66. Yes this is the same load, gimisaOS grid. Same 4 simulator with same content now takes up 1.66 15min average load a very acceptable value on a 2 CPU chips.

To restart you region you can use the estate manager window and on the debug tab you can hit the restart button. This function is accessible to any estate manager. For server system operator the console command region restart blue box restart 15sec 15 will do a restart in the next 15 second. But these method will require your attention every time you want to restart you region.

For an automated method one can use the above feature with a OSL script. One can enable OsRegionRestart opensim scripting function and put an appropriate timer on it to restart the region at interval (ref: http://opensimulator.org/wiki/OsRegionRestart) . An example of such a script is available in gimisa5 store.Just drop this box in any region you have estate management rights and it will restart at interval set by timer.

For an other automated method one can use remote console command. This feature has to be enable in the opensim.ini . [RemoteAdmin] enabled = true port = 221 (select a port that in NOT open to external) access_password = "passwd" enabled_methods = all . I do this setup for my 5 simulators, from port 221 to port 225. Next you need a program to run the required command. I am using python as follows :
#!/usr/bin/python 
# Author : gimisa

import xmlrpclib 
import sys
#this is the UUID list of the region to restart

g1='c794b362-fb61-4bff-90b2-5fc273df7df8'
g2='30bb9b86-bae5-425b-8c55-02d788858953'
g3='772c0b5e-bf67-4ace-8b34-735f102f1aff'
g4='9b5c28de-5a07-4cd6-b3a6-c353d988b929'
g5='1285196d-4288-4ebc-a312-cbff001a6165'
g6='9d2d5dbe-2714-4df5-bfde-b2ad81505e06'
g7='1285196d-4288-4ebc-a312-cbff001a6167'
g8='1285196d-4288-4ebc-a312-cbff001a6168'
g9='d87ad5db-08eb-4c91-8004-3a057574aaa9'
gr='d87ad5db-08eb-4c91-8004-3a057574aaaa'


# XML-RPC URL (http_listener_port) 
simulatorUrl = "http://127.0.0.1:"+str(sys.argv[1])
# instantiate server object 
simulator = xmlrpclib.Server(simulatorUrl) 
#I am using port 221 to 225 for the 5 simulator
#for simulator 221 there is 4 regions for the others one simulator one region
if str(sys.argv[1])== "221" :
	simulator.admin_restart({'password': 'pass1', 'region_id': g1})
	simulator.admin_restart({'password': 'pass1', 'region_id': g7})
	simulator.admin_restart({'password': 'pass1', 'region_id': g8})
	simulator.admin_restart({'password': 'pass1', 'region_id': gr})
elif str(sys.argv[1])== "222" :
	print simulator.admin_restart({'password': 'pass2', 'region_id': g2})
elif str(sys.argv[1])== "223" :
	print simulator.admin_restart({'password': 'pass3', 'region_id': g3})
elif str(sys.argv[1])== "224" :
	print simulator.admin_restart({'password': 'pass4', 'region_id': g4})
elif str(sys.argv[1])== "225" :
	print simulator.admin_restart({'password': 'pass5', 'region_id': g5})



Next is to schedule that task. In my linux case this is through cron. Here is the cron file I am using to start this task every weekday as follows. 1 is monday ....5 is friday .

1 1 * * 1 /home/gimisa/Bureau/python/remoteResart.py 221
2 1 * * 2 /home/gimisa/Bureau/python/remoteResart.py 222
3 1 * * 3 /home/gimisa/Bureau/python/remoteResart.py 223
4 1 * * 4 /home/gimisa/Bureau/python/remoteResart.py 224
5 1 * * 5 /home/gimisa/Bureau/python/remoteResart.py 225



After about a year of using the method above I notice that some script were hanging and a general deterioration in the simulator behavior happen even if the CPU usage was apparently good. It seem the remote restart available through the remote admin simulator command ( http://opensimulator.org/wiki/RemoteAdmin:admin_restart ) or through the estate manager window is not performing a deep enough restart in comparaison to a cold quit command.
So as presented in the following link http://opensimulator.org/wiki/Automating_Tasks and since I am using ubuntu screen , its possible to send a direct command to the simulator via a screen -xS screenName -X stuff "alarm restart in 1 minute " to alarm, quit , and restart the simulator. So I replace the simulator.admin_restart from the python routine above with a screen command and replace that bash routine in my crontab job list.

The code is :

    #!/bin/bash
    screen -xS $1 -X stuff "alert region restart in 2 minutes
    "
    sleep 1m
    screen -xS $1 -X stuff "alert region restart in 1 minute
    "
    sleep 30 
    screen -xS $1  -X stuff "alert region restart in 30 secondes
    "
    sleep 20
    screen -xS $1  -X stuff "alert region restart in 10 seconds
    "
    sleep 5 
    screen -xS $1  -X stuff "alert region stopping will restart in 5 minutes 
    "
    sleep 5
    screen -xS $1 -X stuff "quit 
    "
    sleep 600
    
    screen -X -S $1 quit
    
    sleep 5
    
    
    case $1 in 
       "go" )
       sh /home/gimisa/goar.sh
       ;;
       "g3" )
       sh /home/gimisa/g3.sh
       ;;
       "gi" )
       sh /home/gimisa/gi.sh
       ;;
       "g4" )
       sh /home/gimisa/g4.sh
       ;;	
       "g5" )
       sh /home/gimisa/g5.sh
       ;;	
       
       esac




MESH

I have made a whole series of tutorial in gimisa5 about mesh , mesh and material , mainly blender importing up to rigged avatar creation see paragraph bottom of article for new addition. I also work out a comparaison between prim, sculpty and mesh as building block for your project. The limitations of each medium is spell out for each of those tool and illustrated in the different tutorials . But I lately came across this article from http://blog.nalates.net/2015/10/01/second-lifes-limits/#more-15460 where they indicate that not only there is a upper limit on material of 8 and total of triangle count per object of 174,752 for you mesh, which was already documented . But they mention there is also a limit per material of 175,752/8 = 21,969 triangles . This later limit is not documented (but would explain failure of loading a MESH even if everything else is in order). Validating this situation in loading up in my grid I did not witness any effect for a mesh with one material having a total triangle count OVER 21,969. Nevertheless the step to improve you builds in this respect is the same as the step to overcome the material count limit of 8 as suggestion in my tutorial,is to split the work in multiple objects, that you import together so they combine properly in world.

So keep an additional eye on your triangle counts if you doing object for import. My way of doing this is to do my object. Then assign material. Split my final build per material. Make sure I dont exceed the triangle count limit per material. Sometimes I recombine a maximum of 8 object into one in a logical way to do my final object(s). There is nothing wrong in leaving the object splitted which give additional flexibility with only one face ( similar to sculpty) at the cost of larger linked object set. As far as I can see UVmaps will follow properly in the recombination so that texturing will still be maintain proper inworld.

Not so lately ( 2016-01 ) I have added four new tutorial about meshes. They can be found in the import-house in gimisa5. Two are rather advance UVTexturing using clone tool and the other one is about patching holes via the blender grid tool . The other two are more accessible to none blender initiates. One is about making 3D lettering using blender text tool to import inworld. Without much knowledge of blender it is possible to intuitively create lettering text that can be converted in mesh to DAE file and import inworld. The second tutorial in the Mesh import house is about creating 3D object out of simple pictures using autodesk cloud software freely available for small project. Its amazingly simple to use and the results are awesome. The 123dcatch depot in itself is a source of very interesting mesh constructions for you to explore.
Lately ( 2016-03) I have added a tutorial on how to create mesh using regular picture set. The tutorial provide an example using a del arte mask mesh creation using as few as 9 pictures. The internet line tool to do that will created stl extension that can easily be converted and repaired using blender. The tutorial and de la arte mask can be found in the import mesh tutorial building in gimisa5 of my little test grid.



MONEY 2020-11-17

I dont think this need definition in Real World. But what about Opensim. My idea here is experimentation and play money. A monopoly of opensim sort of to have fun and play with. My idea is to use coins as point to collect statistics from visitor in my experimental grid. The money system and component help achieve that result by providing supporting data on transactions . There is a good article about it here so I dont need to repeat that information (http://opensimulator.org/wiki/Money). Money not being a core Opensim element its implementation is left to third parties . The one I use for experimentation is http://www.nsl.tuis.ac.jp/xoops/modules/xpwiki/?OpenSim%2FMoneyServer version 0.8.2.0 . Its a current installment at time of writing this article. Its not built using new mono add ins feature (see http://opensimulator.org/wiki/Developing_OpenSim_Addins ) . Nevetherless its download and build was rather straightforward in my case ( linux ubuntu box). I did follow the read.me instructions provided with the download successfully.
But if you prefer an already compiled version already setup to work with 092. Please download http://profil.gimisa.ca/files/NSL_money.zip

Otherwise the steps are:

1)move the file in appropriate folders ( opensim and opensim/bin )
2)create the money database
3).\build the package
4)modify the moneyServer.ini file .
5)execute the created moneyServer.exe



My moneyServer.ini is available in the dome of gimisa5 region should you be interested in that. I did not implement the helper part. (updated) I have no choice but to include a helper in order to give land to someone else. I did not implement the one proposed by NSL. Instead I use the following instruction by Fleep to implement helper.phg http://opensimulator.org/pipermail/opensim-users/2012-September/010946.html. For the rest I have direct access to database of my server which makes it much simpler to adjust money balance using sql language. Since it is only to gather statistical information from the database collection I am not too concerned about safety or incorrect transfer.

The interest for me is that now All of the LSL function related to money become available. llSetPayPrice, llGiveMoney, llRequestPermissions. Also as the object buy function and pay function with a set value. All those will trigger the money(key id, integer amount) event that should prove very interesting to explore.

I noted in my early experimentation that the money event has a problem. The event cannot handle more then one function. That is ONE line of code. A work around I found is to make the two variable provide by money event ( id and amount) global and to use a timer to operate the supporting functions to be implemented.

More important, in my case, I have an experimental grid with only me as resident. So play money is for my HG visitors. New release in progress for OpenSim-0.9.0Dev had support now for HG visitors. I am great full to developers that provides the code of their work in open sourcing. I notice a flaw on the execution when NPC are created AFTER arrival of new visitors in regions . The balance to purchase is report at zero for any transaction of existing visitors. With the help of a C# introduction book and a bit of fiddling I was able to modify the code to correct that situatiion an make that release functional to me. HG visitors rezzing in the grid are granted the initial amount set in moneyServer.ini. They can do then same as grid resident and make transaction with those coins for the length of their stay. On a subsequent visit to the grid, they retrieve their previous balance and proceed with play money fun. As usual you can test by making a visit to my test server at 3d.gimisa.ca:9000. All regions have money enable.

Someone ask me what was my sql requests command I was using. So to get transaction with date and visitors this is the one I use:

SELECT sender,objectUUID,objectName,from_unixtime(transactions.time),robustOS.GridUser.UserID FROM money.transactions,robustOS.GridUser where robustOS.GridUser.UserID like CONCAT( money.transactions.sender ,'%') ;

For per user amount this is the one I am using:

SELECT money.balances.balance ,money.userinfo.avatar,money.userinfo.serverurl ,robustOS.GridUser.UserID , from_unixtime(robustOS.GridUser.Logout) from money.balances,money.userinfo,robustOS.GridUser where money.balances.user = money.userinfo.user and robustOS.GridUser.UserID like CONCAT( money.balances.user ,'%') ;




LANGUAGE

Opensim is an international application. There is grid hosted in many countries. The viewer supports a number of language that can be set in preference either to be system language or manually entered to fit the user need. This is the same idea as a web browser. For the web browser the language information is available to servers so the user experience can be adapted for the visitor language. The same is also possible to the opensim server / viewer. A script function supports the adaptability of the interaction with the user. The function LlGetAgentLanguage (see http://wiki.secondlife.com/wiki/LlGetAgentLanguage for more detail) is actively supported since 2015 for all grid users.

Unfortunately , this function still does not support the Hypergrid visitors. The function in that case will reply with the default language set by developers ( en-us ) . So I did seek in to try to have a better look at what is going on . A little check in SL shows that this function only works for a request about an avatar that is in the region of the request for language. This would be compatible with a direct request to the client viewer. I did validate the way the code is made for this function in opensim. Its design is through call to database. The database information itself is updated when the user logs in. So there is no direct exchange from the function call that the viewer would reply to. The result is fine for local users as the information is refresh in grid database when they log in. But since Hypergrid visitors by definition belongs to an other grid their language information is store in the visitors grid database and not made available to visited function call.

So I had to jump in an see if a direct communication is feasible between the viewer and server so that the server can request information out of the viewer after connection to the opensim server. See Hacking Opensim bellow. The conclusion of this effort is that its not possible to obtain the avatar language information, from its viewer configuration settings, out of the login process.


HACKING OPENSIM

I started trying to hack opensim to answer my language question above. I got the source of opensim 0.8.2.0 here http://dist.opensimulator.org/ .Download the source and run the runprebuild.sh so that the solution file are generated.Then in order to read the source of openism 0.8.2.0 I needed mono-develop in linux or microsoft studio in window. Since I work from Linux , I use the former. MonoDevelop can open the opensim.sln file and provides access to the source code and reading of all the code files. With it I am also able to directly "build" and "run" or "debug" the opensim server solution. I can connect my viewer to it and make test as I like. Adding break point in debug mode and using some other debug technics. I had fun exploring the server code in action. But trying to make sense of all those files is not obvious to a new comer. There is this web page provided for developers http://opensimulator.org/wiki/Codebase_overview that got me going . I also found the discussion between Diva and cinderblocks in mantis 7157 ( http://opensimulator.org/mantis/view.php?id=7157 ).

For my language hacking I found that in login process the AgentPreferencesModule is call in to store the values of the login avatar language. This happen only once from the region the avatar log into. Contrary to my original belief. There is no direct communication between the viewer and the server when the script function is called. Instead the function call a database request process internally within the grid server database. A default reply is sent for HG visitor request since they have no entry in database.
I use the console command "show caps list" to get the capacity created for the AgentPreference that includes the language. Those capacities are registered every time the user teleport to a new simulator. That is happening regardless if the user is local or HG visitor in each simulator visited.
AgentPreferences /CAPS/7d28b612-88ad-4d85-a47b-567d8faaa9c0
UpdateAgentLanguage /CAPS/7d28b612-88ad-4d85-a47b-567d8faaa9c0


The AgentPreferenceModule uses a delegate call on region creation. This is typically an event handling function. Every time a cap is created this delegate event is added with the appropriate variable .scene.EventManager.OnRegisterCaps += delegate(UUID agentID, OpenSim.Framework.Capabilities.Caps . This call register the capacities for AgentPreferences and UpdateAgentLanguage and provide for support by the viewer. In the login procedure, the viewer replies to that capability with some appropriate response. But when an avatar teleport to a new region the related capability is announced just the same as in the login process but NO answer is received to this announcement from the viewer. I am clueless as to how to induce the viewer to provide the information as I have no idea how this part of the job is done . In order to understand better the viewer to server communication next step is to use the pcampBot supplied with the source code of the opensim. Using a separate instance of monoDevelop I select the pcampBot solution and in the menu for that file I set the option to the run and debug that program with the argument required including the credentials of your bot avatar as follow after creating that account in local test grid:


firstname Test -lastname User -password 12 -l http://127.0.0.1:9000/ -s "home" -b n -c

But deception running it fails with delegate error in openmetaverse. So the bot is not created. Doing same direcly in terminal did the same error . Downloading 0.8.2.1 and running pcampBot from stable version did same. So no luck there ...


HACKING VIEWER

Following my language tread my next stop from above is to tackel the viewer communication. I was not successfull in getting a viewer compile. But I found this C# library that contains some basic viewer code . http://lib.openmetaverse.co/wiki/Main_Page . Following instuction in this page I was successfull in downloading the source code with project file and to build and run it in debug mode with monodevelopp on ubuntu 14.04 . There is a nice little application attached to this code call testClient that you can run. In monoDevelop you select that projet folder , and in the pull down menue edit its option to add in the run argument the credentials of your bot avatar as follow after creating that account in local test grid

--first Test --last User_0 --pass xx --loginuri="http://127.0.0.1:9000"


Also tick the run on external console if you want to be able to provide inputs via terminal.
Then simply set as startup project in the pull down menu with that solution selected and proceed with running it in debug mode .
Type help in console and look in amazement your bot solution with numerous commands available for testing. Thanks to Hiro for this work . Its a great upgraded NPCs ... Naturally it requires an account for each bots. But unfortunately for my language test testBot does not seem to reply to AgentPreferences.
Fortunately and thanks to Latif Khalifa Radegast in C# with source is available here http://radegast.org/wiki/Radegast . Its a minimal viewer text base with only with a bit of graphic interface. Once downloaded and runprebuild is done it can be open with monoDevelop and compile and run in debug mode. Its a bit more equipped then testBot and to top it, it react to AgentPreferences with a predefine setting of "en". Testing for my language experimentation reveal that there was no way for a direct request from the opensim server to obtain the language configuration direcly from radegast. At least no way I could find. If someone has suggestion I will be happy to read them .


LANGUAGE SOLUTION

Well I was out of ideas to solve the language problem, and suddenly I cross the path of Ernie Serieman. He suggest to use the web kit embedded with the viewer to obtain the language just the same as one get the language from a web browser . To do that he put up a script that use media on prim. By magic his script show the user language right on the media on prim face. The point was to be able to use that information in a script same as llGetLanguage(). With a bit more work we got it to work as plan. Thanks to Ernie for this bright idea and his help with this. This solution has a lot of advantage. It works with HG and local visitors and it does not require database storage. Sole problem it only work with media on prim active . A demo version is available in welcome of my little grid.



ON LINE INDICATION

Lately ( 0.8.2) I have notice its difficult to create friend link for HG people across grid. Not that the link does not appear and the calling card does not get exchanged between friends. But some friend link seem to be broken for the online indication as it fails in its accuracy to indicate proper online status. Note you can still instant message these friend if they are online but the message will not save if they are not on line. One way to solve the issue is to move to the grid your friend is. This will show his online status correcly and will allow off line message saving. Some time ago (2012) I had made a phone system base on HTML server capability of opensim to communicate between grids. Communication using these was possible between closed and open opensim grids as well as SL . That little tool also included a online indicator which is simple enough to work rather well even under 0.8.2. Should you have an interest in that please visit gimisa5 tutorial area for you test copy .

EVENT

Event can be gathering like danse or live performance. I like srcipting so here we mean scripting events. Timer is an event in scripting . It is trigged at the end of the delay your specify in your script.Its low lag for long delays (minutes) . You have many events that can trigger scripts reaction . Touch (clic object) collision sensor html request are other exemple. There is an interesting Mantis http://opensimulator.org/mantis/view.php?id=7061 that discuss Timer limit and in general offer guidance for events in opensim .

For exemple timers are trottle to a delay not lower then 0.5 second. This makes timer very poor when use as progression clock in non physic movement as the human eye will see anything higher then 0.1sec (10fps and lower). In this tread it says if you need a faster timer, consider using the not_at_target() event which will fire every frame. Beware that might be a lagging idea.

I think that that mantis tread is offering very good guidance from Melanie and should be consulted for detail. I retake a large part here cause its sound information that should be easy to find for whom ever is interested in scripting his world. See SCRIPT PROBLEM. above for more detail on the effect of abuse of some of the event available in scripting and how hard it is to find the offending source once release inworld .

Collision is mention as one of the worst event to handle in term of lag. Collision contrary to touch can happen many times as the object bounce back on it . That is why a low lag trick is to turn everything not needing contact with to phantom. Its interesting that inworld people will avoid going through a wall even if the wall is phantom just because its a wall. Physics step size corresponds to 11fps internally, so the length for an object collision to be detected is speed divided by fps . For exemple a 30ms speed object under 11fps we will compute about 3m for the size of the object in direction of contact needed for detection. At walk speed 1ms the same lenght is compute to about anything thicker then 0.1m . That is why colision between avatar works well while firearms bullet collision is tricky and use llCastRay .

So Melanie recommands NO listeners if they can be avoided, ABSOLUTELY NO LISTENERS on channel 0. I will add that Dialogue is more approriate then channel 0 for object commands. In generale osMessageObject is better for object direct communication. But copy of object need to be specifically addressed. And for a reason I ignore object inworld have changed UUID on me so this solution is not perfect expect a bit of tweeking to gain performance.
As she says every script on the receiving side needs to wake up, even if all it does is discard the request with a IF . Stuff that uses chat commands, use specific listeners so the filtering is done by the sim, not the script. So to me in other words use many specific listener instead of many IF . Also as she says It's cheaper to wake one script multiple times instead of many scripts one time and that is true for all event I would say. So one event handler per object is probably desireable.

Same idea linkMessaging is better as more specific than listen . And the better if specific link is targeted.
Finaly she point to avoiding physics like the plague. llKeyFrame is your friend for non physic movement. Also Repeat raycast or sensor is laggy too. Use a packed message protocol, messages have overhead so of you can pack more than one message to one object do it .

Thanks to Melanie to have provided insigth into better scripting form the developper standpoint.

MEMORY

gimisOS is running on two machines. And as I am building and pilling script I get more and more slugish response. So I was wondering if my work load is properly spread. One of the thing that makes a respond sluggish on a server is if you dont have enough ram for the task . System is using swap to swing pieces of data or code not use for a while in exchange for free space to take in new stuff.That mean that if all your simulator data is not in memory the swap is call for in the rescue and cpu has to work to get that data back in memory and sent it to your user. So here is a take of my memory usage and simulator division. :

Server regions Mem size(Mb) Swap(Mb) Threads ! Scripts Prims OAR(Mb)
g5 5 3,758 33 94 1,593 13,314 153
g4 4,6 2,025 396 82 1,491 17,100 107
g3 3,rose 1,856 0 95 1,008 7,085 37
gi 1,7,8,9 1,935 374 113 618 8,859 35
go 2 to the other by 256m or more of empty space 460 2 to the other by 256m or more of empty space 54 13 53
ro - 164 4 23
my - 40 17 37
total 10 10,238 826 4,723 46,411
11,064 (mem + swap)


You might notice that a bare bone simulator pick up about half a gig for running with only one region. You might also notice that the quantity of prim is not an indicator of memory load so is script number . Something more indicative is the size of the corresponding OAR . So my two machine should have 6 Gb of ram to face the load and a good spread would be g5,g3 and the remaining on the other one .


RELIABILITY

Is an important element of any server. Adding features is nice but if these features are not reliable to perform each time consistently its a problem. And if after a while the system crashes because of accumulation of micro failure its even worst. Unfortunately because of the nature of open source opensim and the creation content done unequally by users ( like me!! ) Opensim is prone to instability that lead to crashes. In average one or two crash a week is happening on my region even on weekly restarting of the simulator. Its hard to pin what exactly lead to that crash specially with the message provided in log for linux system where open file is not identified. And even if it was that message is more meaningful to developers then to casual operator like me. So for all those good or not so good reason I have added a routine in my cron job to validate if the simulator is running.
Running on linux I edit my cron tab to add that checking routine every so often ( 4 hours ) with the name of the screen session like:
sh checkRunning.sh g1 g5 with my opensim starting bash being g1.sh and g5.sh and my screens names being g1 and g5 .
The Code is :
     #!/bin/bash
     for var in "$@"
     do 
       if ! screen -S $var  -X select . ; then
          sh ~/$var.sh
          echo 'restart' $var  $(date ) >> ~/log/$var.log
       fi
     done

CONSOLE COMMANDS

Those are the commmand you can use to control and get information from you running simulator or grid server. The list and detail can be found on this web site here opensim console command list . Help can be obtain on those command by typing help direcly in console. You will then get a lit of commandes available at the console your working in . The reference page is not updated as it seem some command name have changed ( version 0.8.2.1) . ( server or simulator ) For example
     delete object uuid <UUID> should be ''delete object id <UUID>'' 
     show   object uuid <UUID> should be  ''show object id <UUID'' 

GRID LAYOUT



What is the impact of grid layout and what about varregion and regular region effects. Let start with viewer reach. The reach maximum value is 1024m . That set distance act like a fog that limit the perception of object. Note that for people with low graphic card reducing that value help performance by reducing the number of object the card has to handle .

That is an avatar will perceive an object and apply level of details to it from that set value down. Like in real life you perceive object detail as you move closer to them . In openism / second life the switch distances for an object are proportional to the object "radius", which is the half-diagonal of the bounding box. It can be calculate as r = sqrt(x*x + y*y + z*z)/2, where x, y and z are the dimensions of the object in meters. The first switch, high to medium LOD, is at: rvlf * r/0.24; the next at 4 times that distance, and the last at 8 times. For a 1m cube,that is 3.3, 13 and 27.

Sound complex , let try to shed a bit of light on this idea. A good representation of the level of detail of an object is its triangle count. A standard prim cube of 1m x 1m use (6 x 9 x 2) 108 triangles in all its faces as seen from a 3.3m location. At a 13 m the viewer will present only ( 6 x 4 x 2) 48 triangles and finally at 27m the viewer will present ( 6 x 1 x 2) 12 triangles.

So what does that have to do with grid layout. I might need to be corrected here but every time you log in a region you get sent all the object texture and shapes detail to your reach distance. If the scene is static and you dont move that is all you need for rendering. The proof of that is when the region lag a lot, rotating on yourself is always performed and rendered properly.

A static scene like a picture is limited in interest . Moving is what give life to virtual. Moving in the scene can be rendered by simple recalculation done at the graphic card . But moving updated information is required to present object that were previously out of your reach distance and to correct object/avatar that themselves are moving. in the scene.

Grid layout yes, we are getting there. When an avatar log in a region it creates child avatars. There is a maximum of 8 child avatar created in each of the region adjacent to the landed region. This allow the other region information to be communicated to the viewer. This is the mechanism providing perception of object at the reach distance across the region boarder. More importantly these are the ONLY region the avatar can perceive cross boarder. That is even if the reach distance is 1024m and the avatar is standing on the middle region of huge grid , he will only perceive object in the region that have created child avatar for him .

Is this fact important for Grid layout. You bet. Say I want to create a huge city . With opensim 0.9 its possible to stack varregion side by side and say make a 12,288m x 12,288m plot. We cant go with varregion size higher then 8,192 so you would be a bit short with only one varregion. You could divide it say in 3 x 3 of 4096 x 4096 varregion.. But if I am correct , in any of those case your avatar standing on the city center would have child avatar in a surface representing a huge area compare to the reach distance of the viewer. Anyhow the viewer will not handle more then the reach distance . Nor will it reach further then the neighbourhood where child avatar are created. This is important performance consideration cause on regular region of 256 x 256m viewer reach distance of 1024 is not accommodated in practice since standing on the middle of a region the avatar can only see 128+256 = 384m in any plane except height.

So if your selection is to accomodate 1024, with at minimum continous reach, you would contemplate varragion of 2048x2048 to fit that reach distance to the closes possible. In this case 6 x 6 of 2048 x 2048 varregion would be feasible. What if size is bigger. This is similar to having a reach of 64m in regular region, the cost is minimally to create the 8 child avatar. In any case the visitor will not see more then his reach capabilty.

But if you needs is not as large and performance is your concern, then you prefer people NOT to perceive scene object from you neighbors .So the trick in that way of thinking is opposite and you want to have an empty region ( no region at all ) in all direction centered on your scenery. So that NO child avatar are created around you region that will drain down uneceesary overhead and viewer bandwith when reaching boarders with stuff from you neightbourgh. Once you have establish a no man land zone around your area, selecting varregion size is up to how much of you scenery should be perceived in one glow. So one region of 8132 square would be your maximum in this respect. While standard region size of 256x256, with teleporter sending people in layer of 1024m in height is still a valid sizing to consider particularly for smaller areas in my opinion. By the way should you not know opensim supports construction over the 4096 limit. I have seen scene made at 8000m on top of a regular 256x256 regular area. So varregion already exists for a long time heightwise!!.

ROBUST (update 2020-12-13

When executing the simulator as a standalone either hypergrid access or not you get two part. The grid service like login and assets and the simulator services like physic and avatar rendering functions. The simulator is using mutlitread in scripting and avatar rendering. Multi tread is the ability to execute multiple processes concurrently. The grid part is on the other hand single treaded meaning that it executes one service after next. In stand alone mode thow its normaly not intended to have multiple opensim instance running and connecting to each other. The way to run multiple region is done one one opensim instance by define as many region as one want in region directory and have only ONE opensim instance running. This is the way diva distro is proposing. Simple and efficient if your needs are limited to a few regions as the rule of thumb is one region per cpu plus one for the opensimulator process. In this way when performance degrade one have to think in speading the load differently. The way proposed by opensimulator is the robust server to split the grid services ( logging , asset ... ) from the simulator itself.

The idea of Robust is the service server of a grid. Robust is dicussed here http://opensimulator.org/wiki/ROBUST .Its possible to connect many simulator run on different computer to the robust instance run on an other machine. This is the way use by large grid like osgrid. The configuration of running instance of osgrid can be found here https://www.osgrid.org/donation_usage.php . Not all service can be run separately so osgrid is a good exemple of feasible splits. Without going to deep one can see that osgrid uses multiple robust instance and multiple opensim instance on different computers . Its configuration is through robust.ini or as explain through a file effectively named in the startup arguments.

I dont have a large grid but I use multiple computers so running robust is the way for me for a while now . But my asset is growing since 2010 as opensim assets handling is never to delete any. So each time you create or change a notecard , texture you upload even duplicate , end up cowling in the asset server ( more about FSasset in next article ) . So I though to try running multiple instance of robust too and separate assets service on an other computer. So my idea is to have appropriate robust.asset.ini for robust instance serving assets and the remaining service in robust.noasset.ini for the other robust.ini I found this page very usefull in helping me address this split appropriatly http://opensimulator.org/wiki/Shared_Services_Configuration .

Following Diva Cantro presentation about splitting robust services server between LOCAL and REMOTE ref: https://www.youtube.com/watch?v=waxDKGmYWFw I am trying same per her presentation in addition to the asset service split already reported above. The resulting split between the three robust instence is presented in ref: http://3d.gimisa.ca:9090/static/config.html or by visiting my grid hypergrid dome in gimisa5.

Doing so I notice that Diva does use direct request to database instead of using connectors for service from outside of the firewall. She explain in the presentation with help of her hand diagram that its possible to have RobustOUT connect to RobustIN then to database per reference http://opensimulator.org/wiki/ROBUST . I have applied connector that idea for asset split as describe previously in this article.

FSAsset (Added note 200320)

In 2015 Osgrid had a major asset crash. This was an experience for all grid owner as to what can happen if database corruption or hardware failure treat you grid installation. OSgrid like any good service providers had implemented ways to overcome both these disruption by using raid mirroring as related in following article http://www.hypergridbusiness.com/2015/03/avination-helps-save-osgrid-donates-cluster-storage-solution/ .
I am not acquitted any closely with OSgrid operation more then a user is. I have no clue of the nature of the failure but the article is point to the use of FSAsset as an alternative to whatever OSgrid was doing. I am using MariaDB in for my database which is a fork of MySQL. But the problem remain that large database file size are created when using standard way of storing the asset in the database itself.

There is no magic in storing information and the compress asset data has to reside somewhere. Melanie solution is to have it stored in the file system itself instead of the database and use the database as pointers ONLY to the proper asset on disk . This makes the database itself much less subject to corruption and reduced its size to be easily dump for backups remotely.

There is more detail about FSAsset setup in http://opensimulator.org/wiki/FSAssets_Service . The article is suggesting to use FSAsset for 50G database size. I decided to go forward even if mine is a mere 15G. My problem is backup of this HUGE database . A backup system can be full backup like raid images , now a day with low pricing for storage space this is the preferred choice. Because of limited resources I am still using incremental backup or what is call snapshots of the drive with the help of DIRVISH a linux backup program. This method takes up much less space due to the incremental nature of the storage. But you can imagine that using this method with database file size of 15G is somehow defeating the purpose. Having smaller database file size and using files system for storage offer the elegant alternative of using system tools and standard backups solutions.

One more interest raise by Melanie FSAsset storage is the possibility of database reconstruction using the files already stored in the asset directory. Though I could not find any documents that would support that , I am incline to believe that even with destruction of asset database and corruption of part of the asset directory it would be possible to reconstruction the database pointers from the good element of the asset directory structure.

Database and large file are MySQL engineered way to speed for large database installation with many users and demanding services. Getting out of that framework has detrimental effect on speed. In normal asset upload I saw no noticeable delays. But I found that speed is the cost when loading large oars of fresh new asset. FSAsset first checks the database to see if there is a pointer to the UUID of an existing asset when loading oar to avoid loading duplicates and destroy existing assets. So as asset base increase to more then 50G ( the recommended size to use FSAssets) this should trend in reducing the asset handling time and damper the delay witnessed in freshly loading grid like I did.

About a month after writing this paragraph I have a hard drive crash. It was time to face the music and see if restoring the mysql database and FSasset folder would do the magic. I am happy to report it did....

Note to 0821 grid users. There is an issue with FSAsset database handling on that version. Reference to that mantis is http://opensimulator.org/mantis/view.php?id=7794 . The patch included in that link need to be applied to release version 0821 to correct the problem. If you need a tested compiled version of that correction don’t hesitate to contact me. </i>

undocumented FSasset robust commands:
show asset stats : provides asset counts show digest <ID> : provide detail of assetID, storage location and type. delete asset <ID> :Allow deleting an asset by assetID from asset table.

DATA:URL

Data:URL replaces a tag reference with direct encoding either of image text or html. They are an interesting tool in web page design to lower the overhead of getting the page to user by embeding the data direcly in the page content instead of by reference. By doing only one call to server this provide for a more efficient page loading.
This way is available to media on prim or to html server via scripting in opensim / SL . The documentation provided by second life can be found here http://wiki.secondlife.com/wiki/LlSetPrimMediaParams/Tricks . Any prim can be use to the limit of 1024 characters as web server or to present content as a web browser where that content is included in a data:URL string. I have also tested that javascript is available as well as html style formatting. You can find two example of use of data:url in gimisa5 store of my little grid. one as a sound media testing tool i did to validate different codecs and the other one present a picture and text from notecard containing html. You can also find work done by Edison.Rex @hg.zetaworlds.com where data:url is use in Multifunction Nautical Navigation Panel to dynamically present speed and navigation data.
One very important advantage of DATA:URL use in MOP is full control of dynamic presentation. While it represent very little load on the server compare to the use of a animate or dynamic texture . One draw back is that viewer are configured by default for MOP on request only which is leaving the content designer to request change to the user setting in order for the presentation to be visible.

IRC

Internet relay chat servers can be use to provide script communication between objects in different region. Something not so easily done with html internal servers. Reference is provided by both http://opensimulator.org/wiki/IRCBridgeModule#Object_chat_relay_mode and http://allenkerensky.com/ircbridgemodule .
I am using ngircd as IRC server ref: https://ngircd.barton.de/ . Accepted default except server name and welcome sentence. You can test your server by connecting to it with any IRC client with the address of your server. That server port 6667 (default) should NOT be accessible from the net if you want to keep things under control.
You need to copy paste the [IRC] part in your opensim.ini (simulator) from the link above. This is what mine look like :
[IRC]
enabled = true ; you need to set this otherwise it won't connect
server  = 192.168.2.xxx ; change to suite your could be 127.0.0.1
;password = your access to server password if needed"
nick    = gimTest ; any name will do Allen suggest region name 
user    = "USER gimGrid 3d.gimisa.ca:9000  * :gridwide bot" ;did not see where this is use 
randomize_nick = false ; as suggested by Allen prevent extention to nick 
channel = #opensim ; channel you want for your application 
port = 6667  ; standard port 
relay_chat = false ; if you leave this true it will listen to channel 0 (open chat) 
report_clients = true ; it reports when someone log  ( see note * )

commands_enabled = false ; I am not using the command feature 
command_channel = 4711   ; command script channel 
access_password = "xxx"   ; password 

relay_private_channels = true  ; this is where we have object communication 
relay_private_channel_out = 4712 ; any script channel you want to llSay to IRC server 
relay_private_channel_in =  4713  ; any script channel you want to Listen to IRC server
msgformat = "PRIVMSG {0} : {3} :{1}" ; format of what Listen function receive , {0} is nick of sender, {3} is message , {1} is sender 


The following is a test script that show how this come about inworld:

//gimisa@yahoo.fr
//to use this script avatar type a message inworld on channel 33 . example : /33 Hello World!!
//as seen from script:
integer relay_private_channel_out = 4712;
integer relay_private_channel_in = 4713;
string password="xxx";
string from="TESTER";
default
{
    
    state_entry()
    {
         llListen(33, "",NULL_KEY , "");//to capture the avatar message to send
         llListen(relay_private_channel_in, "",NULL_KEY , "");//to capture message from other object. 
         
    }

     listen(integer channel, string name, key id, string mss)
    {
        if( channel==33){
             
             llSay(relay_private_channel_out,llList2CSV([password,from,mss] );//sending message to IRC server
             return;
            }
        llInstantMessage(llGetOwner(),llList2CSV([channel,name,mss]));// receiving message from IRC server and relay back to owner
    }
}


The /33 Hello World!! show up on IRC server as <gimTest> Hello World!! :TESTER and in world as in all other listening regions 4713, gimTest@IRC, Hello World!! :TESTER . Note that you can set the from to any string you want which is neat to qualify the message further for scripting purposes . As an additional application note it seem as far as I could test that you cant use USER chat command like /PRIVMSG in your message to IRC server because the IRC module add a space in front of the message.

  • Note: that IRC report_clients = true; cannot be use to report arrival of client in the region the IRC script is running . It reports to all others region you have IRC implemented but not the one seeing client arrival.

EMAIL 180828

EMAIL is an other module of interest at least to me in opensim . Both EMAIL and IRC are complementary communicating with avatar,or between avatar and object . For exemple , a friend pointed at me laterly that my IMs dont get saved. That is IMs made by other in gimisaOS grid show a message saying that it not saved due to message limit. I dont send my IMs to email cause that option is not available to me in singularity . No idea why, is it a bug ??.

Anyhow, the problem is I use a lot of instant message from object in my scripts to get running status and so on. I have DIVA offline V2 configured in 090 . I have validate that 25 instant messages from all sources is all that get save in database for delivery when you back on line. I do receive the one that appear in database but the other that are cap off and never stored are simply drop. No warning in scripts, but warning is effectively provided in IMs status message to attentive emailing avatars.

I could send my instant message to IRC instead of IMs to me to save on the limit and keep the 25 storage capability for avatar to avatar messages only. But this is only partial solution. Obvious solution is EMAIL. It would be nice to find why my singularity will not accept sending offline IMs to my configured email is one thing . And using the scripting function already available to object IMS to emails is an other. I will not repeat here the very good tutorial made http://liftedpixel.net/blog/posts/getting-llemail-to-work-in-opensim. Even if done for diva distro this tutorial is accurate and is getting you almost there.

Ya almost. The module ini [SMTP] portion that you will find in opensim.ini need address of you prefered SMTP server with credential to access it . Configuring this data is not different then configuring you account in outlook or any email client you use. You need the same information , so look into you email account info and complete the ini data as required is all it takes.

Well almost, if your account is like mine, you hit a soft spot with the encoding requirement. Most of smtp these days use some kind of encoding for credential information ( passwords ) . And the opensim EMAIL module does not have encoding information integrated in configuration ini file. (something that certainly could be corrected if of interest to developpers ). So to connect to external smtp server that need encoding you off luck unless as suggested you find one that dont use encoding.

And on a linux machine .. yes ubuntu again . You can install a number of smtp servers. But having you own email server come with all kind of issue and troubles that you would certain be happy to avoid when considering that all you need is offline IMs capabilities via email. Nevertheless its possible to install postfix a mail server for local email only . Refer to WIFI email further down this page if this solution is of interest to you.

To the rescue linux offers a very tiny SMTP mailer call nullMailer. Its a snap to install and configure to DIRECT your emails to a email server of your choice ... including encoding !! This is not a tuto to install it but if you need help come my way , it will be a pleasure.

So arm with nullMailer what you do .. Ya one more step , cause nullMailer is only SENDING email you need something that will receive the one on the module side of opensim and relay it to nullMailer. What I use is the piece of code here running on python.
import smtpd
import asyncore
import subprocess

class CustomSMTPServer(smtpd.SMTPServer):
    
    def process_message(self, peer, mailfrom, rcpttos, data):
        print 'Receiving message from:', peer
        print 'Message addressed from:', mailfrom
        print 'Message addressed to  :', rcpttos
        print 'Message length        :', len(data)
	print 'Message               :', data
	cline = 'echo "'+data+'" |  mail -s "'+mailfrom+'" rcpttos'
	return subprocess.check_output(cline,shell=True)


server = CustomSMTPServer(('0.0.0.0', 1025), None)

asyncore.loop()


These few lines above from python2.7 will do the magic. So that you can input in your ini file the following very simple credentials , where this python file and opensim operate on same machine.

    ;# {SMTP_SERVER_HOSTNAME} {[Startup]emailmodule:DefaultEmailModule enabled:true} {SMTP server name?} {} 127.0.0.1
    SMTP_SERVER_HOSTNAME = "127.0.0.1"

    ;# {SMTP_SERVER_PORT} {[Startup]emailmodule:DefaultEmailModule enabled:true} {SMTP server name?} {SMTP server port?} {} 25
    SMTP_SERVER_PORT = 1025

    ;# {SMTP_SERVER_LOGIN} {[Startup]emailmodule:DefaultEmailModule enabled:true} {SMTP server user name?} {}
    SMTP_SERVER_LOGIN = ""

    ;# {SMTP_SERVER_PASSWORD} {[Startup]emailmodule:DefaultEmailModule enabled:true} {SMTP server password} {}
    SMTP_SERVER_PASSWORD = ""



Please note that this crude SMTP server is not available from outside grid on port 1025 so it cannot receive external mail .Can this be abuse ... Oh yes like anything, but its functionnal minimum and yours to have fun only !! In your script inworld now you can now use something in line with the following and send the information via email instead of crowding your instant messages.

string emailAddress = "gimisa@yahoo.fr";
string emailHeader = "Someone touched me!";

default
{
    touch_start(integer num_detected)
    {
 
        key id = llDetectedKey(0);
        string name = llDetectedName(0);
 
        llEmail(emailAddress, emailHeader,
            "I was touched by: '" + name + "' (" + (string)id + ").");
 
        llSay(PUBLIC_CHANNEL, "Email has been sent.");
    }
}



FITTED vs BENTO

I salut Gaia work in doing avastar and support. For the sake of making this discussion lets call FITTED the adjustable mesh body and lets call RIGGED the rigid original skeleton ( rigid for Breast and Butt ) . He has provided his bento rig in https://blog.machinimatrix.org/avatar-workbench/ that has all the deformation bone required for fitted mesh body using standard sliders. Now come bento . The bento skeleton present officialy by SL for blender ( http://wiki.secondlife.com/wiki/Project_Bento_Testing) is RIGGED ( rigid ). Iit cannot be adjusted as a fitted skeleton can. ( rigid for Breast and Butt ) . It is missing the deformation bones required for fitting behavior to apply. It had probably been corrected in later releases as maya object but no other release were done in DAE format.
Anyhow that trigger to probe the behaviour difference between RIGGED body and FITTED clothing. Having a rigid body allow adjusting the FITTED mesh clothing to the rigid avatar by way of adjusting the cloth breast and butt while the rigid avatar will stay as is.
In addition the SL BENTO mesh body can be textured using skin and clothing texture since it has same UVMAP as system avatar.
The problem of shape vs clothing adjustment was formally solved in system avatar by adjusting the cloth attachment to fit the avatar . The introduction of fitted mesh avatar which is only a layer on top of the system avatar uses the sliders to modify the skeleton which prevent adjusting fitted body and fitted cloth separately.
There is many clothing shapes floating around from the former rigid design to the later fitted one. They fit system rest shape with more or less success and at a leaser degree any other shape twist. Fortunately Gaia has made a nice effort to insure that the work done with their blender plug in fits the system shape as best as possible given the proper mesh model shape sizing versus the inworld slider position. So that what you see in blender is what you get in virtual worlds if the two model are adjusted appropriately.
You can scale a mesh cloth inworld as you want. The armature bone will scale with it so that the weight relation of the bone to the mesh remain the same. There is no way to modify a mesh clothing inworld except with body sizing sliders.
In my experience with rigged body and fitted mesh clothing where cloth breast and butt can be adjusted separately from the rigid body I saw that it was possible to optimize the fittings of clothing for those parts of the body. The result is very partial since it involves only two adjustment over the total available for the shape. It simply demonstrate the concept that adjustment of the cloth need to be done on its own from the body shape.
It seem what is needed to get back the freedom of choice once possible with system body and clothing is to mimic the former behaviour inworld and allow adjustment of the different cloth separately from the shape of the body. This could be done by way of SELECTING the part that the body adjustment slider influence. Future will tell...



RLV


Replacing NPC in area where NPC functions are not active for the user was the idea behind exploring RLV. RLV is the acronym for restrain love. This is a feature available in certain viewer that with client consent allow certain script controls. The full spec of this feature can be found at http://wiki.secondlife.com/wiki/LSL_Protocol/RestrainedLoveAPI and an example of the script control that can apply is provided with http://wiki.secondlife.com/wiki/Quick_Collar .
The idea is to create an alternate avatar that can obey script function . One famous such bot is Corrade http://grimore.org/secondlife/scripted_agents/corrade . Corrade give scripting access to all function a viewer have. NPC are more limited in the command available and RLV is easier to implement to match same feature as NPC. Naturaly the cost is a full f ledge agent load on the server compare to lesser load a NPC presents.
RLV can be use with script control to attach/detach an item from inventory. The attachment script can then animate and move the BOT. In addition its possible to use a script to teleport a BOT from one area to an other something NPC cannot do. The RLV functionnalities become necessary as a work around in version 090 as its not possible to use the regular lsl script function llTeleportAgent or llTeleportAgentGlobalCoords to teleport an agent using an attachment in opensim. With RLV the function lOwnerSay( "@tpto:<X>/<Y>/<Z>=force" where X Y Z are global coordinates which make this function equivalent to llTeleportAgentGlobalCoords. RLV provides also a way to rotate a BOT which is hard to do with an attachment. By using llOwnerSay( "@setrot:<angle_in_radians>=force" ) its possible to do that.It is interesting to notice that the 0 rotation in opensim is with avatar facing east.
Therefor that RLV function need description correction as follows:
Forces the avatar to rotate towards a direction set by an angle in radians from the north is wrong and its direction to the EAST.


I have done such a bot for a pet DOG that will follow you in any region that allow scripts. A demo is available in gimisa5 region of my little grid.


OPENSIM version 090 llMove2Target, llListFindList


Two very usefull function if you do scripting. llMove2Target will allow your avatar or physic object to be moved around with script . The second one I use a lot to do indirect reference.
Problem with move to target of version 090 is that it get your avatar in fly mode / landing transition when your avatar is moved to something else then flat land . I did a hand to hand movement using this function where two avatars hold hands and this cause erratic behavior that break the synchronization between the two actors. The work around I found for now. Is to set the target z value to 0.5 . The draw back of this work around is that it allow avatar to walk on terrain only .
The problem with list find list is a bit tricky . If you store a string variable in list you can easly convert it to an integer by extracting the value to with llList2Inter function . But contrary to 0821 if you try to find a string like 123 with a search on an integer like [123] it will fail. So there is now differentiation in the search between both types . Using ["123"] in the search will be successful. That brakes a few function I have including the object sorter I did to help make sense of large inventory .
See example of work around for those function in gimisa5 store.




BACKUPS


Backups is the most important strategy for system reliability. There is many method and software to help you in that task. I present my receipt using linux server system yours to adapt. There is three type of backup. Full backups , incremental backups and a variance of it call snapshots. I use G4l to fully backup the disk drive every 6 months. https://sourceforge.net/projects/g4l/ . And I use dirvish as a snapshot utility that provide me with the flexibility of incremental daily backup with the convenience of a snapshot where you select the date and the content to restore. The detail of my setup can be found in http://3d.gimisa.ca:9090/static/backup.html .

CACHE


In opensim there is server cache and viewer cache. Clearing cache in viewer is often done to correct corruption or to simply clean it of unnecessary cumulative stuff. Server side is use by the simulator to allow faster transmission of asset without having to go back to asset server. See http://opensimulator.org/wiki/AssetCache for a presentation of the server side cache. Lately Alexandra RunningBear from osgrid ask me if I was using server side cache to help for lag. My answer was that I have created FlotsamCache.ini from FlotsamCache.ini.example with the defaults included it the file.
 ; Set to false for no file cache
FileCacheEnabled = true

Alexandra kindly pointed out that since I have more then one simulator running; each one of them is running his own cache in location specified. Which is by default:

 ; cache directory can be shared by multiple instances
CacheDirectory = ./assetcache

But since in my case I am using the SAME instance to run different simulator (see my configuration for detail) . ALL simulators use the same cache location. The default file cache timeout is set to 48 hours. So each simulator check to see if the asset in the cache was not access within 48 hours and delete it from cache. This is much less then optimum as every one of the simulator is trying to control the cache for its own assets. So she suggest using disabling time out and use a manual approach to cache control. In order to do that the configuration need to be changed for:
         ; How long {in hours} to keep assets cached on disk, .5 == 30 minutes
         ; Specify 0 if you do not want your disk cache to expire
         FileCacheTimeout =0 ;was 48 default

         ; How often {in hours} should the disk be checked for expired files
         ; Specify 0 to disable expiration checking
         FileCleanupTimer = 0 ;was  168.0  ; ( 7 days ) 

So now that the cache is manualy controled how do I do that ??? In linux that mean a cron job and in window a scheduled task. My system being linux the following address the cron job. The job itself is rather simple as follow:

file name cache.sh:
#!/bin/bash
dat=$(date --date="-30 days" +%y/%m/%d)
dat="fcache expire $dat"

echo $dat

screen -xS screenNAME -X stuff "$(echo $dat)
fcache status 
"
echo done
the crontab command in this case is :
5 1 * * 0 sh cache.sh

The crontab run cache.sh every Sundays at 1:05 . The job execute a console command in the simulator running under screenNAME and clean cache for 30 days old assets. Also it requires a status of the cache so you can tweak the setting to optimum value for your case.


VIRTUAL MACHINE

Combining Opensim a virtual world with a Virtual Machines is an interesting idea. VirtualBox is a software to run a machine inside a real machine and opensim is a virtual life you real life can enjoy. To have your own world , you can use the predefined download from the major grids and attach a region to them. Osgrid , Metro, Neverworldgrid, and Zetaworld to name a few that offers that possibility.

If you want to have your own thing on the metaverse planet, one choice is to use the download at opensimulator ( ref http://opensimulator.org/wiki/Download ) . Out of the box it will install as one region standalone. For hypergrid, use diva distro. ( Ref: http://metaverseink.com/Downloads.html ) This distribution allows an easy install of a hypergrid enabled standalone. Another choice is sim-on-a-stick. A diva distro flavor installed on a USB stick that you can run easily by simply plugging in the stick in your machine's usb port.( ref http://simonastick.com/ ). It dates a bit now with OpenSimulator 0.8.0 post-fixes. Also available and current in release is , diva built DreamWorld, and robust grid DreamGrid ( ref https://www.outworldz.com/outworldz_installer/).

When Lisa Laxton from IMA came to me about an installation on her rented server for grid.metaversedepot.com she had choices from all above. In addition, she had the choice to use the no longer supported MOSES-in-a-box (ref https://github.com/M-O-S-E-S ) not current and not hypergrid enabled. She tested all of the above solutions but really wanted a better solution that was platform agnostic for anyone to use. DreamGrid is a nice easy to use tool but it is limited to the Windows operating system. The Windows operating system is also not free for anyone to use like Linux. Other operating systems like Mac and Solaris are also not supported. As demonstrated by the MOSES team, the free to use VirtualBox will run on all of these operating systems and allow the creation of VM's to host Open Simulator.

So the idea is to have ROBUST hypergrid enabled Open Simulator grid using multiple virtual machines with a clonable VM (for adding simulators/regions) that will run in the free VirtualBox software for any major operating system? If so, is it also possible to simplify installation and administration without a graphical user interface so it can be install on servers?

So install the virtualbox software ( ref https://www.virtualbox.org/wiki/Downloads ), then import the virtual machine image to start the grid. And run !! ... Hmm, not so fast !!! The difficulty in opensimulator installation is ports. Virtualbox cannot solve that nor any of the above distributions. I am sorry to say its not easy to do for everyone. Luckily for rented servers like Lisa, a mechanism is in place to help port access settings.

So virtualbox is easy to install, set, and run on a server. What else is it good for? Plug and play ...lol!! You can have a machine running, save state, change stuff, etc. If you realize you did wrong you can fall back to a saved state. You can clone a machine and have two simulators ready in minutes ( adjusting for ports ). You can send that clone to someone else to be part of your grid. It could, I believe provide sim on demand. That to be developped. Backup is as simple as cloning the machine. ( This is a large file. ) Any problem or extra load on one simulator does not interfere with the other running machines because of the inherent segregation between them. It also provides protection to the host system as it remains out of reach from the guests.The buzz word is flexibility. The limit is yours.

But what are the drawbacks? Large space counted in Gs for running a 180MB program. Limited resources by simulator that will likely affect performance compared to the same install directly on a host. Management of machines parked. Operating experience will tell over time.

DIVA has done a proof of concept about searching capability in opensim. The module required are part of the diva distro that can be find on her web site http://metaverseink.com/Downloads.html and for people that dont use diva simulator standalone distribution a addon is availbable to provide the appropriate coding. Detail on her work can be found here: http://www.metaverseink.com/blog/news/metaverse-ink-search-for-opensims/ . Metaverse search option are available at this location http://metaverseink.com/docs/tips.html . Please note Metaverse search facility is broken since about begining of the year as it was before and as it was never intended for full fledged support as opensim searching tool. Any grid owner can implement his own search facility using the simulator datasnapshot data with the help of the two php sources file ( search.php and register.php) added in in the zip link provided at then end of this article. As explain here http://metaverseink.com/docs/listing.html To create your owne address search location using the above is as simple as populating the opensim.ini file with your site data. For exemple for my location (3d.gimisa.ca:9000 ) the opensim.ini dataSnapshot configuration is changed as follow with data_services pointing to metaverse search location in addition to my own internal location search facility :
[DataSnapshot]
    index_sims = true
    data_exposure = minimum

    gridname = "GiMiSa"
    ; 1 hour
    default_snapshot_period = 13600
    snapshot_cache_directory = "DataSnapshot"
    data_services="http://192.168.2.105/register.php;http://metaverseink.com/cgi-bin/register.py"

Added 190901, As anyone will notice the data collection is a simulator function. Its results can be pull from anywhere and use by anyone to make a search facility as did DIVA in her example. This is exacly what Fred did with dreamgrid with http://www.hyperica.com/Search . To use it modify your datasnapshot registration field as follow and you will allow searching via his web page. You can also use the search object I did in gimisaOS similar to the one I present to access my own grid objects. I leave metaverse ink there to show you that more then one search facility can be use even if its does not seem to be active anymore:

data_services="http://myownfacility.com/registration.py;http://metaverseink.com/cgi-bin/register.py;http://www.hyperica.com/Search/register.php"

If you do like I did your own searching facility for your grid to use the viewer to access the search results you need to configure a [Search] option as detail in the following link. More recent version from Kcozens updated https://github.com/kcozens/OpenSimSearch (My work is using this OLDER source : https://github.com/OS-Development/OpenSim.Search) . You probably could now use Kcozens version in replacment for following. ( not tested )

This link dates and correction of the query.php included in the reference is necessary. You might also need a more up to date (opensim 0901 ) compatible version of the OpenSimSearch.dll Both are included in the link bellow . Please note that at the time the search facility did not includes classified ads as that feature was to come with the profil module. Please not that in order to get the classified ads working you need access to the grid database contrary to the other features that have NO particular access requirment except the creation of its own database. The query.php included as the following link includes that feature. If you dont have grid info the module will work anyway without the classified ads feature.

I just completed coding the eventparser.php to add the event search feature to my grid. This php routine connect to http://yourworlds.eu/hypevents web site and parse the event published there from multiple grid and populate the events table of the ossearch database. You can then use the viewer search event tab and get the event information coming from this web site inworld. Thank to Fred (https://github.com/Outworldz/DreamWorld) for his precious indications . Right clic this link and save in on your computer to get your files http://profil.gimisa.ca/files/OpensimSearch.190922.zip After 092 nov build it requires a new compiled version of OpenSimSearch.dll you will find it here : http://profil.gimisa.ca/files/OpensimSearch.210215.zip
Search via viewer and a demo object searching can be found and tested in your friendly gimisaOS grid.


INSTANT MESSAGES (210715)

They are the backbone of social interaction in opensim alone with local chat and voice. This feature works very well in local grid where two avatar or an object to avatar communication is possible across the entire grid. HG INSTANT MESSAGE is the ability to communicate with other avatar across grid. The general spec of that initiative is given by DIVA in her 2011 blog ref : http://www.metaverseink.com/blog/hypergrid/friends-and-im-over-the-hypergrid/ . In 2013 she release a addon that eventual got integrated in opensim core. This initiative was a success within DIVA distro but was never fully successful in core implementation. The role of the secret key is explain by DIVA in the following terms:
"An HG friendship establishes 2 pairs of data, each stored in each user’s user services. That data is “signed” with a random number known only to the 2 services and the simulator where the friendship was established, so that, even if the user services (hg friends, to be precise) are exposed to the Internet, no one but the holders of the signature can manipulate the friendship data".


The friend database include two entry. One is all friend to you. And the other is the opposite HG People friend to local grid users. That secret key stored in friend database is used to allow to be notified when you login/logout (and vice-versa), to change your objects (and vice-versa), to see you on the map (and vice-versa), etc. All services would be affected equaly if the secret key is the determining factor of the problem. But they are not . And this discrepancy in service rendering, online indication, IM delivery and so on is an indication that the trouble is a question of how each of this service works. What is puzzling is that ONLINE indication should be a simpler feature yet easy to make work properly. If we follow DIVA spec the intended action is that ONLINE status should follow the HG traveller in his quest. As long as he is traceable by his friend the HG friend should be shown online. IM messages and other friend service should be equally successful. At this current version 0901, the only reliable way to have contact with HG friend is to move along to their local grid to confirm online indication and establish contact.
I have extended the discussion with an example test and discussion to overcome the limitation of a user page gaciously offered by opensimulator.org. See http://profil.gimisa.ca/opensimCommunication.pdf
The above communication document is still valide with 092 september release. But Since a few months now has raise a busy exception to IMs sent by people replying to your IMs . I though it was my configuration that needed update and then started checking the source code activating debug messages. Finaly I found that https://mosthugs.win/ had look at the situation and found a cure that work for me .


TOS

No, this is not a discussion about GDPR. If you want information or directive about GDPR, search with google. This text is rather about help with installing DIVA TOS addon to a grid.

DIVA TOS is a simulator query for acceptance of the TOS, with a constraint of ejection if not accepted. Its a simulator function ( opensim.exe). As a simulator function, it works on each running simulator where it's installed. Any region visited by a user that have DIVA TOS enabled will will need to validate the user for TOS (accept or decline). Any region without it will disregard the requirement. Once a TOS is accepted in any regions it will not get any new request for that user unless a TOS change warrant this new acceptance.

The process of installing TOS involves ONLY the simulator and should be relatively easy since diva has an addon available for this function noted in her simple addon steps per reference. ( Ref: http://www.metaverseink.com/blog/diva-addons/wifi-and-other-diva-addons/ ) If I write to you it's because well, it did not go that easy !!!!. To figure out my mistake, I went to the original DIVA distros. Diva includes the TOS feature for a long time now so it should be a snap to see how its done in a her standalone distro then port that to a grid. ( ref: http://www.metaverseink.com/Downloads.html. )

Well this investigation step did not go that easy either as these are broken with both DIVA 0821 and DIVA 0900 distros. V So, instead of talking to you about what does not work, let me drive straight to what does. In DIVA distro 0821 and 0900 what I found was wrong first is the tos.html file. It needed to be modified. The DIVA version, if I am correct, is expecting information both in the GET QUERY link and in the reply POST of the tos.html page. Unfortunately, as I could test, the GET part gets lost and is not picked up by the code when submitting the post. Diva Wifi addon is geared to receive the information from that html file and sets a TOS field in the gridUser database table. The service.TOS is the code in diva wifi responsible to receive your acceptance post. I needed to modify it since now all the information is provided by the post portion the tos.html. I am not C# developper so I did best with what I know. Armed with these changes DIVA distro 0821 is working in providing a TOS request to visitors and recording it properly.

So back to the grid now. Simple enought I believe a new tos.html and a change in service.TOS. Did I say service.TOS? Oops the TOS addin Diva is providing is for simulator so its not at all a direct replacement for the code in wifi!!

So, I had to get the source of DIVA TOS addon. Downloading the source and compiling of Diva addons is rather well explained here ( ref: https://blog.inf.ed.ac.uk/atate/2015/04/06/diva-wifi-on-windows/ ) and the Diva addon source available here . ( ref: https://github.com/diva/diva-distribution/tree/master/addon-modules. But hum, no TOS addon per say!!!

So back to square one. It wont take you long to see the red flags when starting your simulator caused by some missing parts in the TOS addon module. You need to copy two files from the diva distro to implement the missing portion. Those are the Diva.OpenSimServices.dll and the Diva.Interfaces.dll. You also need the TOS.ini modified to point to these with this configuration (GridUserService = "Diva.OpenSimServices.dll:GridUserServicesConnector") .

So now you get an uncomplainng TOS addon module that will load nicely and that will greet your visitors with a TOS text and acceptance buttons. You have a web page to accept the TOS that will be presented to them and an accept button to update the TOS field in the grid server database. Perfect ... well not quite. When the TOS module come back 5 minutes later to see if you have accepted the TOS, it can't get the reply. Damn, sorry but it kicked you out.

A good reason for this is that the data field TOS is missing in gridUser table on the grid server side which is something that wifi doesn't seem to implement. So creating the field is straight forward with the following sql command. ( use robust; ALTER TABLE GridUser ADD TOS char(128); ) So now it writes something to the database. But still kick you out even if you accept the TOS. Hum!! I find that the answer is not pushed back to the simulator when requested by the TOS module.

But going around the missing pieces of information, I found that the some modification to the grid server was required to send the proper TOS information to the simulator TOS module. So here are the changed to dll files to be applied both to grid and simulator for the DIVA TOS to work with version 0821 and likely for 0900 (later not tested) .
In grid server side the following dll need to be modified. :
........OpenSim.Data.MySQL.dll
........OpenSim.Services.Connectors.dll
........OpenSim.Services.Interfaces.dll
........OpenSim.Services.UserAccountService.dll
and in grid server addin-registry wifi addition you need to modify the
........Wifi.dll
........tos.html
in the simulator the following file need to be modified:
........Diva.Interfaces.dll
........Diva.OpenSimServices.dll
........OpenSim.Services.Interfaces.dll
and in addin-registry you need to modify the
........tos.ini

The required files here ( http://profil.gimisa.ca/TOS.bin.zip ) and source files here.( http://profil.gimisa.ca/TOS.source.zip )


WIFI emails

I have been ask to look at WIFI email notification. Either for new client or for forgotten password. DIVA failed to send mail ,even with ssl authentification on port 465 or TLS on port 578 with proper certificates installed in mono per DIVA suggestion.( ref: https://github.com/diva/d2/wiki/Wifi)

I did also test a simple C# routine to send a test email. I did input the same credential I use with my email client unsuccessfully either. Only port 25 without identification seem to work properly with mono C# emails.

There is not many smtp server anymore that handle port 25. In case yours dont , the solution I found was to install postfix a full mail server. And to direct wifi to localhost , port 25 , providing a default return email and no password configuration as follows in wifi.ini setting.

 ;;email working with internal postfix routing
SmtpHost = "localhost"
SmtpPort = "25"
SmtpUsername = "your@returnEmail.com"
SmtpPassword = "nopassword"

The postfix configuration to use is local only so you dont risk getting identified as spammer by routing unwanted stuff. In this configuration you have to use a real return email as SmtpUsername in wifi otherwise the email will be rejected. I did not install any mailer so that system emails are not forwarded. Install postfix with local configuration when requested. It did not work out of the box for me . I replaced it by the following, for postfix null client ref: http://www.postfix.org/STANDARD_CONFIGURATION_README.html#null_client


myhostname = vmbox1.localdomain
inet_interfaces = localhost
myorigine = $mydomain
relayhost =
mydestination =

With this setup wifi email were now forwarded appropriatly on install in ubuntu 16.04 .


PHYSICS

Everyone know it the sciences field that study nature and properties of matter and energy. In opensim its the simulator motor responsible for movement. In opensim you can set an object to be physical in edit panel build tool. Doing so allow the object to be moved by virtual physics forces.
In opensim there is a number of physics engine that one can use. You will find the configuration option about physics in opensim.ini file startup section. As of opensim 0901 the choices are:

 ;; Default is BulletSim
 ; physics = OpenDynamicsEngine
 ; physics = BulletSim
 ; physics = basicphysics
 ; physics = POS is a basic physics with collision.
 ; physics = ubODE Ubit modification to ODE physics

Arm with that I wanted to do a bowling game. That game needs physics plug in to calculate the trajectory of the ball in motion and its final impact effect on the pins at the end of the alley.

This is a very demanding application for a simulator. A bowling alley is oiled for two third of its length. So the ball is sliding until it hits the higher friction surface where it starts a rolling action. The spin imposed by the bowler on the ball will take effect in that portion and result in a hook change in direction. Following impact the ball interaction with the pins it hits will changes its trajectory while multiple collision between pins itself must be rendered.

Opensim using bulletsim and ubODE was able to render the game successfully. I noted a few point of interest between the two engines. In bullet it was possible to set the physic feature of the objects to the REAL values of ball weight, pin weight, and alley friction. In ubODE physics it was necessary to use complementary scripting function osSetInertiaAsSphere for the ball and oSetInertiaAsCylinder to obtain similar results.

A ball is an interesting object in physics. When sliding it can be seen as a cube. Friction is minimized on the first part of the bowling alley so movement speed should be constant and trajectory be a straight line. In the second part of the alley friction is more important and should cause rolling instead of sliding. So the spin the bowler impose on the ball would have little effect on the ball trajectory until it reach the high friction area of the alley . Then we expect a rapid change of the ball direction in line with the spin imposed by the bowler. That is called the hook effect. Its similar to golf or baseball where spin of the ball and friction cause the ball trajectory change.

Bullet rendered that behavior as expected. Under ubODE it was necessary to consider a draging effect. In theory a rolling ball will continue rolling because there is little friction involved to stop its movement. But reality as we know is different and there is some dragging effect that will slow the ball rotation . The dragging effect on a 15m alley in bullet was neglectful but in ubODE physic it was important enough to warrant compensation.
You will find both bowling alley demos in my grid.


LANDING - POINT - TELEHUD

Landing points are define on a parcel using about land window. In the buttom of options tab you will find teleport routing. Select landing point and use set button to set location where you stand will force any one coming in your land via map or Landmark to rez at the define location. The landing define is unique and applicable to all including you .

By contrast deleting the set point but keeping the forced teleport routing to landing points you can use the estate/region window to define a telehud and spawning points . These users landing points will NOT be applicable to you as owner.

First rez a cube make it small phantom and transparent. You optional can name it telehud. While still selecting the object in construction window , select Region/Estate window , region tab, and hit the Manage Telehud button. With the telehud object you just created still selected you should be able to connect it as telehud with the connect button. If not make sure you select the telehud object . That is it. That is you landing point now . The connection is like a bookmark to the location of the telehud object. What is fun is that you can move that telehud object anywhere you want and the landing point will be adjusted accordingly .

You can add additional spawn point using the same interface. Spamn point are alternate landing points to the telehud. The spawn point use is either selected when the number of people in other spawning location is too big or simply when the selected teleport location is closer to the spawn point on the map.

To create addition spawn point rez an object where you want it. Hit the add spawn point on the telehud manager interface to define it . You will see a location in the manger window. Its the difference berween the new spawn point and the connected telehud. The object use to define the additionnal spawn point can be delete as its data is recorder with the telehud. Moving the telehud also move the spawn points.

C# - XENGINE - MRM

C# IN XENGINE: C# is supported as scripting language by XENGINE module same as OSL and the default LSL scripting languages. In order to allow C# the XENGINE ini section needed AllowedCompilers = lsl, cs . The advantage of XENGINE is that you can miss match language and write part of the script with LSL, OSL function and part of script in C# . The flip coin inconvnient is that you cant attach libraries "using libraries" in your script . Exemple of connecting outside object to inworld done by Jeff Kelley in 2011 illustrate the capabilties of xengine C# scripting. http://opensim-users.2152040.n2.nabble.com/Scripting-Having-fun-with-C-and-UDP-td6325728.html You will find an exemple of the XENGINE C# application in my store.

C# with MRM . MRM stand for mini region module . As explained here https://web.archive.org/web/20091221025159/http://www.adamfrisby.com:80/blog/2009/03/mrm-scripting-coming-to-opensim-soon/ that is a mini region module still active in opensim code that provide support for C#. Done by Adam Frisby in 2009 or so to help in developping code in opensim . One can implement C# as a script instead for testing or for ponctual application. Here none of the XENGINE LSL/OSL scripting function are available but one can use opensim as well as system code library. See http://opensimulator.org/wiki/Getting_Started_with_Region_Modules . You can find a few exemple of the scripting power of MRM in https://forums.osgrid.org/viewtopic.php?f=5&t=2869. There is also ( untested ) XMRM by JohnMcCarlfery https://github.com/JohnMcCaffery/XMRM an extension of OpenSim's MRM capability to allow scripts to be written externally and loaded in world. You will find an exemple of MRM C# in my store.

Opensing C# as scripting source has high treath level as it give access to all system funtions. One way to limit the treat is to assign a unique user as able to run such script by populating the [Startup] section of opensim.ini with the GrantCS = UUID . In the case of XENGINE the scripts will not compile with error. In the case of MRM the script will save but not run.

OAR CONVERTER

Its possible to convert OAR files from opensim to COLLADA for UNITY3D or to glTF .Opensim can export objects to collada files but they are not compatible with Unity. A complete 3d scene can be exported in opensim to OAR file then converted to a collada dae document compatible with unity import tool . The tool location is at http://www.nsl.tuis.ac.jp/xoops/modules/xpwiki/?OAR%20Converter .

Similarly a oar file can be converter to glTF format. The GL Transmission Format is use for efficient transmission and loading of 3D scenes and models by applications. The glTF format can then be use to be presented as webgl with threeJS javascripts as demonstrate in following link or import in blender 2.8 and later using appropriate add on. The tool location and detail is available at https://misterblue.com/oars/

SLURL

Is well describe in this web page. http://wiki.secondlife.com/wiki/Viewer_URI_Name_Space . This post look at three subdomaines of SLURL application. The teleport and the worldmap app for opensim hypergrid application and the default root application for local grid. Lets start with the later. secondlife://Region/x/y/z/, is a SLURL that you can post in local chat or in IM that an avatar can clic. In that case the avatar will be teleported in the local grid region and if specified coordinates of the grid they are in . Since its a URL the Region name need to be Escaped for URL format.

Passing a SLURL inworld is the equivalent of sending a teleport offer to someone so what is the point of doing so . Contrary to teleport offer that will bring the avatar to you , the SURL can send the avatar anyplace . Its more like sending a LandMark.

The interest come in scripting. Its not possible for a script to present the world map unless the proper function is called in a touch event. A script could give a LandMark. But the view on map button of that landmark is not working for hypergrid landmark. But its possible to present the SLURL. By clicling the SLURL worldmap application the map is presented with the grid and region requested. (ex: secondlife:///app/worldmap/3d.gimisa.ca|9000|gimisa3 ) where the region name is escaped if necessary. So that you can show that region on the map of the avatar without him touching the object. Similarly you can also offer to teleport him using SLURL teleport. (ex: secondlife:///app/teleport/3d.gimisa.ca|9000|gimisa3 ). Contrary to Hop://grid:port/region url . ( ex hop://3d.gimisa.ca:9000/gimisa3) the SLURL will work with ALL viewers.

PARTNER

Partner creation is not part of viewer function. So one cannot simply create the link with the viewer. Searching the web for the required tool one find Ferd dreamworld https://www.outworldz.com/cgi/freescripts.plx?ID=1115 . But that script is only the inworld function and will only work with its back end routine supplied with dreamworlds https://www.outworldz.com/outworldz_installer/ Searching the source in https://github.com/Outworldz/Dreamworld I could find the necessary code in RegionMaker.vb that compiled into start.exe. But could not get further with this information on my linux setup .

So I had to move on with an alternative I found done by djphil. https://github.com/djphil/ospartner That did not work out of the box either. But it did after a bit of fiddling that you will find here http://3d.gimisa.ca:8880/SL/ospartner.zip .

It simple to install by unziping the file in you wep site server root directory. This install assume that the web server is on same machine ( localhost ) as the grid server . You then need to edit the config.php file in ospartner/inc/ subdirectory and provide the credential to access your grid database .

The new web page for partnering will offer a login page for you and your future partner avatar. The proposer log first and invite his future selected between his grid friends . The future logs after and accept the partnership . Then both have to log inworld to see the result and celebrate!! If sadly the partnership has to be end simply log back in partnering web page and delete the partnership . I provide an inworld object using media-on prim to point to my grid partnering web page that can easly be modified for your own use for people that prefers and inworld object.

AO



AO in opensim. stand for an Animation Override ("AO"). Its a scripted attachment which replaces standard animations (walk, jump, stand, run, etc.) with animations selected by scripter.

One need to know that AO works differently in OpenSim. Thanks Melanie, in 2009 she introduced a CHANGED_ANIMATION event that is triggered allowing the AO script to apply the selected animation instead of the default one on each action of the avatar. Details can be found here as to why this was the best way to handle AOs with script example to use: http://opensimulator.org/wiki/User:Dz/AO

Futher development were introduced with version 0901. Now the function llSetAnimationOveride is AVAILABLE. It works by replacing the current animation define for each avatar animation state with the one selected by the scripter . So now the animation definition is replace instead of its animation implementation on each change_animation events. Its documentation is found here: http://wiki.secondlife.com/wiki/LlSetAnimationOverride

INTELECTUAL PROPRIETY IN OPENSIM

This is not a technical discussion per say but my creator reflection on what is the implication of creating/importing stuff in Opensimulator. Opensimulator is a software use to provide a service. So opensimulator software responsibilities is in the hands of the one running it. There is two main part in the opensimulator software . The grid services and the simulator services. The grid service is responsible for storing the raw assest while the simulator is responsible for import / export or creation of the assets.

Opensimulator software does not provide a TOS as part of his data but some distribution do. The lack of TOS does not implies the lack of responsibility between service provider of opensimulator and creator of intellectual propriety depending on the country of service. Since opensim is similar to Linden Lab second life software and since linden lab operate in USA. Their case can be use as example of acceptable practice in that country. According to their TOS ref: https://www.lindenlab.com/legal/intellectual-property-infringement-notification-policy its possible for a creator to present his creation case and get offending assets remove form the service provided. From the text presented its clearly the responsibility of the creator to defend his rights. In layman term who don't say anything agrees! In in the case that linden lab act on the notification they can do so ONLY on the extent of their service to users.

So what does it means for a distributed service like opensimulator which is an interconnected service offered by a multitude of service providers. Many has compare opensimulator to the 3d web. For the web content creator that want to address propriety rights also need to contact the offenders Internet Service provider (ISP) and represent his rights to each of them. And in the web case ISP will only act for their own domain of services. Creator in opensimulator face the same situation . They have to present their case to each operator of the software and ask their cooperation . In addition when opensimulator is accessible via web they also can contact their hosting Internet service provider for action. For further reading here is an interesting case story https://ryanschultz.com/2018/07/28/intellectual-property-issues-in-opensim-hypergrid/

So what does that say . Lets give the last word to https://fairuse.stanford.edu/overview/website-permissions/websites/

UPDATE

Is the action of downloading opensim official release located here http://opensimulator.org/wiki/Download and comparing the ini file for change with existing one. I use meld to do that . https://meldmerge.org/ I check the dates on them first as most dont change and if necessary validate my existing files against bin files opensim.ini, Robust.HG.ini.example and in config-include directory I validate GridCommon.ini.example, FlotsamCache.ini.example and osslEnable.ini. I use a modified version of GridCommon where I refer to gimisa.ini via an include statement for all my particular situation. See for more detail about that in ROBUST paragraph above. I cant compile the latest version of opensim but those who do can update at any time by pulling the development version and follow the instructions to compile it themselve.

In between release opensim compiles a nightly version that is available here http://opensimulator.org/dist/OpenSim-LastAutoBuild.zip . Sometime that is a bit too experimental and might compromise your existing production instlalation. A safer approach is to use existing grids compiled version offered by a few of grid owners. They are pull from development and compile as is or modified for the particular need of the grid. The remain compatible with opensim project mainly the one from osgrid. The following is not an exhausted list of the one available:
*dreamgrid: https://github.com/Outworldz/DreamWorld
*lanani: http://mosthugs.win/
metro : https://hypergrid.org/download/metropolis-os_091_DEV_PLUS.zip
neverworld: http://www.mediafire.com/file/0wx6vmsi9twbfxy/Neverworld_region_server.zip/file
osgrid; http://danbanner.onikenkon.com/osgrid/osgrid-opensim-08162019.v.0.9.1.64c56fc.zip
zetaworld: https://files.zetamex.com/zetaworlds/ZetaSim-b5-REL-preconf.zip

These are generously offered to you in order to connect your simulator to their grid. You can use those likewise official release by doing the same comparaison effort mention above. Each of these zip file contain the SAME copy of the liscense which state that redistribution and use in source and binary forms, with or without modification, are permitted. But Its a good consideration to ask the issuing grid owners permission and mention in your grid that you using their work to run these alternative release.

  • Lanani offer binaries stable and ready to use similar to an opensim release.
  • dreamgrid too offers binaries stable and ready to use. You needs a bit more work to locate the compiled files in the usual bin sub diretory of opensim directory itself which you will find under the OutworldzFiles directory. The bin compiled version has in addition the many diva*.dll that will allow you to fire up diva under grid mode should you like to do that. Yes opensim is that modular dll modules defines its options. In the same way you can also use globit economy as is or shut off its dll. You can as well run a basic standalone mode by renaming the appropriate dll.off and configuring the ini apppriatly .So doing an update with dreamgrid as your source of binnaries is possible even for a Mac or Linux machine. It comes out to not only compare you ini files but also you dll content to match the options you want to update with.

RENT

This article is presenting an adaptatation of Ferd rent box ( https://www.outworldz.com/cgi/freescripts.plx?ID=557 ) to populate search facility for land renting and monitoring.

Rent, in opensim is the action of obtaining a piece of land call a parcel. That parcel could be any size from 16m2 to a full 4,194,304m2 ya that is 8x8 256x256m !! You can either obtain that land from the simulator owner direcly. The simulator owners can sell you the land and make you an estate manager for that land so you can use it to your liking. You can also rent that piece from someone already getting it from the simulator owner and subdivising it for use by tenants.

Landlord can use an object to manage his parcels offering. That object put on the land of interest give the futur tenant a way to communicate with the landlord to obtain rights to use that parcel for building for a time. That object call a rental box is basicalling sending an IM to the landlord for him to allow you access to the land of choice. An other way to manage land offering is through the search facility of the viewer. People have parcel available for lease can set that parcel for sale for 0 or any price up and tick the available for search feature of the parcel window. The landlord is an estate owner or manager of that area so he can reclaim the land at the end of the lease. The box offers the help to micro managment the parcel by allowing leasing IMs, end of lease period warning, lease extension and lease re-newal while communicating with landlord on lease termination.

When using the datasnapshot openSearch , the search data is store in the ossearch database parcelsales table and populated through the datasnapshot process. See searching article above for detail on OpenSearch facility. The idea is to use the rental box to post the rental data instead of the datasnaphot and provide real time status of the parcels for lease. So that the landlord has a clear picture of the situation via a web page or a media on prim inworld object. I am providing through the following link the php code to parse and obtain available lease through the Ferd modified rental box while the inworld object can be obtain by visiting your friendly gimisaOS grid.

I am also providing a tenant monitoring function. The following zip file includes the parcelmonitoring table creation mysql command and the web page php script to obtain tenant last online date and number of prim in the leased parcel. The intent is to help lease managing on a free parcel . Also included inworld in gimisaOS grid is a media on prim object to access the web page. The Lease Agreement notecard included with the rental box discloses this monitoring in the exemple provide.

http://3d.gimisa.ca:8880/SL/osRent.zip


OSL FUNCTION ( update 210508 )

Using oslfunction is a plus in opensim. You can have more detail on OSL function in http://opensimulator.org/wiki/Category:OSSL_Functions . OSL function access depend on object owner cause of treath level . Threat leave are documented here : http://opensimulator.org/wiki/Threat_level . This article is about how I test for OSL function availability for the object owner so that my script can react properly . The principle is that a failing osl function will cause a crash of the event calling it in XEngine and a failure of the script that will require reset under YEngine so the following only work for XEngine. See further development under opensim 092 at the end of article for YEngine / XEngine environment .
variable definition with few function use in the subject script:
integer os_GetAvatarList=-1;
integer os_GetAgentIP=-1;
integer os_IsNpc=-1;
integer os_SetSpeed=-1; 
integer os_TeleportAgent=-1;
integer  os_MakeNotecard=-1;
integer  os_GetGridLoginURI=-1;
integer os_GetInventoryDesc=-1;


DEFAULT STATE_ENTRY(){
	llSetTimerEvent(.1); 
}

In the following timer I test each function so I know which one fails. But one could make it simpler by testing all function at once. Success is when the timer function reach its end . I test function by function when == -1 . And repeate the timer. If function succeed next pass see its value as 1 if fail it value is 0 . So I can test next one and so on. When the timer reach the end after testing all function. I can act on its status by sending a message, replace it or and abort the script.


    timer(){
        llSetTimerEvent(.0);
        if( os_GetAvatarList == -1 ){
            os_GetAvatarList=0;
            llSetTimerEvent(.1); if the 
            osGetAvatarList();
            os_GetAvatarList=1;
        }
        if (os_GetAgentIP==-1){
            os_GetAgentIP=0;
            llSetTimerEvent(.1);
            osGetAgentIP(llGetOwner());
            os_GetAgentIP=1;
        }
        if (os_IsNpc==-1) {
            os_IsNpc=0;
            llSetTimerEvent(.1);
            osIsNpc(llGetOwner());
            os_IsNpc=1;
        }
        if (os_SetSpeed==-1) {
            os_SetSpeed=0;
            llSetTimerEvent(.1);
            osSetSpeed(llGetOwner(),1);
            os_SetSpeed=1;
        }
        if ( os_TeleportAgent==-1) {
            os_TeleportAgent=0;
            llSetTimerEvent(.1);
            osTeleportAgent(llGetOwner(),llGetPos(),ZERO_VECTOR);
            os_TeleportAgent=1;
        }
        if ( os_MakeNotecard==-1){
            os_MakeNotecard=0;
            llSetTimerEvent(.1);
             osMakeNotecard("test.test",[]);
             llRemoveInventory("test.test");
             os_MakeNotecard=1;
        }
        if ( os_GetGridLoginURI==-1){
            os_GetGridLoginURI=0;
            llSetTimerEvent(.1);
             homeURL=osGetGridLoginURI();
             homeURL=llGetSubString(homeURL,7,-2);
             os_GetGridLoginURI=1;
        }
        if ( os_GetInventoryDesc==-1){
            os_GetInventoryDesc=0;
            llSetTimerEvent(.1);
             osGetInventoryDesc("");
             os_GetInventoryDesc=1;
        }
            
        if( os_GetAgentIP==0 ){
            mssg(0);
        }if (os_IsNpc==0){
            mssg(1);   
        }if (os_SetSpeed==0) {
            mssg(2);
        }if ( os_TeleportAgent==0) {
            mssg(3);
        }
        if ( os_MakeNotecard==0) {
            mssg(4);
        }
        if ( os_GetGridLoginURI==0 && llGetInventoryNumber(INVENTORY_LANDMARK)==0 && os_GetInventoryDesc==1) {          
            mssg(5);
        }else if (os_GetInventoryDesc==0 && os_GetGridLoginURI==0  && local_grid_URL!="" ){
            homeURL=local_grid_URL;
        }else if( os_GetInventoryDesc==0 && os_GetGridLoginURI==0  && local_grid_URL==""){
            mssg(6);
        }else if ( os_GetGridLoginURI==0 && llGetInventoryNumber(INVENTORY_LANDMARK)==1  && os_GetInventoryDesc==1){
            homeURL=osGetInventoryDesc(llGetInventoryName(INVENTORY_LANDMARK,0));
            homeURL=llGetSubString(homeURL,10,-1);
        }
        if(dbug)llOwnerSay(llList2CSV(["summary result of check opensim script function 1 is ok 0 is not 
available:\nos_GetAvatarList",os_GetAvatarList,"os_GetAgentIP",os_GetAgentIP,"os_IsNpc",os_IsNpc,
"os_SetSpeed",os_SetSpeed,"os_TeleportAgent",os_TeleportAgent, "os_MakeNotecard" ,os_MakeNotecard , 
"os_GetGridLoginURI",os_GetGridLoginURI,"os_GetInventoryDesc",os_GetInventoryDesc]));
        
    }

For XEngine / YEngine environment things get a bit more complexe for the scripter to know what osl function are available. The above still work under XEngine but will fail with reset required for YEngine. What to do for detection in YEngine environment if timer test is not available. Then answer lies in yoptions; This is a statement adding YEngine scripting capablitlies. If yoptions is put in second line of the YEngine script.YEngine script has additions redirection instruction including try,catch,and finaly. One can use the reditction to test for oslfunction in the following way:

//this script can now be a function instead of using timer.

checkOSL(){

        if(os_Notecard == -1 ){
            os_Notecard=1;
            try { 
                string test=osGetNotecardLine("en",0);// testing an existing notecard 
            }
            catch(scriptexception ex)
            {
                
                string emsg = yExceptionMessage(ex);//extract the error messge 
                if(llSubStringIndex(emsg, "Notecard")>-1 )//check if message contain keywords
                    os_Notecard = 0;
                    //take action later in the script on os_notecard as above for XEngine.
                else
                    throw;//if the error message is not related proceed with standard handling             
            }
            
            finally{ 
            }//try
        }//addtional if as needed to test all osl function required in project.
        ......

     }//end of function 


The cost of using yoptions; is that the YEngine script will not compile and run in XEngine environment with compile error on second line of script. So under current 092 situation two scripts are required to test OSL functions. This is needed as long as XEngine will remain default script engine. So knowing that XEngine timer will fail in YEngine environment one need to add to the XEngine script a if statement to check XEngine with osGetScriptEngineName() and return the timer with no action under YEngine situation. While the YEngine script will take over in YEngine environement to test osl function . And likewise in XEngine environment ( default ) the XEngine will test with timer while the YEngine containing yoptions; will fail running.


BANDWIDTH

There is an excellant article on bandwidth presented by firestorm viewer at https://wiki.firestormviewer.org/fs_speedtest . In this article they recommend that people pay attention to their settings and mainly recommend 500kbps when using a wireless connextion and 1000kbps for wired dsl.

Why talking about bandwidth. The new 091 release of opensim makes it mandatory that you pay attention to your settings otherwise you might see missing prims or incomplete terrain rezzing, like what happen to me in gimisaOS grid since I updated. This is a new problem. I never paid attention to that setting before and when I notice the problem I saw that my viewer was set to its maximum. ( 10,000 kbps ) .

You got to be a bit more patient to let thing rez specialy if you use the recommanded 500kbps setting as in my case . In gimisa4 it took me 3 minutes to see the integrality of all the prims. Most prim will appear after 1 minutes, and texture will follow for the remaining 2 minutes in the test I made using singularity.

Your result might vary since speed throttling is mainly due to both ends of the connexion. That is with different server connexions and with different viewer connexion one can expect very different optimal speed setting to get all prim and terrain to show up while maintaining a reasonable value of rezzing time . The recommanded value by firestorm is base on their experience with SL. Where server connexion is optimum and the only variable is viewer side connexion. Lowering the minimum recommanded setting might be necessary if you withness difficulty with prim or terrain rezzing for your prefered location.

SECURE SHELL

SSH is well known to work with password to log in a remote server. SSH use a "salt" to encrypt the exchange with the server. The weak point here is to figure out the password. Brute force can be use to test a server util it reveals it. For increase safety a key pair can be generated. Like key and lock in you home . The key has two side a private side that you keep safely in your user computer and a public side that is install to the server like the door lock to your house. Its lot harder to pick the server door using this key structure then to figure out a password. Also the password need you to memorise it contrary to keys.

Keypair is very reliable as long as your private key is well burried in your computer. Also Key pair creation is easy and furthermore dont need to be memorised. In linux machine using following command in the USER machine and accepting default you can create a ecdsa encoded key. rsa and a number of other coding is also available:
    $ ssh-keygen -t ecdsa 


Thereafter one need to add the public key by copy direcly its content into ~/.ssh/authorized_keys text file on the SERVER.
Next step for more security is to diseable the password authentification on the SERVER once access is validated by editing the /ect/ssh/sshd_config and changing following settings :

    find and change or create line with :
             ChallengeResponseAuthentication no
             PasswordAuthentication no
        $ sudo service sshd restart
        $ sudo sshd -T  to validate the change. 

CERTIFICATE updated 2020 0828

A not so known method avaiable with SSH ( secure shell ) is using certificate. The client use the certificate to connect to the server instead of its public key. The server first validate the certificate and allow log in via user private key. Please read Secure server article above for more detail of key pair use ins SSH. The process in essence combine the key pair with a certificate avoiding the need to cummulate user public keys in server authorisation.keys file .
facebook provide a glance at how to do this in following web site:
https://engineering.fb.com/security/scalable-and-secure-access-with-ssh/

Here is a my own step by step to do same so you avoid problem that I encountered . For clarity I define three computers. USER, SERVER, and a one call CERT-AUTHORITY. Now you can only use two computers if you prefer. In this case SERVER will also be your CERT-AUTHORITY computer.

On CERT-AUTHORITY computer create a key pair using.
	$ umask 77  # you really want to protect this :-)
	$ mkdir ~/my-ca && cd ~/my-ca
	$ ssh-keygen -C CA -f ca

STEP 1 : Copy the ca.pub key to /etc/ssh/ca.pub of the SERVER computer . Change the permission of ca.pub to 0644 with
$ chmod 0644 ca.pub
.

STEP 2: Still in SERVER computer edit the servers /etc/ssh/ssh_config and add the following line at end of file. Then save and restart your sshd server with command line and validate its properly configured  :

  $ sudo edit  /etc/ssh/sshd_config
       add at end of file : TrustedUserCAKeys /etc/ssh/ca.pub
       in openssh 8.2 it seem the certificate sign with RSA is not consider secure enough.
       Either you use the CERT-AUTHORITY with an other encoding.
       Or to keep same certificate you need to add RSA to the list of approved encoding:
       CASignatureAlgorithms ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa
       save sshd_config.
       $ sudo service sshd restart
       $ sshd -T 

STEP 3: Re-do these 2 steps to any other server you want to recognise the certification credentials using ca.pub key.

STEP 4: moving to USER computer.

STEP 5: Creat user key set by repling to questions with following command. You can use a passphrase if you like and you can name your key if you want . Never replace an existing one. You cant move the key afterward to default key directory or define a location of your choice direcly via following command question answers. :

$ ssh-keygen -t ecdsa 

STEP 6: I use gimisa-I7 as key file name in step 5 to identify my user in gimisa-I7 laptop. I copy it afterward in ~/.ssh directory of my user in USER laptop.

STEP 7: I copy gimisa-I7.pub key created above to CERT-AUTHORITY computer where ca and ca.pub key are .

STEP 8: I sign the gimisa-I7.pub key with the ca key where:

   -s ca is the key signing it.  
        -I is any identification you want to give it . That id will appear in SERVER logs. 
        -n is very important and identify the server side user under which the client will log in .
           That user most exist in SERVER computer. and be restricted user to the task of interest.
           Since the certificate can be use for many server/user -n can be followed by name1,name2,name3....  
        -V is validity of certificate in exemle 52 weeks but h for hours can also be presented. 
        -z is serial number and 
	the command end with the name of the key to be signed. 
	The result will be gimisa-I7-cert.pub in my case: 

        $ ssh-keygen -s ca -I CA4gimisa@106   -n proxy_user -V +52w -z 106001 gimisa-I7.pub 

step 9: Inspect the certificate to see if its per your specification :

$ ssh-keygen -Lf gimisa-I7-cert.pub

step 10: Copy back the certified key to USER computer ~/.ssh . You need at least the user private key and the certified public key in default ~/.ssh or in whatever directory you choose in USER computer for ssh connection to work. Also the user ssh command will search ~/.ssh with name starting with id_ and the encoding use ( in our case id_ecdsa ) for private AND certificate public key. In order to use a key set name differently one must specify the location of the key with -i /path/to/mykey. In my case :

ssh proy_user@server -i ~/.ssh/gimisa-I7

step 11: now that you are confident that you can access your server without password you can remove the password option . To do this back to SERVER, :

	$ sudo nano /etc/ssh/sshd_config
	$ find and change or create line with :
		ChallengeResponseAuthentication no
		PasswordAuthentication no
	$ sudo service sshd restart
	$ sudo sshd -T 

SOCKS ( revised 2021-03-24 )

SOCKS is an Internet protocol that exchanges network packets between a client and server through a proxy server. This article simple point to some experimentation I have done so exchange between viewer and opensimulator is securised. One not familiar with the use of secure shell can read above articles. I would like in this one to peek a look at viewer to opensim exchanges. The description address here only exchange between a grid and simulator part of local LAN and exchange with a viewer located on the web.

My experimentation proposed here is using secure shell tunnel . What is interesting is that the viewer I tested ( singularity , cool viewer and firestorm ) has socks 5 capabilities available in preference settings . And at least in ubuntu its easy to make a socks 5 ssh tunnel proxy

At the origine socks proxy were proposed in viewer to help get accross firewalls. The idea is that a channel is open through the firewall toward a server accessible to deliver the viewer communication exchange. The same way that someone in an hotel location where communication is not safe use a ssh encrypted proxy tunnel to connect to his office.

What is fun when you do that is that the tunnel is encrypted from end to end of the ssh tunnel. If the other end of the tunnel is a openssh server located directly within the LAN of the grid and simulator server, you in effect have a complete secure path from viewer to grid. This true exacly on the same principle that you can connect your own viewer inside your LAN to your own grid. What is happening in both case is that the code socks request is sent to the local end of the ssh tunnel. That local end decode it as local viewer request. Now you local modem is seeing a LAN and request to the public/internet IP address. In that case reverse NAT handling of your modem will connect you viewer request directly the local opensim server. That late exchange is totaly located inside the LAN. The reply take the inverse route. The opensim server send its reply to the local ssh socks proxy which encode it to sent it back to remote viewer at other end of the tunnel.

So in the case of my ubuntu USER laptop I create a ssh socks 5 proxy with this command line:
 ssh -4 -v -f -N -D 10000 proxy_user@3d.gimisa.ca -p xxxx -i ~/.ssh/gimisa-I7
     where -4 is ipv4, 
     -v is for verbose, 
     -f is for force continue running, 
     -N is not to expect other command 
     -D is for creating dynamic port handling. 
     10000 is the port selected for socks  ( could be any free one ) and 
     -3d.gimisa.ca is how to reach the other end of the ssh tunnel domain
     -p xxxx port use to connect to ssh.

Its important that your sshd server be configured for proxy only with the specific user selected in the certificat creation step above as you dont want him to wander around internaly in your LAN. For proxy purpose user can be created as follow in sshd_config:

Match User proxy_user
         AllowTcpForwarding yes
         X11Forwarding no
         AllowAgentForwarding no
         ForceCommand /bin/false

The local proxy did work fine when tested with firefox or google chrome browsers as well as with curl terminal command. But I was disappointed cause the socks5 I tested setting on singularity coolviewer or firestorm failed to connect to LOCAL socks5 proxy with an error message about TCP connection.
ref https://github.com/singularity-viewer/SingularityViewer/blob/master/indra/llmessage/llproxy.cpp

So that was bad news until I found that its possible to run ANY linux command line application through socks with the help of tsocks ( standing for terminal socks ).

2021-03-24: But the following indication does not work anymore for logging to opensim 092 grid. Sorry !!

So I remove the socks setting from firestorm. Then I installed tsocks and set tsocks configuration file tsocks.conf in LOCAL /etc directory to point to the LOCAL socks proxy commenting out path as not required and changing the following two lines to local socks server. server = 127.0.0.1 server_port = 10000 .

So using the same socks local tunnel still running I am starting firestorm in terminal with following command:

$ tsocks bash firestorm

This is a perfect solution for a close grid where everything happen between user viewer computer somewhere on internet and grid domain. Where you want total encrypted communication from user to grid. <br
Please note that HG visitors would be falling outside the encrypted coverage .So that what would happen too when you support simulator outside the grid domain unless you do proxichains yet to be tested on my side. ref : https://www.binarytides.com/proxify-applications-with-tsocks-and-proxychains-on-ubuntu/

But that protection as effectively encrypted as it is for the COMPLETE exchange of opensim has a cost. ALL the exchange with the grid is channel through the socks tunnel. Which is adding a layer on top of the grid work itself.


ANIMESHS

Is the possiblitity to animate a mesh object. Mainly use to animate attachements but can animate any rezed object. This dicussion here is to discuss the difference between RLV , NPC and ANIMESH to animate, move and control a inworld elements. In this case rerspectively an alternate avatar in restain love viewer control (RLV) , a non playing character ( NPC ) or an MESH object (ANIMESH).

I will not repeat what is presented in second life http://wiki.secondlife.com/wiki/Animesh_User_Guide . I will rather dwell in from the article presented in hypergrid business https://www.hypergridbusiness.com/2019/10/new-opensim-release/ . It states that animesh is something between an object and a NPC . I would argue that its an object with additional charasteristic between RLV and NPC . For those of you not familiar with both there acronims please see definition links on top of this page.

A RLV is an alternate avatar. A NPC is a rezed avatar and a ANIMESH is a rezed animated object. An animesh is rez on the region like an object. As an object You can attach two to any of your bones. You can link it with other prims to make a complete construction. You can use object script command on it. Animesh MESH is created by weight painted a mesh to an opensim armature via software like avastar and uploaded the same way you do weighted clothing and avatar you download to wear. That is how it can use standard animation.

RLV is abviously created by creating an other account. NPC is created by copying an avatar apparence. NPC and RLV are physic so they react to physic engine use in the simulator. ANIMESH as attachment is physical.As an object it can be make physical or phantom. RLV and NPC possess a profile. They can issue IM , and have Animation Override ( AO ) with default animation define for fly walk sleep and so on.

NPC have 25 dedicate opensim script command to create move run fly say sit touch and control your NPC. While RLV have fewer commands to control them. As avatar RLV can move between region and be teleported anywhere. A NPC cannot cross boarder neither be teleport out of their original region of creation and will deseapear on restart of the region . Animesh should be able to cross region as object. \ldo ANIMESH have 3 specific script for animation.

Please refer to my inworld REX compagnion dog where you can compare between the three flavor . The new ANINMESH should work fine in BULLET and UBODE physic in opensim version 0911 and up. Rex mesh is link to a prim to give it physical stability. It uses vehicle script to move. I find that the vehicle action is not as refine as NPC move and the lack of AO give a poor transition between animation.

With ANIMESH it can be hard to combine multiple separate animated links in one creation. For exemple REX can be leashed to follow up his master. Something easy to do with RLV , a bit more difficult with NPC. Also easly done if you attach the ANIMESH to the avatar. But getting more complex as animated linked object. The leash work with the colar fit to the dog. With NPC or RLV the colar need simply be attached to work fine. In ANIMESH it need to be weighted to the armature. I believe its best that the colar be part of the dog instead as being link as a separate mesh. ( not tested )

YENGINE (update 21-07-27)

Yengine is presented in article in Hypergrid business https://www.hypergridbusiness.com/2019/10/new-opensim-release/ and mention in opensim release notes http://opensimulator.org/wiki/0.9.1.0_Release . Since opensim 092 Yengine has a documention page ref: http://opensimulator.org/wiki/YEngine . In addition to XEngine capabilities YEngine has a better compilation and memory managment allowing memory to be release after script execution. Please note that scripts in opensim are limited via opensim.ini configuration to ScriptStackSize = 2048 ScriptHeapSize = 1024 per scripts. Also Yengine can be specified with the first line of the of the script as //YEngine:lsl . Since 092 YEngine also offers yoptions. With this keyword ( yoptions; ) in second line of script the YEngine offer additional redirection instructions ( switch,break,continue, try catch and finally,constant,short circuit AND and OR). The cost of using these option is that the keyword itself yoptions: if present in your script will break compatibility with XEngine. Meaning that a compile error will happen on the second line of your script containing yoptions; when compiled using XEngine default. ( see OSL article for more info on using both scripting engine in same object) .

XENGINE is the existing default scripting engine for OSL and LSL function as of 0911. The region default engine can be specified in configuration file. YENGINE is available if configured in simulator as alternate to XENGINE or as main engine. YEngine can also be specified with the first line of the of the script as //YEngine:lsl but the purpose is defeated since XEngine and YEngine cannot be allowed on same simulator. YENGINE is ALMOST fully compatible with XENGINE. Scripters must be aware that LOCAL variable are not compiled the same in XEngine and YEngine on version 092. In C# the language under X or YEngine, a local variable is usualy local to the bloc it is define in.. So for exemple:
If( true ) { 
     string Local="valueInIf" ;
     llSay(0,Local): // will say valueInIf
}
string NewLocal = "valueOutOfIf"
llSay(0,NewLocal): // will say valueOutIf

In YEngine the above will compile properly . In XEngine this will generate an error . So for certainty scripters should both create and compile scripts as usual in XEngine then swtich to YEngine to do one more compiling in YEngine to make sure they work in both the two environments.


Existing XENGINE script can be complile in YENGINE. But YEngine is more strickly compliant with C# and error might pop out that have to be corrected. The reverse is also true given correctng error and omiting the use of yoptions. As recommended above its best to compile existing and new script in both script engines. And unless validated in both environment there is difficulty for script to pass through region with different script environment.

Knowing which scripting engine environment the script is acting in with help of osGetScriptEngineName() is NOT available to every one with script rights anymore in version 092. So its getting more difficulty to know specialy if the region is not per standard OSL rights . On way to find what function is available to use is to test it . On a XEngine environment a OSL function not available to owner will spell an error in debug channel and cause the event to fail. Using of timer is possible to detect that situation and act accordingly. In YEngine environment the same event will freeze the entire script and require manual reset. In YEngine the use of try/catch function allow detection of that situation with keyword detection of error message.But the try / cacth feature does not compile in XEngine. So two scripts are now required to validate / use a osl function . One with XEngine timer and the second with YEngine try /catch. Using a link message to test the function you need will allow your script to run properly in any of the two situation . I have done one such testing twin script available in your friendly gimisaOS store see osl function article for details.

Please also note that YEngine and XEngine cannot be enabled at same time . You have to watch opensim.ini config statement in [Startup] section select DefaultScriptEngine = "YEngine" make sure its the YEngine that is selected. Also [XEngine] section make sure  ; Enabled = false then in [YEngine] select ; Enabled = true .


BAKE ON MESH

Is a new feature presented with 09 opensim version where one could transfer the standard textured clothing from the avatar standard body to the avatar mesh body he is wearing.

In 2016 people started to wear Lara mesh body. That early mesh body was using appliers to provide for apparence modifier of the mesh body. It had a draw back that you would start by rezing nude in a region then clothing would be added on as you woould be rezing. A friend came to me asking if I could do something for body that would not appear naked. So I did rigged and a fitted FEMALE body consisting of a two layer body. The two layer idea was so that you could wear your skin on one layer and any basic underwear on the second layer just like one do with standard bodies.Those layer were compatible with standard paint on clothing so you could wear any clothing that was using standard texture like shirt coat, pents or tattoos.

One feature my friend ask me was to use a hud so she was able to transfer to the mesh body any standard textured clothing she was wearing. on her STANDARD body shape. She had quiet a collection of clothing and was despointed no to be able to use it with her new body shape. So did I do her a hud to do so. It was taking anything she was wearing as skine,underwear, tattoos, skirt , pents , shoes and would paint it back on the mesh body I did for her.

Well three years later that feature is now an integral part of the viewers where you can copy all the textured clothing you wearing on your standard body to a mesh body compatible with standar body UVMAP.

You start by wearing all you want in term of standard textured clothing on your standard avatar.Then you attach a compatible mesh avatar made with standard UVMAP. Edit it like an object. Edit face and select head , upper or lower body part . Instead of the standard inventory use the bake tab and select the corresponding head, upper or lower body part where you will now apply the corresponding combination texture. The corresponding standard body portion will deseapere like if you had applied alpha to it and the mesh body portion will be textured with the conbination of texture corresponding to your selection.

What is greate about that is as it was with my own hud is that any old textured clothing that is still in your wardrobe and was either your doing or sold to you could be use to bake on you new mesh body. The mesh body I did is still available in store in gimisa5 but now with this new feature you dont need the hud. I did test successfully the 6 original baked layer namely :
BAKED_HEAD, BAKED_UPPER, BAKED_LOWER, BAKED_EYES, BAKED_SKIRT, BAKED_HAIR . I know my mesh model dont work with the new added bake layer namely:
BAKED_LEFTARM, BAKED_LEFTLEG, BAKED_AUX1, BAKED_AUX2, BAKED_AUX3 .

If you prefer to test with a much better opensource for opensim mesh body you can get Roth2 and Ruth2 from the following location: https://github.com/RuthAndRoth/Ruth . Or one can also work with machinmania ( avastar ) available bento model here : https://blog.machinimatrix.org/avatar-workbench/ .

LOG

Have two meanings. Action of connecting to a server. Noun meaning record of actions. Both meanings are applicable to opensim. This paragraph is about recording actions in opensim . The recording of server execution is made with the log4net. log4net is documented here: https://logging.apache.org/log4net/ . Its xml parameter are found in OpenSim.exe.config and Robust.exe.config files in opensim distribution.

Level of logging appender and the like can be configured in these files as describe here http://opensimulator.org/wiki/Logging . The default logging provided with execution record presented in console and saved in OpenSim.log and Robust.log . Since I use multiple instance of OpenSim.exe and Robust.exe this logging definition is not enought to a proper monitoring of the servers operation. I prefer a file per instance identified per instance and created per day of execution.

There is a few ways to do this but the following propose mine. First I use the appender defintion in the exe.config file. The appender default is as follows:
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
      <file value="OpenSim.log" />
      <appendToFile value="true" />

    what I use is :

    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="log/OpenSim.${logName}" />
      <rollingStyle value="Date" />
      <datePattern value="'.'yyyy-MM-dd"/>

The change will create log file in log sub folder and append the date to the file name to create a new log file per execution day. I need to have a different name per instance. I use the execution command to start the server in the following mannner. Where "logName" is use to define the log as per following:


logName="THIS-INSTANCE"
export logName

screen -h 9000 -amdS screenName mono  OpenSim.exe -inidirectory="./configTHIS-SERVER" 

The logName provided in export is use to create the log file per value="log/OpenSim.${logName} . The inidirectory directive is use to define specific parameter not relevant in this discussion . Please see following link for detail on that directive. http://opensimulator.org/wiki/OpenSim.exe_Command_Line_Options


CONFIGURATION

Opensim is very modular and each created module provides means to configure its features by way of reading parameters in files. The standard files used for that purpose are OpenSimDefaults.ini OpenSim.ini Robust.ini. Robust.ini is dedicated to Robust.exe and OpenSim.ini is dedicated to OpenSim.exe. The OpenSimDefaults.ini has all opensim default value for OpenSim and is left as is. In regards to Robust.ini see my paragraph on Robust. An interesting characteristics of opensim is the preference of parameter specification mainly use for simulator parameters. The config-include directory provid a three level of supperseeding parameters from OpenSimDefaults.ini . OpenSim.ini and ./config-include files. The include instruction in [Includes] section of file provides for the chain of supperseeding file set.

To explain this lets edit OpenSim.ini and modify the [Startup] module by adding a new parameter specifiedFile = "OpenSim.ini" . The OpenSim.ini specifies the architecture in the last line of the file. This exemple use hypergrid architecture. The next file you edit in the specification chain is located in config-include directory as GridCommon.ini . Lets add there too by modifying by adding a [Startup] module specification with new parameter specifiedFile = "GridCommon.ini" .

Now we run OpenSim.exe in usual way and get the test parameter specifiedFile by using config show Startup. You should find specifiedFile and obtain GridCommon.ini.

In my grid, I am using OpenSim.exe command line option -iniconfig in running my OpenSim. This option allow me to have a third lever of file specification to customise each regions . To illustrate I am adding a [Startup] specifiedFile = "regionX.ini" in this new file located under -iniconfig ./config-regionX . And now find that the Startup parameter for specifiedFile is regionX.ini . This clearly presents the supperceeding of that last files parameter reading over any other specification of the same parameter done in previous file.

Lately in opensim 092 issue nov 21 2021 I got problem with this way of doing things related to scrips and IMs. I notice that [XEngine] , [YEngine] , [Messaging] and [Groups] specified in GridCommon.ini did not superseed the orginal one in OpenSim.ini using same methodology as above. If you already using OpenSim.ini direcly to specify these group you are not affected by this problem. In my case I am adding the prevaling values using -iniconfig command line option in ./config-regionX directory . ref: http://3d.gimisa.ca:9090/static/config.html

COPYBOT

I am rather dispared. Someone came to me with a copyright claim. As an honest grid owner I have no clue what to do . !!! I did delete it from my regions but then what?

In opensim the creation process start in a region of a simulator. It includes rezzing any of 13 predifine prims from the building tool. It also includes downloading assets to inventory like texture animiation sound and mesh. In both case the newly addition creator is define. A creation would be limited if you could not combine those different elements into an object . That object call a link set in opensim is defined by its root prim .

Since in opensim creation is actualised as database table entries, we can study the creation process on the database stand point . So rezzing any of the 13 predifine prims inworld creates an entry in the simulator prim table. That entry key is the UUID affected to that prim. When the linkset is created the root prim link UUID is affected to all the other link of the set as sceneGroupID. You can get sceneGroupID by right clic on the object and copy the key to see it.

The data store in the simulator database is not permanent. If you take the object offworld it will be erase from the simulator database. It then become an asset in you inventory object folder. We will leave aside if you create or modify a script or modify a notecard in you object or if you store a prim in one of your creation prim.

In term of database taking your creation to inventoy produce a new entry in the inventoryItem table and in the asset table. Those two tables are part of the database accessible to robust process. A unique assetID is attached to you created object in both those table. The inventoryItem table keeps a record of you current inventory of all avatar. In my case, with FSasset,the asset table contains a pointer to a gzip file in my file system of all the data necessary to retrieve your creation.

Now let say someone else grab your creation. It get in her inventory and creates an entry in asset table just like the creator first and subsequent modifications. Deleting a creation of your inventory remove that entry in the database inventoryItem. Reference to your creation still exist if other avatar have obtain a copy of your creation. To get rid of your creation in my grid would mean that I scan the whole inventoryItem table to clear your creation. But all in all as you might have notice the asset table still contain pointers to all the creation ever made and modified in the grid.

Michael Lorrey presented both in opensim community conference ( OSCC ) 2019 and 2020 the idea of using bitchain to secure creation in opensim. Crista Lopes (Diva) published a post on april 2020 ref here http://www.metaverseink.com/blog/hypergrid/content-protection-an-incomplete-proposal/ to allow to support Digital Millennium Copyright Act (DMCA) claims to grid ownsers. Diva contemplate a database implementation of bitchain like record of all transaction on a given creation. Diva article highlights the difficulty in implementing a database solution to tracking transactions.

As presented by DIVA the honest grid owner has no way to know before hand that a given creation is factice. His act is dependant on a DCMA claim. And the killing difficulty for the grid onwer is that opensim does not offer any tool that would help him chase the offending creation.

A Grid owner need to act on centralised inventory and asset content. But tracing the numerous entry made for a creation is difficult as pointed above. Unless the grid is a close grid opensim make matters even worst by the distributed nature of the simulator database portion of the grid. It become an impossible task to remove inworld offending object already rez in regions of opensim whose database are attach to distributed simulators.

If bitchain like record not a solution would a key pair like used in ssh be one. The idea is to revisit the creation and permission system to use key pair. That is to be able to download an item in a grid the creator would have to provide a public key kept by the grid owner. The creator keeps the private key. An exchange just like use in ssh connection is happening to allow the creator access to rez a prim. I mean there is no check to rez a copy of an existing creation as long as the public key is in the grid owner hands. God mode and the like tools would not have access to that key. The object whos permission is changed after creation would need validation by the creator private key and only him could make that change not the owner of the object. Naturaly any grid owner could fiddle with that too. So as Diva mention we have to clearly identify honest from dishonest grid owner.

Would that work for hypergrid. In one scenario the public key cantd be exported to other grid. So the creator has to register to any grids he want his creation to be accessible by providing his public key to allow object transfer. The trust chain is one between creator and grid owner. That would be a forward looking way to lock out factice object. But nothing would prevent somenone to register with a grid as a creator and import copybot stuff. But honest grid owner could act on DCMA complain and easly identify the offender in database with his public key and act accordingly. Then removing the key itself from his records so it cant be use anymore to import stuff. That does not eliminate simulator from having offending asset but would prevent taking that object to inventory for any users.

On a second senario hypergrid visitor can get object from an other grid even without public key of creator available. Which would lead to actual situation and defeate the purpose greatly imparing hypergid exchange. Web market would have to follow same rules and only allow selling to approved grid by creator.

The problem of trust is very difficult to solve unless there is a flip side mechanism. There is great tooling in opensim to allow one to create things but nothing allow a creator to remove his creation from a grid. The key pair could be made to allow that and provide a deletion mechanism to registred creators. A creator in possesion of the appropriate private key should be allowed the tool to remove his creation from a simulator or from an entire grid.

WELCOME

This is to explain how to configure a region of your grid as the welcome landing either for local and optionaly for HG visitor separatly. Those happen in robust.ini as its a grid setting. This is helpfull for people that want to visit your grid by searching its URL or as default home people for local user.

So edit robust.ini file and find the [GridService]. It works with specify one region name as follow Region_regionName ( its better that that region has no space in its name ). Then the parameter is set by keyword as follow with exemple in my grid :

Region_gimisa3 = "DefaultRegion, FallbackRegion" ( this is for both local and HG unless you specifiy following)
Region_rose = "DefaultHGRegion"

PROBE

In my case I use a prim sphere that I rez and put red so I can spot it easy. And name it probe. I use it in order to locate a script that reply with an error in log file .
The YEngine compile error in my case present itself like this :
2021-05-16 15:34:14,860 WARN  - OpenSim.Region.ScriptEngine.Yengine.XMRInstance <[YEngine]:
reduction errors on dtHxl9noi5mwBG0JSHm4KwRHA7RN4aRnMzaxypcFeE6 (asset://d54c8d46-92f6-404e-aa22-e82dd723ebf0)
2021-05-16 15:34:14,861 INFO  - OpenSim.Region.ScriptEngine.Yengine.XMRInstance [YEngine]: - <98.07865, 88.19283, 21.24479> Primitive:New Script
2021-05-16 15:34:14,861 INFO  - OpenSim.Region.ScriptEngine.Yengine.XMRInstance [YEngine]: - (5,7) Error: invalid operator
2021-05-16 15:34:14,861 INFO  - OpenSim.Region.ScriptEngine.Yengine.XMRInstance [YEngine]: - (6,24) Error: expecting arg type
2021-05-16 15:34:14,861 INFO  - OpenSim.Region.ScriptEngine.Yengine.XMRInstance [YEngine]: - (7,4) Error: <br>looking for var name, type, state
 or default, script-defined type declaration
2021-05-16 15:34:14,861 INFO  - OpenSim.Region.ScriptEngine.Yengine.XMRInstance [YEngine]: - (8,0) Error: <br>looking for var name, type, state
 or default, script-defined type declaration

The error as spell out above is about a script name "New Script", in line 5, 6 7 and 8. In a prim call "Primitive" . The asset uuid provided in the error message is no help to find the object inworld. But the location is very usefull <98.07865, 88.19283, 21.24479>. To use it , I copy the location including "< >" from the log file. Then InWorld, I make sure I zoom on the probe object to follow it when it moves. ( camera constrain off ) . Then I edit my probe location and hit the lower coordinate p button the one in front of inworld Z coordinate . The probe now moves at the location of the problem prim . I edit linked part and clic on the prim near the probe that happen to be named "Primitive" . Check content and find the "New Script". Correct the error et voila!!


MULTI-THREAD

What does it mean for a script. Most script works with events . A trigger that starts its action . Like touch , sit, timer, listen. Once trigger the script goes on one step at the time through its application to the end of the event in question. Then wait for or execture the next event and so on.

Is it multi-thread. You dont know as that depends how the underlying execution is performed by opensim. But regardless, could I improve performance by writing a script task so splitted in smaller scripts instead of a main one.
To answer that I invite you to an experimentation . I did a loop count down of 100,000,000 as the MAIN thread . The time to exicute it on my system with no one on an empty sim for my main thread of 100,000,000 count down , resulting time is 14.158000 . When that is done, the main I script sends a Message_linked to start three scripts. All those three script ( slave ) are splitting work and each counting down from 33,333,3333 . The result is presented bellow. What do you expect respectively. Rolling drums . About 15 / 3 give or take 5 sec ya??
main 100,000,000 time 14.158000
 2-slave 33,333,333 time 7.255000
 1-slave 33,333,333 time 7.196000
 3-slave 33,333,333 time 7.305000

Oups 2 secondes error ??? One could think the difference ( 2 sec ) is due to some overhead . But then counting to 1,000,000 / 3 would also lag by about the same amount ( 2 sec ) from the slave count to the main total count /3 . And its not the case. See:

3-slave 3,333,333 time 1.142000
2-slave 3,333,333 time 1.125000
1-slave 3,333,333 time 1.141000
main 10,000,000 time   2.117000

But interestingly it take about half time to run a third of the count compare to main time. Does that hold.

main 100,000,000 time 14.102000
6-slave 16,666,667 time7.216000
5-slave 16,666,667 time7.229000
3-slave 16,666,667 time7.171000
4-slave 16,666,667 time7.177000
2-slave 16,666,667 time7.141000
1-slave 16,666,667 time7.142000

Ya. So its not very efficient to do multi task a count down split in six does not give 6 time less.Nor a count down divided in 3.Checking for 2. We get again same timimg . My test is done using YEngine. The result can be better understand from following reference, YEngine executes script events using preemptive multitasking. This means that, at certain control points or when told, a script may release execution, being placed on a queue waiting for its turn to execute again.The released execution thread goes on processing other scripts. So that looks like time slicing already. ( http://opensimulator.org/wiki/YEngine )

main 100,000,000 time 14.195000
2-slave 50,000,000 time7.290000
1-slave50,000,000 time 7.349000

So ya whatever the split 2,3 or 6 we get same timing saved that is about half of what one task would have result with. And that is regardless of the task at hand . Counting down to 10,000,000 or to 100,000,000. So splitting you script work into smaller scripts has some merit but a lot damped by the preemptive multitasking YEngine does. That is when the work in question is purely computer dependant. If on the other hand what your doing has to wait for say user input. Then splitting it might then be advantageous. The old say do it for the user takes all its value here.


SOURCE

How to access the source code of opensimulator is a question you might have.

You can download the source current and older file set from http://opensimulator.org/dist/ . One you have unzip it to your work folder you have to pre-build it to create the "solution" files . The pre-build is straight forward running the "runprebuild.bat" or "runprebuild.sh" depending if you are under linux or window.Then build the binnary files using nants and run the application as explain in the source files. You can also take a look at any of the files using a standard text editor opening each and every of the many .cs files . You can find specialised text editor that will highlight the .cs syntaxe . But that is very tedious and impossible to use for exploration / debuging for a large project like opensimulator.

To have look at the source coding itself I am using monodevelop for ubuntu. Available in ubuntu 18.04 its not updated anymore but Still working in ubuntu 20.04 see here ( https://ubunlog.com/en/monodevelop-ide-instalacion-mediante-ppa/ ) With monodevelop you can open the C# opensim.sln solution file that will show the complete project C Sharp application tree. With monodevelop You can modify build run and debug the solution tree and appreciate all the work put into opensimulator virtual reality.

Since ubuntu 20.04 you can also get microsoft freely provided visual studio CODE . This app will allow to open solution file. I followed the instruction provided in this web page to get it working under ubuntu 20.04 ( https://linuxize.com/post/how-to-install-visual-studio-code-on-ubuntu-20-04/ ) . Once that is done you will need to install vscode explorer to see the solution tree the way monodevelop presents it . ( https://marketplace.visualstudio.com/items?itemName=fernandoescolar.vscode-solution-explorer ) . BUT you CANT build your /bin DLL with visual studio code . As explain in this web page ( https://code.visualstudio.com/docs/editor/tasks ) . Nant is your choice , using virtual studio CODE as an upgraded text editor to modify the .cs files via the solution tree. So debuging in these condition is hard.

Using microsoft window environment is possible. First get the "free" microsoft visual studio (https://visualstudio.microsoft.com/vs/pricing/) . If you use virtual studio make sure to select the C# package while you complete your installation. I notice that you can open the opensim "project" direcly from opensim source. But doing so created more trouble then running the runprebuild.bat provided with opensimulator source. Once the solution tree is created you can open the OpenSim.sln solution file . Using visual studio afterward is very similar to monodevelop where you can edit debug and run the code source.

HOSTING

Hosting your virtual world and running you opensimulator is a no brainer with dreamgrid. https://outworldz.com/outworldz_installer/Grid/ Dreamgrid is an installer providing a web server with associate opensim helper function. It also provide database support and opensim dll and execute files . Its an opensource project with source here https://github.com/Outworldz/DreamWorld . Source is licensed as AGPL 3.
Mister blue also offers a docker that simplifies opensim server installation. His project is opensource too at https://github.com/misterblue/opensim-docker/ with Apache License 2.0. I am not familiar with using docker. But a few years ago I did a virtual machine base on Virtualbox https://www.virtualbox.org/ . Using it I tested an opensim deployment for a full grid with grid.metaversedepot.com and a region in hg.zetaworlds.com. The idea of both Docker and VirtualBox is to simplify software deployment by including its environment in the distribution files. It allow user to run an application in a preset machine that one can deploy on any system. In the case of VirtualBox . One have to install the VirtualBox application either on window linux MAC and solaris. Then to download and run the virtual box file predesign for opensimulator.

Opensim technical requirment is proportional to the simultaneous visitor count you get compounded by the visible asset load. Contrary to belief you dont need that fast a cpu capability to handle opensim server if your visitor count is low. Most of the presentation job is done by the visitor viewer. What is important is the internet service speed your internet service provider is giving you. Specificly the upload value in mb/sec.

The difficulty to install opensim at home is mainly one of handling request by router. NAT (Network Address Translation) is an issue. Dreamgrid is helping you handle that and so is opensimulator see http://opensimulator.org/wiki/NAT_Loopback_Routers . Grid owner should understand at this point that hosting at home mean becoming a server service, This service include a number of function provided by your computer. That needs your consideration as window personal computer is not a server software. Its not optimised for the task neither is it specifically secure for it .

I have been running opensim for over 10 years now at home with old computers. My internet connexion is 10MB/sec uplink . I am using linux ubuntu. I have a setup that includes three cheap dlink modem . One of which is dedicated to opensim server with its wifi service OFF. I host regular region size ( 256m x 256m ) that are serounded by water giving maximum viwer reach limit of 512m. The result is I can receive 3-4 visitors simultaneous with acceptable lag as long as they are not too complex by themselves. I dedicate the 3 machines on same LAN exclusively to opensimulator . Most importantly free of personal or professional information. Full configuration can be viewed in configuration topic.

GRIEFER

People that like testing you facility. They will do all sort of thing to attrack your attention to difficulies with your installation. In opensim you have different tool to help deal with those testers. The hard part is to identify them . One way to do that is by monitoring what they do in your region. I made a monitoring tool you can find in gimisaOS. One sure way to counter measure those visitors is with backups. OAR is a sure way to get back on your feet after a griefer visit. See above article on OAR if you dont know what OAR means . Also for estate manager, I did a tool to remove these visitor once identified. But this tool only act once the griefer are log in. Contacting your grid owner is usefull. For local user the grid owner can act to remove those avatar access. In addition they can modify the LoginService by adding the mac address of the machine use for griefing. For HG visitors grid owner can prevent those people to access the grid. First They need to be identified from log . Then entry the required identity characteristc in robust.ini configuration file GatekeeperService. Grid Owner will find the required griefer grid http data and Mac address found in the log file when the griefer log in the grid.

Please note there is no reliable way to prevent smart hackers to access an opensimulator hypergrid world. So as stated above backups is the best security measure you can deploy.

[GatekeeperService]

    ;; If ForeignAgentsAllowed is true, make exceptions using AllowExcept.
    ;; Leave blank or commented for no exceptions.
    AllowExcept = "http://griefer.com:8002, http://enemy.com:8002"
    
    ;; If ForeignAgentsAllowed is false, make exceptions using DisallowExcept
    ;; Leave blank or commented for no exceptions.
    DisallowExcept = "http://myfriendgrid.com:8002, http://myboss.com:8002"

    ;; Allow banning via hashed MAC must be set in both [GatekeeperService] and [LoginService]
    DeniedMacs = "YOURLONGMACTRSING ANOTHERMAC"

MODFUNCTION

Detail reference is provided with http://opensimulator.org/wiki/OSSL_Script_Library/ModSendCommand and http://opensimulator.org/wiki/OSSL_Script_Library/ModInvoke . The first reference show how to send a generic text command interpeted like a link message script to all MODFUNCTION C# modules in the simulator . The second methode defines C# funtion that can be called through the script like a predifine Script routine. The original work was done by justincc ref https://justincc.wordpress.com/2010/07/16/passing-data-between-a-script-and-a-region-module-with-modsendcommand/. For a simulator user adding a pre-programmed C# function is or rather was as simple as adding the corresponding dll file to the bin directory of the simulator. The file is pick up by the mono addin mechanism ref https://www.mono-project.com/archived/introduction_to_monoaddins/ and properly integrated in the routine calls. To be successfully running the MODfunction with XEngine or YEngine must be activate with option: AllowMODFunctions = true in the respective script engine section.

Using monodevelop or visual study one can create the source ModFunction solution in C# .In order for the Modfunction to work as explain above one must take advantage of the mono addin mechanism. Taking the ModSendCommand from above reference as exemple of implementation . First create a directory call ModSendCommand under the addon-modules directory of the project source. Then create a subdirectory called Modules and a new file call prebuild.xml. That file will contain instruction to assemble the solution with the opensim source. ( see exemple in link http://3d.gimisa.ca:9090/static/addon-modules.zip ) . Finaly under the Modules sudirectory create or copy from exemple for the modSendCommand.cs .

We then need to use the prebuild.xml we just create to add the content of ModSendCommand to the tree of our opensimulator source. To do so run the runprebuild.(sh or bat) file at the command line prompt in opensimulator source directory . Then use monodevelop to open the opensimulator source where you will find the newly added ModSendCommand solution including its reference directory. You can correct add edit remove the references from its directory as well as modify the source code as you need to implement your own version of ModSendCommand. Then proceed with build of the ModSendCommand source . Then run opensim project either in debug or relase mode taking care to edit your opensim.ini, config-include and region ini file appropriatly. Inworld in the simulator region of interest create the script provided with the exemple and run it to see the usual "Hello World" greating message confirming everything works as plan .

Now I notice under 092 that when I stop the simulator and restart it to join the region again to get greated one more time NOTHING WORKS. No error , the new module simply dont load. Its mot pick up at all by the mono addin mechanism. In OSCC2022 Ubit told me that for safety reason the MODFunction feature is removed . I notice in test that the addin mechanism creates a directory bin folder call addin-db-002 . A few subfolder down in the addin-cat is maddin files. These include one maddin fle for each opensimulator module. One of which is MyRegionModule,0.1.maddin responsible for Justincc exemple of the hello world function. That name come from the modSendCommand.cs source file assembly declaration : [assembly: Addin("MyRegionModule", "0.1")] .

Why talking about that maddin file? Because the solution I found to work around the problem is to delete the MyRegionModule,0.1.maddin and then restart the region simulator. When doing to the scrpt printing "Hello World" will work again until you restart the region once more. Creating a bash command deleting the maddin directory 1 each time you restart the region simulator is the simplest way I found to cure the problem. I did the same exercise with modInvoke command and got the same solution to delete the corresponding ModInvokeTest,0.1.maddin file to get it to execute again after simulator restart.Since deleting the whole directory of mandin does not seem to create any issue I did proceed to remove that directory with the bash file then all the MODFunction integrated in the simulator work as expected.

NAT

Its a router feature that translate addresses to road map a bit like google map routing but convers only the next step. NAT LOOPBACK is of interest here. Its technically explain in ref ( https://community.tp-link.com/en/home/stories/detail/1726 ) Its effect applies if you run your opensim server localy to the router like me at home.

Taking my case for exemple . My server public address is 3d.gimisa.ca:9000 . And my region are spread accross many other ports . Changing my old DIR-615 router for a newer DIR-825 created a mess because now NAT LOOPBACK is not allowed. For someone like you reading these line access to my grid did not changed. But for me behing on the local side ( LAN ) of the router I cant get a correct route from my router to access my own grid!!

Why is that so . To increase safety modern router dont allow a NAT LOOPBACK. That is accessing to public ( WAN ) ip address that redirect back in you local network ( LAN ). That is call a loop back for the network address translation. Preventing that loop back is blocks an intruder to you local LAN to access a local machine via a known server internet address. But if you want to serve your grid from home also mean taking this risk . There is ways to mitigate this risk by isolating your grid from user machines. see previous article here.

So what to do depends on your grid setup. If its on only one machine running simulators (regions), opensim server (robust) and viewer (firestorm) you could redirect calls to from yourself to yourself. Please note this represents the higher risk in term hacking if your machine already have personal information. Anyhow its done with the host file on your machine. On Windows, open as administrator the hosts file, which is located under C:\Windows\System32\drivers\etc. On Mac and Linux, edit the /etc/hosts file using sudo for administator. Then specifiy the routing required. See for details (http://opensimulator.org/wiki/NAT_Loopback).

But I have multiple machine serving my web site , robust servers and region simulators and I use a laptop for the viewer. So the above solution is not applicable and a smarter solution is needed. Trying with the DLINK software prove impossible to set . So The solution I have choosen is to use openwrt as presented in reference . (http://opensimulator.org/wiki/User:Thomax:nat-loopback) . OpenWRT is a replacement to you router software . Its based on linux and very versatile. It even come with a great user interface call LUCI. ref ( https://openwrt.org/ ) . I invite you to visit the reference web site for further information.

In my case router internet address at the moment for 3d.gimisa.ca is 184.161.12:239 and its local router address is 192.188.2.100. The region server is on 192.168.2.106 and the robustOUT server is on 192.168.2.108. I also have web server ,ftp servers and other regions on other machines but for the sake of this article we will keep it simple. To sum up port 9000 is open for robust on machine 108 ( 192.168.2.108 ) , and port 9100-9130 are open for region on machine 106 ( 192.168.2.106)

To configure my router using openWRT rev 22.03 I use the luci port forward section of the openWRT.
We need two rules. 

Rule 1:  for the 9000 port forward to machine 108 to address robust OUT service:
Protocol TCP, 
source zone WAN , 
port 9000
the destination zone lan, 
internal ip  192.16.2.108 
port 9000. 
On advance setting tab tick NAT loopback  
Confirm "Use external IP address" that  appears by default. 
Leave the rest as is. 

Rule 2 : for the regions simulator ports 9100-9130 forward to machine 106:
Protocol TCP UDP, 
source zone WAN , 
port 9100-9130 the destination zone lan, 
internal ip  192.16.2.106
and port 9100-9130. 
On advance setting tab tick NAT loopback  
Confirm "Use external IP address" that  appears by default. 
Leave the rest as is. 

I follow the same principle to recover access to my web site, other regions and server.That is one rule per port series per machine.



Hope it helps
2023-01-28

email gimisa

Personal tools
General
About This Wiki