<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0">
<channel>
<title>marchのBLOG</title>
<link>http://march.slmame.com</link>
<description>march　Korda　あることないこと</description>
<language>ja</language>
<pubDate>Thu, 03 May 2007 19:45:00 +0900</pubDate>
<lastBuildDate>Mon, 22 Sep 2008 23:58:26 +0900</lastBuildDate>
<docs>http://blogs.law.harvard.edu/tech/rss</docs> 
<generator>CLOG</generator>


<item>
<title>ソース(2):【日本語対応メッセージボード v05】</title>
<description>&gt;【日本語対応メッセージボード Japanese-MessageBoard v05】のソースです。以下は子プリムのスクリプトです。見所は、getTextureUuid 関数の中にあるテクスチャのUUIDです。16*16の文字が並んでいるテクスチャのUUIDです。私の技術不足で、拡大するとガタガタが目立ちますが、Secondlife内で自由に漢字を表示したい場合には役立つと思います。これを作るためにGIMP2でBMPから透過tgaに変換するためにScript-Fuに手を出してみたものの時間切れになり、結局はキー操作を記録再生するプログラムを使ったという思い出があります(^_^;)。では、子プリムのスクリプトです。ライセンスは、親プリムのスクリプトと一緒です。////v03:5face.//v04:comment_out llOwnerSay at init()//v05:transparent_texture.,,//integer PANEL_ID = -1;integer PRIM_PER_CHARACTOR = 5;        //1prim-5faceinteger INPRIM_LEFT_LEFT    = 0;integer INPRIM_LEFT_CENTER    = 1;integer INPRIM_CENTER        = 2;integer INPRIM_RIGHT_CENTER    = 3;integer INPRIM_RIGHT_RIGHT    = 4;key BLANK_TEXTURE = "5748decc-f629-461c-9a36-a35a221fe21f";         //blank image (100% white image with no alpha)//key TRANSPARENT_TEXTURE = "f54a0c32-3cd1-d49a-5b4f-7b792bebc204";     //a 100% alpha (fully transparent) texturevector FAIL_MAPPING_VECTOR = ;        //use when mapping fail.integer xmax = 16;integer ymax = 16;integer isDebugMode = FALSE;integer getPanelId(){    string originalObjectDesc;    integer originalObjectDescLen;    integer resultId = -1;    integer timeupCounter = 0;    string tmpStr;    string tmpSubStr;    //    originalObjectDesc = llGetObjectDesc();    originalObjectDescLen = llStringLength(originalObjectDesc);    //llOwnerSay("getPanelId" + ": original ObjectDesc length = " + (string)originalObjectDescLen + ".");    if(originalObjectDescLen &gt; 120)    // MAX(127 charactor) - 6 - 1;    //ID = 6 DIGITS.    {        llOwnerSay("getPanelId" + ": original ObjectDesc too long(" + (string)originalObjectDescLen + ")");        return -1;    }    //    llMessageLinked(LINK_THIS , 0, "getPanelId", NULL_KEY);    do    {        tmpStr = llGetObjectDesc();        tmpSubStr = llGetSubString(tmpStr, originalObjectDescLen, llStringLength(tmpStr));        if(llStringLength(tmpSubStr) &gt; 0)        {            // check first character of gotten ID is Numeric?            if(llSubStringIndex("0123456789", llGetSubString(tmpSubStr, 0, 0)) &gt;= 0)                         {                resultId = (integer)tmpSubStr;                llSetObjectDesc(originalObjectDesc);                return resultId;            }        }        // no found id.        timeupCounter++;        llSleep(0.5);    }while(timeupCounter &lr; 10);    llOwnerSay("getPanelId" + ": time up.");    llSetObjectDesc(originalObjectDesc);    return -1;}init(){    //llResetScript();    //reset the historic low memory mark.    //DO NOT DO IT cause script DONT RUN!!    //llOwnerSay("---init " + llGetObjectName() + " with " + llGetScriptName() + "---");    llSetTexture("5748decc-f629-461c-9a36-a35a221fe21f", ALL_SIDES);    //Blank Texture    llOffsetTexture(1.0, 1.0, ALL_SIDES);    llRotateTexture(0.0, ALL_SIDES);    llScaleTexture(1.0, 1.0, ALL_SIDES);    //    PANEL_ID = getPanelId();    //llOwnerSay("---id = " + (string)PANEL_ID + ", " + llGetObjectName() + " with " + llGetScriptName() + "---");    //if(llGetListLength(unicodeTextureList)  xmax || x &lr; 0)    {        x = 0;    }    pos.x = (1.0 / xmax) * ((xmax / 2) - x - 0.5);    pos.x *= (-1);    //    y = code / xmax;    //xmax is. NOT ymax.    if(y &gt; ymax || y &lr; 0)    {        y = 0;    }    pos.y = (1.0 / ymax) * ((ymax / 2) - y - 0.5);    //    return pos;}integer inPrimPos2face(integer inPrimPos){    //for prism prim    if(inPrimPos == INPRIM_LEFT_LEFT   ){ return 3; }        //left-left    if(inPrimPos == INPRIM_LEFT_CENTER ){ return 7; }        //left-center    if(inPrimPos == INPRIM_CENTER      ){ return 4; }        //center    if(inPrimPos == INPRIM_RIGHT_CENTER){ return 6; }        //right-center    if(inPrimPos == INPRIM_RIGHT_RIGHT ){ return 1; }        //right-right    return -1;}float inPrimPos2angle(integer inPrimPos){    //for prism prim    return 0.0;}// prism-center face is shrinked and shifted.vector inPrimPos2prismOffset(integer inPrimPos){    if(inPrimPos == INPRIM_LEFT_LEFT   ){ return ; }        //left-left// ; }        //left-left    if(inPrimPos == INPRIM_LEFT_CENTER ){ return ; }        //left-center    if(inPrimPos == INPRIM_CENTER      ){ return ; }        //center    if(inPrimPos == INPRIM_RIGHT_CENTER){ return ; }        //right-center    if(inPrimPos == INPRIM_RIGHT_RIGHT ){ return ; }        //right-right// ; }        //right-right    return ZERO_VECTOR;}// prism-center face is shrinked and shifted.vector inPrimPos2prismScale(integer inPrimPos){    if(inPrimPos == INPRIM_LEFT_LEFT   ){ return ; }        //left-left    if(inPrimPos == INPRIM_LEFT_CENTER ){ return ; }        //left-center    if(inPrimPos == INPRIM_CENTER      ){ return ; }        //center    if(inPrimPos == INPRIM_RIGHT_CENTER){ return ; }        //right-center    if(inPrimPos == INPRIM_RIGHT_RIGHT ){ return ; }        //right-right    return ZERO_VECTOR;}vector normalizeTextureOffset(vector offset){    //llOwnerSay("normalize input= " + (string)offset);    while(offset.x &gt;  1.0){ offset.x = (2.0 - offset.x) * (-1);}    while(offset.x &lr; -1.0){ offset.x = (1.0 + offset.x);}    while(offset.y &gt;  1.0){ offset.y = (2.0 - offset.y) * (-1);}    while(offset.y &lr; -1.0){ offset.x = (1.0 + offset.y);}    //llOwnerSay("normalize output=" + (string)offset);    return offset;}vector setCharactor(integer utf16Code, integer inPrimPos){    key textureUuid;    //range check.    if(utf16Code &lr; 0)    {        llSay(DEBUG_CHANNEL, (string)utf16Code + "is code range error");        return ;    }    if(PRIM_PER_CHARACTOR &lr; inPrimPos)    {        llSay(DEBUG_CHANNEL, (string)inPrimPos + "is prim range error.(only " + (string)PRIM_PER_CHARACTOR + "charactor can set.");        return ;    }    //    //get texture infomation.    //    integer faceNum = inPrimPos2face(inPrimPos);    //hide texture while change.    if(isDebugMode == FALSE)    {        llSetAlpha(0.0, faceNum);    }    //get texture uuid.    textureUuid = getTextureUuid(utf16Code);    llSetTexture(textureUuid, faceNum);    //return IF cannot mapping.     if(textureUuid == BLANK_TEXTURE)    {        //llSetAlpha(0.0, faceNum);     //still transparent.        return FAIL_MAPPING_VECTOR;    }    //    //set texture to face.    //    //shift texture.    vector pos = utf16Code2pos(utf16Code);    pos = pos + inPrimPos2prismOffset(inPrimPos);    pos = normalizeTextureOffset(pos);    llOffsetTexture(pos.x, pos.y, faceNum);    //llOwnerSay("setCaractor " + (string)pos);    //rotete texture    float angle = inPrimPos2angle(inPrimPos);    llRotateTexture(angle, faceNum);    //streatch texture.    vector scale = ;    vector prismScale = inPrimPos2prismScale(inPrimPos);    scale.x = scale.x * prismScale.x;    scale.y = scale.y * prismScale.y;    llScaleTexture(scale.x, scale.y, faceNum);      // kakudai    if(isDebugMode == FALSE)    {        llSetAlpha(1.0, faceNum);    }    //for debug.    //llOwnerSay("offset=" + (string)pos + ", scale=" + (string)scale + ", prismOffset=" + (string)inPrimPos2prismOffset(inPrimPos));    return pos;}default{    state_entry()    {        init();    }    on_rez(integer start_param)    {        init();    }        link_message(integer sender_num, integer charactorUtf16Code, string charactorPosStr, key id)    {        integer charactorPos;        charactorPos = (integer)charactorPosStr;        if((PANEL_ID * PRIM_PER_CHARACTOR </description>
<link>http://march.slmame.com/e396515.html</link>
<guid>http://march.slmame.com/e396515.html</guid>
<category>LSL</category>
<pubDate>Mon, 13 Oct 2008 00:11:27 +0900</pubDate>

