Jump to content

Gistya Eusebio

  • Content Count

  • Joined

  • Last visited

Everything posted by Gistya Eusebio

  1. I downloaded the latest Experience viewer v3.8.0 (299338), but it will not open on my Mac. The app launches but all I ever see is a black window where you normally would see the SL logo and fields to enter username and password, etc. I keep getting this error in the console: 4/6/15 5:52:05.267 PM SLPlugin[13186]: Error loading /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/MacOS/JavaAppletPlugin: dlopen(/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/MacOS/JavaAppletPlugin, 265): no suitable image found. Did find: /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/MacOS/JavaAppletPlugin: mach-o, but wrong architecture I updated Java to the latest version (8v40) and checked that this plugin was updated, and indeed it is the latest version. All my browsers work fine, but SLPlugin doesn't like it evidently. Please look into this. I think that you should make a 64-bit, Cocoa-based viewer that is not based on million-year-old 32-bit legacy code. I think that having a code-base that's cross-compiled to Windows and Linux and seems to be stuck in the OS X 10.5 days, is kind of bad.
  2. In this post I will describe how a sim owner can protect themselves against all their stuff getting returned, how to properly interact with builders that are working on your sim, how to empower sim managers without endangering yourself, etc. I'm a roleplay sim owner. I had my sim built by someone in exchange for me renting them land. Then later they returned the build and screwed me over. Later I had another build done and bought it via parcel transfer to protect myself, however parts of it did not transfer over due some no-transfer contents. Other parts of the build came over as no-copy, so I can't even back-up the build to my inventory. It all made me wonder, how could I have done things differently from the beginning? • Use real-life contact information and use a real-life contract when dealing with a builder. This protects both of you from a case where one person does not follow through with payment or provision of service. • Pay your builder. That way they have a real incentive. Don't pay them prior to the build being done. (See below.) • Consider using a real-life escrow service with technical verification to provide payment. You put money into escrow for the builder. The builder then does the build without payment. Then the escrow service verifies that the build has been done according to the agreed-upon specifications. Lastly the escrow service pays the builder once they have transferred the build into your name. • At the very least, use a parcel transfer with objects to pay the builder. Put the parcel in their name then have them sell you the parcel with objects included in the sale. That way they don't get paid until the build is fully in your name. • Own your build. When you hire a builder, specify to them that you need to be the owner of all the prims at the end of the day. If they are not OK with that, then you need to realize that they can simply remove the build at any time, and there is nothing you can do about it if they choose to screw you over (short of suing them). • Own a copiable version of your build. Hire the builder on the condition that they build everything in such a way that it will be at least copy-mod to the next owner. That way if you want to make adjustments to the build or take a back-up copy to your inventory, you can do so. • Don't give anyone return rights to group objects or mod-rights to your objects (i.e. your build) unless you absolutely trust that person. If they have mod-rights they can royally screw you over. Return rights can also screw you because there is no way to easily re-rez something in the exact same place it was. By "absolutely trust" I mean, this person needs to be someone that you know in real life and ideally you have a contract with them in which they agree not to return any of your build. • Ideally, use a script to enable sim managers to only return objects that are not owned by you. With the latest scripting methods, you can actually have a scripted object set up that your sim managers to return objects set to group except it won't allow them to return any prims that belong to you, the sim owner. That way you can give a sim manager return rights so they can deal with renters, etc., without having to worry about them returning your whole build. • Don't let anyone build major areas of your sim without a structured agreement around it (as described above) so that you can be protected from a situation where they decide to remove the build without warning and you are left with major parts of your sim missing or gone. I really hope that you don't suffer what I've had to go through. Protect yourself. I wish someone would have told me all this when I first got into being a sim owner so that I wouldn't be stuck with a largely no-copy build that I can't back up. LindenLabs gives you no way to back-up your sim; the only thing you can do is basically back up your terrain file to your local hard drive, and save any copiable objects to your inventory.
  3. LepreKhaun wrote: [snip] But our main problem with Json usage is that LSL lacks native support for both associated array and nested data structure manipulation and we have to "roll our own" using the llList* functions. Klutzy, but doable. A bit of study of Computer Science doesn't hurt either, very little math involved even! :smileyhappy: [ETA] On a side note, FORTRAN got nested arrays in 1954. Such is progress... Is there some technical reason why they continue to leave arrays and nesting out of LSL? And for that matter, data storage? They could easily charge a nominal fee for database usage and pad profits with that. As it is we have to rely on outside data stores when most of the time, it's over-kill. Maybe they're working on enhancing LSL in these ways, but we just haven't seen it yet.
  4. //this code is free to use under the //GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 //~Gistya Eusebio~ 6-23-2013 //Normally if you add two or more CSV's to a list, then convert that list into a CSV, then back to a list, //you end up losing the structure of the original list since each member of the CSVs becomes a //member of the new list. //For example if you take the two-item list: ["foo","bar"], and make it into a CSV: "foo,bar", then //make a list by doing ["foo,bar"] + ["red"], you'll get the two-item list, ["foo,bar","red"], //and if you make that it into a CSV, you'll get the string: "foo,bar, red" ... // and if you convert that back to a list, you'll get the three-item list: ["foo","bar","red"], //losing the borders of the original two-item list! //However with my new functions here, now you can make a list of CSVs, then make a CSV of that list, //and then rebuild the original list of CSVs, preserving the original item count and boundaries between items. //list2CSVSafe lets you make a list into an escaped CSV string that contains no commas. //So for instance ["foo","bar"] becomes the string "foo%2C%20bar" //And ["foo%2C%20bar","red"] becomes the string "foo%252C%2520bar%2C%20red" //So you can see that you can put CSVs into a list and turn that list into another CSV, and so on, //without merging the lists due to the presence of commas in the nested CSV's. //This aids in list nesting. //When you pull one of the escaped CSV's out of a list, then to change it back into a a proper list, //use the reverse function, CSV2ListSafe. Any further-nested CSVs in that list will remain single //list members that will then have to also be pulled out in similar fashion. //So for example CSV2ListSafe("foo%252C%2520bar%2C%20red") returns the two-item list: // ["foo%2C%20bar", "red"] ... fun times eh? string list2CSVSafe(list info) { return llEscapeURL(llList2CSV(info)); } list CSV2ListSafe(string csv) { return llCSV2List(llUnescapeURL(csv)); } Whee
  5. LepreKhaun wrote: [snip] else // We are dealing with a JSON_OBJECT { placeinlist = llListFindList( listParent, llList2List( pathtoElement, -1, -1 ) ); listParent = llDeleteSubList( listParent, placeinlist, placeinlist + 1 ); // convert to a JSON object jsonParent = llList2Json( JSON_OBJECT, listParent ); } It is left as an exercise for the reader to construct the matching function, addJsonElement. Hope that helps! [Edited to correct an error in camelCase in code. Sorry!] The problem with the above is that if the specified member does not exist, you will erroneously delete the first and last members of the list, because the llListFindList will return -1, which will cause llDeleteSubList to act from -1 to 0. I know you said it does not contain error checking, but just making it clear: in my previous post you'll see why I made sure to only perform the deletion if the specified element exists in the list.
  6. Here was my solution: //only works on JSON objects, not JSON arrays.string removeFromJsonObject(string json, string member) { list data = llJson2List(json); integer x; if(~x = llListFindList(data,[member])) data = llDeleteSubList(data,x,x+1); return llList2Json(JSON_OBJECT,data);} The point of what I'm doing is to completely remove the member form the object, not just set its value to null. Of course if it is an array then instead of doing x+1 you just do x on line 6 for llDeleteSubList's third argument.
  7. In LSL how would you go about deleting a member from a JSON object? Have to use the Json2List functions, right? It seems they gave us getters and setters of values, but no way to easily delete members.
  8. Well, Maestro posts here, so there's a chance this might get seen. As a fellow software developer, I do not envy the position that the Lindens are in. I have a hard enough time fixing bugs and adding the core features to my one little set of scripts, without anyone begging me for various esoteric-sounding features. However I do believe that companies who listen to their customers, and platforms who give their developers the APIs they are asking for, are the ones that succeed down the road, and I've stuck with LL thusfar because they have acted on those of my requests that were the most important. I can see that they are trying to do the right thing in various areas; for example the new JSON features have been a god-send for my script. So, I think they are interested in heping us, and I will continue to press this particular issue (HMAC-SHA functions) until it gets implemented, especially because I know it's not all that much to ask for, given the fact there are a lot of open-source libraries. The only potential issue I see with is it that it would be programatically difficult to initialize an ipad/opad key cache to save on processor usage, but even without that being done, I think it would still be far more efficient to do it as an LSL function than how we're doing it now, which is doing SHA1 in LSL itself. Even if they just made a workable SHA1 function that would be a huge step. It's a shame they went to the trouble to make an SHA1 function (llSHA1String) but it doesn't work for HMAC due the facts that it relies on UTF8 encodings and that there's no escape character to represent the null character in LSL. It's still useful for generating a hash for script-to-script communications security, but we need one that can accept hexadecimal input and can provide output in base64 or hex. If it did the whole HMAC algorithm that would be the icing on the cake. And while they're at it, we might as well throw in SHA2 support to future proof present-proof it.
  9. I made a script that does this back in 2006 or 2007. In fact you could even click the saber from across the room and it will come and fly over to your avatar's hand and attach itself.
  10. THIS is the superior version: //JSON_TYPE integersinteger invalid = 1; //invalidinteger object = 2; //objectinteger array = 4; //arrayinteger number = 8; //numberinteger str = 16; //stringinteger null = 32; //nullinteger true = 64; //trueinteger false = 128; //false//map the json type to a useful bitmask lolinteger jsonType(string json, list specifiers) { return llRound(llPow(2.,(float)((integer)llGetSubString( llEscapeURL(llJsonValueType(json,specifiers)),8,8))));}//as long as it ain't null or invalid, returns true |=}integer jsonValid(string value, list spec) { return ( !( jsonType(value,spec) & (invalid | null) ) );} JSON type bitfields fun
  11. //JSON_TYPE integers integer invalid = 90; //invalid integer object = 91; //object integer array = 92; //array integer number = 93; //number integer str = 94; //string integer null = 95; //null integer true = 96; //true integer false = 97; //false integer jsonType(string json, list specifiers) { return (integer)llGetSubString(llEscapeURL(llJsonValueType(json,specifiers)),7,8); } This is going to let you get a JSON type as an integer instead of a string, so you can use bitwise comparisons or whatever you want.
  12. (1) // To remove all instances of [test] from list: while (~q = llListFindList(listy,[test])) listy = llDeleteSubList(listy,q,q); // Proof of concpet: integer test = 5; list listy = [3,3,4,5,2,1,6,5,3,5,5,2,3,2,1,5,5,3,2,2,5,5,5,5,2,1,1,3,3,5]; integer q; while (~q = llListFindList(listy,[test])) listy = llDeleteSubList(listy,q,q); llSay(0, llList2CSV(listy)); // returns: 3, 3, 4, 2, 1, 6, 3, 2, 3, 2, 1, 3, 2, 2, 2, 1, 1, 3, 3 (2) corollary // To replace all instances of [test] from list with [replacement]: while (~q = llListFindList(listy,[test])) listy = llListReplaceList(listy,replacement,q,q+llGetListLength(test)-1); // Proof of concept: (using variable declarations still from example above) listy = [3,3,4,5,2,1,6,5,3,5,5,2,3,2,1,5,5,3,2,2,5,5,5,5,2,1,1,3,3,5]; list replacement = ["The creatures became incredibly obsessed with cat food."]; while (~q = llListFindList(listy,[test])) listy = llListReplaceList(listy,replacement,q,q+llGetListLength(test)-1); llSay(0, llList2CSV(listy)); // returns: 3, 3, 4, The creatures became incredibly obsessed with cat food., 2, 1, 6, The creatures became incredibly obsessed with cat food., 3, The creatures became incredibly obsessed with cat food., The creatures became incredibly obsessed with cat food., 2, 3, 2, 1, The creatures became incredibly obsessed with cat food., The creatures became incredibly obsessed with cat food., 3, 2, 2, The creatures became incredibly obsessed with cat food., The creatures became incredibly obsessed with cat food., The creatures became incredibly obsessed with cat food., The creatures became incredibly obsessed with cat food., 2, 1, 1, 3, 3, The creatures became incredibly obsessed with cat food. =G=
  13. Dear LL: Can we please get hex & base64 HMAC-SHA1 and/or HMAC-SHA256 signature LSL functions? I use certain Amazon AWS features in some scripts I'm getting ready to release, but it requires web requests be signed with base64 HMAC-SHA1 or HMAC-SHA256. And despite my best efforts, I can't get my LSL-based HMAC-SHA1 routine to generate a signature for a typical-length request in under 800-900ms. We really need a function like llHMACSHA1base64(string msg, string key) so that we can take full advantage of things like AWS. There are open source libraries LL could use for this. I haven't asked for much in my almost four years as a sim owner and seven as a land owner... But this would be hugely awesome.
  14. Ah. Well it got closed anyway, with no notes or anything. I'm not sure why I still pay these people.
  15. https://jira.secondlife.com/browse/BUG-2632 Please vote for this. If it gets fixed then we scripters can make super-fast signed web requests to cloud database services, twitter, and many other web APIs that require signed authenticated web requests using SHA1. Even better would be if you vote for the linked JIRAs at the bottom, too, since those would add support for other forms of SHA and give us an HMAC hashing function so we don't have to do it in slow old LSL!!
  16. Please vote for this JIRA on LSL encryption features: https://jira.secondlife.com/browse/SCR-453 Presently to use things like the public Twitter OAuth library that perform an HMAC-SHA1 signature you must do the whole hashing algorithm in LSL, which can take several seconds (!!!) to sign a request. This is due to LSL being tied to frame time and the hash requiring lots of little math operations in loops with function calls, etc. There really needs to be a way to sogn requests through an official LSL function so that the sim's computer would crunch the numbers outside the Mono or LSL VM then feed the result back to the script. It would be easy for Lindens to implement this, since the HMAC-SHA1 and HMAC-SHA264 algorithms are open source in many languages already.
  17. I have been going thru the OpenGL codebase for Viewer 2, and I can tell you, there is a lot of hacks in there that are designed to improve performance by addressing shortcomings in Apple's drivers. However they are really just to keep it acceptable but now that 10.8 has much improved the OpenGL on Mac, these hacks are actually slowing things down. Just by removing ONE of these 4-year-old kludge hacks I have more than doubled the framerate on the Mac viewer when at long draw distances. Now I am building the client with even more of this crap removed to see if it helps matters. For example, LL had it set to where the Mac was limited to Shader Language 1.2 max :-/ They also had code that even in the comments next to the code, it said that it "kills FPS on Macs with VBO enabled"...!! From what I can tell they haven't recently bothered to fine-tune the client for performance on the Mac. They are more interested in maintaining backwards compatibility with OS X 10.5 than creating a viewer that would actually run smooth on 10.7/10.8. Frankly I also think they waste a lot of code on XUI when they SHOULD be using Apple's native GUI interface calls. But that is obviously something they do on all platforms to make there be less work to make the client deploy on all platforms. However somehow, all other major developers like Adobe and many others have no issues with supporting OS X's native GUI (not to mention Windows' GUI etc.). I wish LL would; it would certainly make the software vastly easier to use and it would run MUCH better.
  18. No the Mac viewer is 32-bit and it uses deprecated multi-threading calls (makecontext etc.) and uses deprecated QuickTime functions (as of 10.7). Yes it is one multi-platform codebase, but I don't yet know what version of OpenGL it supports on the various systems. I have been trying to build a 32-bit client on 10.8 and so far it crashes anytime the mouse is used. It will not compile in Apple's recommended compiler, LLVM 4.0. It definitely is not able to be compiled in 64-bit without some serious code overhauling. I wish someone would make a version of the client that uses Cocoa for all the windows, palettes, chat window, standard OS X menu bar, etc. I think that would cut down on the codebase substantially and improve performance... but it would make it hard to do it as a multi-platform deal.
  • Create New...