</item>

<item>
<title>ソース(1):【日本語対応メッセージボード v05】</title>
<description>&gt;【日本語対応メッセージボード Japanese-MessageBoard v05】のソースです。このオブジェクトは1つの親と複数の子の2種類から構成されています。親プリムでユーザとのやりとりを行い、子プリムで文字を表示しています。仕様メモ：・チャンネルは、いくつかの中から選択する。　たまたま重なったら移動する。という程度の自由度。・メニューの説明文字列は日本語のみ、ボタンは英語のみ。・タッチしてリッスンチャンネルを開けた後に、チャンネル番号を変えた場合は、　もう一度タッチしてリッスンチャンネルを開けなければメッセージを変更できない。これは仕様。・グループモードの場合、オーナーであっても別グループがActiveの場合は、　タッチ等ができない。これは仕様。【工夫】・書き換え中は透明にして、書き換えを見せない(デバッグ中以外は)・リセット時のデフォルト文字列は、途中に空白に見えるひらがな・カタカナを入れて　ロード時間をかせぐ　「-・-・-・-・-・-・-・-・-・-・」　-・- - - - - - - - - 」　U+002D 「-」　U+30FB　(UTF-8:E3 83 BB)　「・」本当の中点　(ひらがな・カタカナ)　U+FF00　(UTF-8:EF BC 80)　マッピング無し　(全角英数字・半角カタカナ)　U+25AA　(UTF-8:E2 96 AA)　「BLACK SMALL SQUARE」　◆記号や●記号　U+26BF　(UTF-8:E2 9A BF)　マッピング無し　★記号や♪記号urlEscapedString2List 関数は、listenで受け取った文字列を、1文字ずつのリストにします。RFC 2279 (3629 ではなく)を見ながら勉強がてら書いたものですが、他のスクリプトにも転用できるんじゃないかと思います。一部のデバッグ用スクリプトも残してありますので、参考までに。以下は親プリムのスクリプトです。ライセンスはCreative Commons Attribution-Share Alike 3.0 Unported Licensehttp://creativecommons.org/licenses/by/3.0/です。//v4: add dialog.//v5:change dialog.//initial message.//"irasshaimase."string INITIAL_MESSAGE = "-%E3%83%BB-%E3%83%BB-%E3%83%BB-%E3%83%BB-%EF%BC%80-%E3%83%BB-%E2%96%AA-%E3%83%BB-%E3%83%BB-%E2%9A%BF";//integer channelGather   = 7;integer CHANNEL_DIALOG  = 42521;    // dialog channelinteger LHandleGather;integer LHandleDialog;float LISTEN_GATHER_TIMEOUT = 90.0; //gather channel timeout(sec.)//for dialogstring B_PRINT_MODE = "USER";string B_CHANGE_MODE_ALL   = "ALL";string B_CHANGE_MODE_GROUP = "GROUP";string B_CHANGE_MODE_OWNER = "OWNER";////string B_CHANGE_CHANNEL = "CHANGE_CHANNNE";string B_MODIFY_MESSAGE = "MESSAGE";//string B_PRINT_COLOR = "COLOR";string B_CHANGE_COLOR_RED = "RED";string B_CHANGE_COLOR_GREEN = "GREEN";string B_CHANGE_COLOR_BLUE = "BLUE";string B_CHANGE_COLOR_YELLOW = "YELLOW";    //kiirostring B_CHANGE_COLOR_MAGENTA = "MAGENTA";  //murasakistring B_CHANGE_COLOR_CYAN = "CYAN";        //mizuirostring B_CHANGE_COLOR_WHITE = "WHITE";string B_CHANGE_COLOR_BLACK = "BLACK";//string B_PRINT_CHANNEL = "CHANNEL";string B_CHANGE_CHANNEL_7 = "7";string B_CHANGE_CHANNEL_10 = "10";string B_CHANGE_CHANNEL_17 = "17";//string B_HELP = "HELP";string B_RESET = "RESET";string B_DEBUG_INFO = "DEBUG_INFO";string B_CLOSE = "CLOSE";//string B_PRINT_NOTIFY_WRITE = "NOTIFY_WRITE";//string B_CHANGE_NOTIFY_WRITE_TRUE = "NOTIFY_WRITE_TRUE";//string B_CHANGE_NOTIFY_WRITE_FALSE = "NOTIFY_WRITE_FALSE";//integer MODE_ALL = 1;integer MODE_GROUP = 2;integer MODE_OWNER = 3;integer isPublicMode = TRUE;integer modifyMode = MODE_ALL;//integer isNotifyWrite = FALSE;//for DEBUGinteger startTime;integer isDebugMode = FALSE;////misc functions.////--------//see  http : // wiki.secondlife.com/wiki/XTEA_Strong_Encryption_Implementation//--------//Function: ord//Returns the index of an ASCII characterinteger ord(string chr){    string ASCII = "                                 !\"#$%&amp;'()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";    if(llStringLength(chr) != 1) return -1;    if(chr == " ") return 32;    return llSubStringIndex(ASCII, chr);}integer atoi(string str){    integer i;    string chr;    integer num = 0;    //Define character string [0-F] for use in building the num.    string characters = "0123456789ABCDEF";           str = llToUpper(str);    //not care overflow!    for(i = 0; i &lr; llStringLength(str); i++)    {        chr = llGetSubString(str, i, i);        num = num * 16 + llSubStringIndex(characters, chr);    }    //llOwnerSay("atoi(" + str + ")=" + (string)num);    return num;}////unicode process functions.//list urlEscapedString2List(string escapedStr){    integer i;    string chr;    list resultList = [];    integer len;    integer num1;    integer num2;    integer num3;    integer num4;        len = llStringLength(escapedStr);    i = 0;    while( i &lr; len)    {        chr = llGetSubString(escapedStr, i, i);        if(chr != "%")        {            resultList = resultList + ord(chr);        // not atoi            i = i + 1;    //process 1 charactor.        }        else        {            // get first escaped num.            num1 = atoi(llGetSubString(escapedStr, i+1, i+1)) * 16 +                   atoi(llGetSubString(escapedStr, i+2, i+2));            i = i + 3;    //process 3 charactor.            // get octet type.            if((num1 &amp; 0x80) == 0)        //0xxxxxxx    -&gt; 1 octet.(ex. %20, etc..)            {                            //0000 0000 to 0000 007F(U+0000 to U+007F)                resultList = resultList + num1;            }            else if((num1 &amp; 0x20) == 0)    //110xxxxx 10xxxxxx -&gt; 2 octet.            {                            //00000080 to 000007FF                 num2 = atoi(llGetSubString(escapedStr, i+1, i+1)) * 16 +                       atoi(llGetSubString(escapedStr, i+2, i+2));                i = i + 3;    //process 3 charactor.                                resultList = resultList +                             (integer)(((num1 &amp; 0x1F)</description>
<link>http://march.slmame.com/e396498.html</link>
<guid>http://march.slmame.com/e396498.html</guid>
<category>LSL</category>
<pubDate>Sun, 12 Oct 2008 23:48:13 +0900</pubDate>

</item>

<item>
<title>説明書:【日本語対応メッセージボード v05】</title>
<description>&gt;【日本語対応メッセージボード Japanese-MessageBoard v05】のソース公開にあたり、まずは説明書を公開します。実物はこちらのエントリを参照ください。http://march.slmame.com/e5054.htmlhttp://march.slmame.com/e4968.htmlでは、説明書です。---【日本語対応メッセージボード Japanese-MessageBoard v05】　説明書このたびは「日本語対応メッセージボード」をお求めいただき、ありがとうございます。●構成本品には以下が含まれています。・【日本語対応メッセージボード】　本体・【日本語対応メッセージボード】　説明書(このノートカードです)●使い方１．スクリプト動作が可能な土地に置いてください。２．タッチして表示されるメニューで「MESSAGE」を選んでください。３．ダイヤログボックスで指示されたチャンネルで発言してください。　　発言内容がメッセージボードに表示されます。　　発言例：「/7 こんにちは」●メニューについて・オーナーがタッチすると、メニューが表示されます。[MESSAGE] ・・メッセージを変更する際に使用します。　　　　　　　表示されたダイヤログで指示されたチャンネルで発言してください。　　　　　　　いたずら防止のため、チャンネルは90秒で閉じられます。　　　　　　　90秒以上経過した場合は、再度タッチしてから発言してください。[USER]・・・・操作可能なユーザの種類を切り替えます。デフォルトの設定は「ALL」です。　　　　　　　・[ALL]にすると、誰でもメッセージ変更可能です。　　　　　　　・[GROUP]にすると、設定されたグループメンバのみがメッセージ変更可能です。　　　　　　　　あらかじめ日本語対応メッセージボードを編集(Edit)して、グループを　　　　　　　　設定してください。　　　　　　　　操作するユーザは、日本語対応メッセージボードに設定されたグループを　　　　　　　　アクティブにしてください。　　　　　　　　(アクティブになると、アバターの頭上に表示されるアバター名の上に　　　　　　　　グループ名が表示されます)　　　　　　　・[OWNER]にすると、所有者のみがメッセージ変更可能です。[COLOR] ・・・文字の色を変更します。　　　　　　　指定できる色は、WHITE,BLACK,RED,GREEN,BLUE,YELLOW,MAGENTA,CYANです。　　　　　　　BLACKを選ぶと文字が見えませんのでご注意ください。[CHANNEL] ・・メッセージを変更するためのチャンネル番号が、　　　　　　　既に別なオブジェクトで使用されていた場合に使用します。　　　　　　　チャンネル番号は3種類から選択可能ができます。　　　　　　　デフォルトのチャンネル番号は7です。[RESET] ・・・設定をデフォルトに戻し、デフォルトのメッセージを表示します[HELP]・・・・使い方の簡単な説明をオーナー宛てに発言します　　　　　　　詳しい説明をノートカードとして渡します。●制限事項・一部の記号は表示されず、空白として表示されます。●謝辞・このメッセージボードのフォントには、　「さざなみゴシック」を使用しています。　また、記号の一部には「ふい字 v2.9」を使用しています。　関係者の皆様に感謝します。●カスタマイズ・Modify可能な設定にしてありますので、大きさや概観の一部をカスタマイズ可能です。・元に戻す機能は備えておりませんので、カスタマイズは自己責任で行ってください。・文字が表示されるパネルの後ろにあるボードは、メッセージ書き換えなどに　必要な部品ですので、消さないでください。・動作不良時の解析用に、現在の設定内容を出力する機能が備えてあります。　通常は使用する必要はありません。●作者作者:march Korda・ご意見・ご要望などがございましたら作者までIMをお願いします。　今後の活動の参考にさせていただきます。</description>
<link>http://march.slmame.com/e396491.html</link>
<guid>http://march.slmame.com/e396491.html</guid>
<category>LSL</category>
<pubDate>Sun, 12 Oct 2008 23:43:25 +0900</pubDate>

</item>

<item>
<title>別プリムにあるスクリプト間で定数を素直に共有できないか?</title>
<description>別なプリムにあるスクリプトで同じ定数を使いたい場合に、定数を変更するときのミスを減らしたい。つまり、スクリプトファイル外にある定数を素直に共有できないか?つまり、要求1:同じ意味の定数を変える場合は、変更するところは一箇所だけにしたい要求2:タイプミスによるバグを減らしたい例：オブジェクトAとBがチャンネルチャットで通信する場合には、AでSayするチャンネルをBがlistenする必要がある。(同じチャンネル番号を使う必要がある)このケースで、チャンネルを変えたい場合にどうするか。[オブジェクトA]--------(ch.3)--------&gt;[オブジェクトB]結論：方法が無い。んじゃないかなぁ。方法が無い理由：C言語と比べてみる。C言語で書かれたソースファイルを実行できるようにするためには、おおまかには以下の2つの手順が必要である。(1)ソースファイルをコンパイルして、コンパイル済みオブジェクトファイルを作る(2)コンパイル済みオブジェクトファイルをリンクして、実行ファイルを作るこの時に、以下の便利なことができる。(1)では#include文により他のソースファイルを取り込む、(2)ではextern宣言で型だけ決めてあった外部変数と、実際の定義(記憶領域の割付)を結びつける。LSLにはこのような仕組みが無い。(1)は、llRemoteLoadScriptPin関数で同じプリム内に入れることはできても、同じスクリプトファイルには入れられない。(2)は、宣言(型を決める) ＝ 定義(記憶領域の割付)で、この2つを分離できない。このため、ヘッダファイルをincludeしたり、別なスクリプトで代入した変数を使ったりできない。代替案：案A:マジックワードとして、両方のスクリプトに数字を書く。…一番素直。一番面倒。案B:定数として定義する。両方のスクリプトに定数定義をコピペする。原始的だがタイプミスは減らせる案C:llLinkMessageで定数を得るスクリプトを書く。…llRemoteLoadScriptPinで…#includeとは違う!…一見よさそうだが、スクリプト内でllLinkMessageを呼ぶ関数を書かなければならない。　(スクリプト外の関数は呼び出せない)……引数がマジックワードになる。………コピペと同じ。案D:ノートカードから取得する…定数名をじかにかかなければならない(コンパイルエラーにはできない)…定数が見つからないときのエラー処理や、処理のタイミング(起動時?)に注意すればいけるかも。案E:外部サーバを使う…外部サーバを呼び出す関数や、何が欲しいかを決めておく必要がある。llLinkMessageと同じ。案F:既にある定数を無理やり使う…PIとかCONTROL_BACKとか……もはや「変更は一箇所で」という目的からずれている案G:別スクリプトで同じstateを書いたら共有できるのではないか?…1プリムに入っていても、スクリプトが別ならメモリ空間は別なので、共有できない。案H:stateを上手に遷移させ、DESCやテクスチャオフセットなどでやりとりすればいけるかも。…未検証。…タイプミスは防げていない。というわけで、リーズナブルなのは定数はスクリプトの頭にまとめておいてコピペする、頑張るならノートカードから取得するのがいいんじゃないでしょうか。間違いの指摘やご意見を歓迎します。</description>
<link>http://march.slmame.com/e136611.html</link>
<guid>http://march.slmame.com/e136611.html</guid>
<category>LSL</category>
<pubDate>Fri, 08 Feb 2008 00:22:49 +0900</pubDate>

</item>

<item>
<title>1.17でllGetNotecardLineで日本語取出せず</title>
<description>notecardのパブリック・ビューアを作ろうとしたが、llEscapeURLしても日本語がとりだせない。1.17で何か方法ないものか。あさっての1.18まで待つか。&gt;* Fixed SVC-52: UTF-8 characters read from notecards are lostで（多分）なおるだろう。</description>
<link>http://march.slmame.com/e11616.html</link>
<guid>http://march.slmame.com/e11616.html</guid>
<category>LSL</category>
<pubDate>Mon, 25 Jun 2007 22:54:00 +0900</pubDate>

</item>

<item>
<title>メモリ管理には謎がある</title>
<description>"エースプログラマの uki-uki 日記"「Second Life そんなネタふりされたら・・・・（LSL最適化） 」http://blog.g-up.com/hidenori_goto/?s=2&amp;b=11030イベント内で、llOwnerSay( "Hello Avatar!" ); のような処理をしている場合、&gt;元の文字列が関数のコードブロックに直接保存されていますが、&gt;実行時にこれとは別にメモリ領域を確保する必要があるため、&gt;実質文字列長の倍の領域のメモリを消費していると考えることができます。だそうで、グローバル変数のほうがメモリを節約できる。という記事。なるべくローカル変数を使うようにしていた私には驚くような記事でした。Stack-Heap Collision で悩んでいて、llGetFreeMemory() でいくつか実験してよく分からなかったので別な手段で解決したのですが、バイトコードやメモリの内容を調べる方法はあるんでしょうか＾＾？</description>
<link>http://march.slmame.com/e8761.html</link>
<guid>http://march.slmame.com/e8761.html</guid>
<category>LSL</category>
<pubDate>Thu, 07 Jun 2007 22:50:29 +0900</pubDate>

</item>

<item>
<title>複数スクリプト</title>
<description>複数スクリプトはlink_messageで連動できると教えてもらった。１オブジェクト内なら受け渡しはどうにかなりそう。今度試してみよう。教えてくれたりおしゃべりにつきあってくれたりする人がいるのは嬉しいし有り難い。</description>
<link>http://march.slmame.com/e6124.html</link>
<guid>http://march.slmame.com/e6124.html</guid>
<category>LSL</category>
<pubDate>Tue, 22 May 2007 01:25:00 +0900</pubDate>

</item>

<item>
<title>llRegionSay()はどこでも届くのか不明</title>
<description>1.16.0(1)で入るllRegionSay()はオブジェクト間でregion-wideな通信ができるらしい。どういうことなのかよく分からない。オブジェクト編集で数値入力する欄に日本語で０を入れると落ちる場合があるのはどうにかしてもらいたい。</description>
<link>http://march.slmame.com/e5498.html</link>
<guid>http://march.slmame.com/e5498.html</guid>
<category>LSL</category>
<pubDate>Wed, 16 May 2007 22:07:00 +0900</pubDate>

</item>

<item>
<title>「Ｌｉｍｉｔ　５　コンテスト」表彰式</title>
<description>「Ｌｉｍｉｔ　５　コンテスト」表彰式２２時まで投票受け付けで、その後に表彰式があった。1,2位のMoranさんは1人としてカウントしたため、2位がManjiさんで3位がmarch、4位がLeosoさんだった。Moranさんのラーメンはとてもリアルで湯気まであがっていた。扇風機もなびいてるひもがいい雰囲気をだしていた。Manjiさんのマイクスタンドはマイクの高さやポーズを変えられるなど親切な作りなうえ、説明看板も分かりやすかった。私の掲示板は、もう少し小さめのほうが字がにじまなくてよかったかな？Leosoさんの水と一緒に回れる噴水は座ってみるとゆったりとした気分になれてよかった。個人的にはSheltさんのロボヘッドがカッコよかったと思う。参加者の皆さんおつかれさまでした。</description>
<link>http://march.slmame.com/e5054.html</link>
<guid>http://march.slmame.com/e5054.html</guid>
<category>LSL</category>
<pubDate>Sat, 12 May 2007 22:51:00 +0900</pubDate>

</item>

<item>
<title>ひとこと掲示板を漢字対応</title>
<description>漢字がちゃんと出るように直して、簡単なチェックをして、会場に置きなおした。ASUKAグループに招待してもらったので、グループも指定した。listは初期化時に72個しかアイテムを持てないのは知っていたので、区切って256個のキー追加。すると、実行時にStack-Heap Collisionが出て動かない。この辺を見ていくつか試す。http://lslwiki.net/lslwiki/wakka.php?wakka=memoryデバッグチャンネルで言ってくれればいいのに、オブジェクトの発言として出るから最初は見逃してしまった。結局リストの要素は16個のキーにしてif文を使ってだらだらと書くことにした。</description>
<link>http://march.slmame.com/e4968.html</link>
<guid>http://march.slmame.com/e4968.html</guid>
<category>LSL</category>
<pubDate>Sat, 12 May 2007 00:31:00 +0900</pubDate>

</item>

<item>
<title>「Ｌｉｍｉｔ　５　コンテスト」に作品を出した</title>
<description>「Ｌｉｍｉｔ　５　コンテスト」に作品を出した。前から作っていた掲示板である。漢字も対応だ！と意気込んだ。さざなみフォントで16*16文字で256枚の画像を作って、使いそうなところをuploadした所で力尽きた。英数字と一部の漢字・記号しか表示できない状態である。需要があったらちゃんと漢字対応しよう。自分のデザインセンスのなさには驚きと困惑をおぼえる。　 台形プリムを使って3フェース表示させる方法はcheyさんに教えてもらった。最初に思いついた人はアイデア賞モノだと思う。</description>
<link>http://march.slmame.com/e4870.html</link>
<guid>http://march.slmame.com/e4870.html</guid>
<category>LSL</category>
<pubDate>Thu, 10 May 2007 22:10:00 +0900</pubDate>

</item>

<item>
<title>llRemoteLoadScriptPinで別スクリプト呼出</title>
<description>llRemoteLoadScriptPinで別スクリプト呼出複数のスクリプトの扱いについて、情報が散逸しているので自分用にまとめる。情報源は、http://wiki.secondlife.com/wiki/ やhttp://www.lslwiki.net/lslwiki/wakka.php やLSLGuide.pdf。（間違いがあったら教えてください～）・オブジェクト内には、スクリプト名のABC順に並べ変えられて格納される。　大文字小文字は関係ない。・一番上に格納されているスクリプトが実行される・同じオブジェクトに入っているスクリプトを呼び出す際は、PINを指定しておかなくてOK。　KEYもNULL_KEYでOK。・別なオブジェクトに入っているスクリプトを呼ぶ場合は、呼び先がRezされている必要がある　(インベントリに入っているだけではダメ)・呼び出すタイミング(イベント)によって、動作が変わるので注意。下記の例参照。　state_entry()で別スクリプトを呼び出すと、touch_start()の処理はinvokerが終わってからchild　touch_start()で別スクリプトを呼び出すと、　・・・だと思ったが、いったんTakeしてからでないと、最後にオブジェクトに入れたスクリプト　を最初に実行しているように見える。不明。・PIN(Personal Identification Number)はinteger・スクリプトをまたがって変数を受け渡す方法はなさそう。　llRemoteLoadScriptPin関数の最後の引数を使えば、llGetStartParameter関数でintegerを受け取れる　ID設定に使うなら、オブジェクトの属性としてllSetAlpha関数/llGetAlpha関数とかで受け渡したほうがいいかも。・llRemoteLoadScriptPin関数の先頭の引数の「key target」に何を指定すればいいのかは不明。//00Invoker-1	呼び出す側のスクリプトその１default{    state_entry()    {        llOwnerSay("rez " + llGetObjectName() + "with " + llGetScriptName());        llRemoteLoadScriptPin(NULL_KEY, "child-script", 3, FALSE, 0);    }    touch_start(integer total_number)    {        llOwnerSay("Touch start at " + llGetScriptName());        llOwnerSay("Touch  end  at " + llGetScriptName());    }}//00Invoker-2	呼び出す側のスクリプトその２default{    state_entry()    {        llOwnerSay("rez " + llGetObjectName() + "with " + llGetScriptName());    }    touch_start(integer total_number)    {        llOwnerSay("Touch start at " + llGetScriptName());        llRemoteLoadScriptPin(NULL_KEY, "child-script", 3, FALSE, 0);        llOwnerSay("Touch  end  at " + llGetScriptName());    }}//child-script	呼び出される側のスクリプトdefault{    state_entry()    {        llOwnerSay("rez " + llGetObjectName() + "with " + llGetScriptName());    }    touch_start(integer total_number)    {        llOwnerSay("Touch start at " + llGetScriptName());        llOwnerSay("Touch  end  at " + llGetScriptName());    }}</description>
<link>http://march.slmame.com/e4571.html</link>
<guid>http://march.slmame.com/e4571.html</guid>
<category>LSL</category>
<pubDate>Mon, 07 May 2007 19:12:00 +0900</pubDate>

</item>

<item>
<title>文字の変わる箱</title>
<description>「／3 A」とかやると文字の変わる箱を作った。余計なコードやデバッグ用のコードが残っているが、自分メモとして。大半はパクリ。フォントは東雲なんでとりあえず安心。&amp;nbsp;&amp;nbsp;string texture;float x;float y;float u;float v;integer xmax = 16;integer ymax = 16;integer LHandle;integer CHANNEL = 3;//--------//see&amp;nbsp; http : // wiki.secondlife.com/wiki/XTEA_Strong_Encryption_Implementation//--------//Function: ord//Returns the index of an ASCII characterinteger ord(string chr){&amp;nbsp;&amp;nbsp;&amp;nbsp; string ASCII = "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !\"#$%&amp;amp;'()*+,-./0123456789:;&amp;lt;=&amp;gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";&amp;nbsp;&amp;nbsp;&amp;nbsp; if(llStringLength(chr) != 1) return -1;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(chr == " ") return 32;&amp;nbsp;&amp;nbsp;&amp;nbsp; return llSubStringIndex(ASCII, chr);}//Function:&amp;nbsp; DWord2Hex//Converts a dword containted in a LSL integer to hexadecimal format.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string DWord2Hex(integer m){&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; string result;&amp;nbsp;&amp;nbsp;&amp;nbsp; integer i = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp; integer index = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Define character string [0-F] for use in building the hex.&amp;nbsp;&amp;nbsp;&amp;nbsp; string characters = "0123456789ABCDEF";&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Step through 8 times, for a total of 32 bits, 8 nibbles, and 8 hexadecimal digits.&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i = 0; i &amp;lt; 8; i++){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Get a nibble by right-shifting and masking off 4 bits.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index&amp;nbsp; = (m &amp;gt;&amp;gt; (i * 4)) &amp;amp; 0xF;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Grab character from the characters string at index position and add it to the result string.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = llInsertString(result, 0, llGetSubString(characters,index,index));&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return result;}integer initialize(){&amp;nbsp;&amp;nbsp;&amp;nbsp; LHandle = llListen(CHANNEL, "", NULL_KEY, "");&amp;nbsp;&amp;nbsp;&amp;nbsp; llListenControl(LHandle, TRUE);&amp;nbsp;&amp;nbsp;&amp;nbsp; llSleep(0.5);&amp;nbsp;&amp;nbsp;&amp;nbsp; llOwnerSay("listen start. ch=" + (string)CHANNEL);&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;}vector ascii2pos(integer code){&amp;nbsp;&amp;nbsp;&amp;nbsp; integer x;&amp;nbsp;&amp;nbsp;&amp;nbsp; integer y;&amp;nbsp;&amp;nbsp;&amp;nbsp; vector pos;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp; x = code % xmax;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(x &amp;gt; xmax || x &amp;lt; 0)&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; pos.x = (1.0 / xmax) * ((xmax / 2) - x - 0.5);&amp;nbsp;&amp;nbsp;&amp;nbsp; pos.x *= (-1);&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp; y = code / xmax;&amp;nbsp;&amp;nbsp;&amp;nbsp; //xmax is. NOT ymax.&amp;nbsp;&amp;nbsp;&amp;nbsp; if(y &amp;gt; ymax || y &amp;lt; 0)&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; pos.y = (1.0 / ymax) * ((ymax / 2) - y - 0.5);&amp;nbsp;&amp;nbsp;&amp;nbsp; //pos.y *= (-1);&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp; return pos;}vector setAsciiTexture(integer code){&amp;nbsp;&amp;nbsp;&amp;nbsp; vector pos = ascii2pos(code);&amp;nbsp;&amp;nbsp;&amp;nbsp; llOffsetTexture(pos.x, pos.y, ALL_SIDES);&amp;nbsp;&amp;nbsp;&amp;nbsp; llOwnerSay("setAsciiTexture " + (string)pos);&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp; u = 1.0 / xmax;&amp;nbsp;&amp;nbsp;&amp;nbsp; v = 1.0 / ymax;&amp;nbsp;&amp;nbsp;&amp;nbsp; llScaleTexture(u, v, ALL_SIDES);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // kakudai&amp;nbsp;&amp;nbsp;&amp;nbsp; return pos;}default{&amp;nbsp;&amp;nbsp;&amp;nbsp; state_entry()&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //x = (1.0 / xmax) * -3.5;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //y = (1.0 / ymax) * 6.5;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //u = 1.0 / xmax;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //v = 1.0 / ymax;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //llOffsetTexture(x, y, ALL_SIDES);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //llScaleTexture(u, v, ALL_SIDES);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // kakudai&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //llOwnerSay("x=" + (string)x + ",y=" + (string)y + ",u=" + (string)u + ",v=" + (string)v);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; initialize();&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; listen(integer channel, string name, key id, string message)&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string oneStr = llGetSubString(message, 0, 0);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; llOwnerSay("[" + oneStr + "] is " + (string)ord(oneStr) + ". 0x" + DWord2Hex(ord(oneStr)) + ".");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; llOwnerSay("[" + oneStr + "] is " + (string)ord(oneStr) + ". 0x" + DWord2Hex(ord(oneStr)) + ".");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; integer a = ord(oneStr);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; integer pos_x = a % 16;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; integer pos_y = a / 16;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; llOwnerSay((string)a + "=(" + (string)pos_x + "," + (string)pos_y +")");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; llOwnerSay((string)ascii2pos(a));&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setAsciiTexture(a);&amp;nbsp;&amp;nbsp;&amp;nbsp; }}</description>
<link>http://march.slmame.com/e4289.html</link>
<guid>http://march.slmame.com/e4289.html</guid>
<category>LSL</category>
<pubDate>Sat, 05 May 2007 02:26:00 +0900</pubDate>

</item>

<item>
<title>コードの貼り付け</title>
<description>コードを貼ってみる。キーワードを色付けとかはプラグインがいるのかな。default{    state_entry()    {        llSay(0, "Hello, Avatar!");    }    touch_start(integer total_number)    {        llSay(0, "Touched.");    }}</description>
<link>http://march.slmame.com/e4221.html</link>
<guid>http://march.slmame.com/e4221.html</guid>
<category>LSL</category>
<pubDate>Fri, 04 May 2007 10:02:43 +0900</pubDate>

</item>


</channel>
</rss>