batchmode에서 안됨

    public static void SetCloudProjectId(string id, string name, string company)
    {
        var type = Type.GetType("UnityEditor.Connect.UnityConnect, UnityEditor, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null");
        PropertyInfo instanceInfo = type.GetProperty("instance");
        object settingsInstance = instanceInfo.GetValue(null, null);

        MethodInfo unbind = type.GetMethod("UnbindProject");
        MethodInfo bind = type.GetMethod("BindProject");

        Debug.Log("Unbinding current cloud project");
        unbind.Invoke(settingsInstance, new System.Object[] { });

        Debug.LogFormat("Binding cloud project to {0}: {1} ({2})", name, id, company);
        bind.Invoke(settingsInstance, new System.Object[] { id, name, company });

        Debug.LogFormat("Binded cloud project to {0}: {1} ({2})", name, id, company);
    }

실행후에 유니티 재시작필요.

Jenkins에서 호출하는경우 빌드전에 따로 실행

유니티 Bind를 사용하는 경우 batch mode에서 제대로 안되서 파일 직접변경이 필요.

    public static void SetCloudProjectIdFile(string name, string id, string company)
    {
        const string filepath = "ProjectSettings/ProjectSettings.asset";
        string[] lines = File.ReadAllLines(filepath);
        var new_lines = new List<string>();
        id = " " + id;
        name = " " + name;
        company = " " + company;

        foreach (string line in lines)
        {
            string[] command = line.Split(':');
            if (command.Length < 2)
            {
                new_lines.Add(line);
                continue;
            }

            switch (command[0])
            {
                case "  cloudProjectId":
                    if (command[1] != id)
                    {
                        Debug.Log($"Replace {command[0]}");
                        new_lines.Add(string.Join(":", command[0], id));
                    }
                    break;

                case "  projectName":
                    if (command[1] != name)
                    {
                        Debug.Log($"Replace {command[0]}");
                        new_lines.Add(string.Join(":", command[0], name));
                    }
                    break;

                case "  organizationId":
                    if (command[1] != company)
                    {
                        Debug.Log($"Replace {command[0]}");
                        new_lines.Add(string.Join(":", command[0], company));
                    }
                    break;

                default:
                    new_lines.Add(line);
                    break;
            }
        }

        File.WriteAllLines(filepath, new_lines.ToArray());
        AssetDatabase.Refresh();
    }

rm -f play.prop
touch play.prop

echo GIT_COMMIT_SHORT=$(git rev-parse --short ${GIT_COMMIT}) > play.prop
echo GIT_REVISION=$(git rev-list --count ${GIT_COMMIT}) >> play.prop

DECLARE @str varchar(8000)

SET @str = '10,2,3,4,5,6,7,8,9'


DECLARE @InputString varchar(8000)

SELECT @InputString = ',' + @str + ','


;with qry(n, names) as

       (select len(list.names) - len(replace(list.names, ',', '')) - 1 as n, substring(list.names, 2, len(list.names)) as names

        from (select @InputString names) as list

        union all

        select (n - 1) as n,

               substring(names, 1 + charindex(',', names), len(names)) as names

        from qry

        where n > 1)

 select substring(names, 1, charindex(',', names) - 1) dwarf

 from qry;





DECLARE @str varchar(8000)

SET @str = '10,2,3,4,5,6,7,8,9'


DECLARE @InputString varchar(8000)

SELECT @InputString = @str + ','


;WITH RecursiveCSV(x,y) 

AS 

(

    SELECT 

        x = SUBSTRING(@InputString,0,CHARINDEX(',',@InputString,0)),

        y = SUBSTRING(@InputString,CHARINDEX(',',@InputString,0)+1,LEN(@InputString))

    UNION ALL

    SELECT 

        x = SUBSTRING(y,0,CHARINDEX(',',y,0)),

        y = SUBSTRING(y,CHARINDEX(',',y,0)+1,LEN(y))

    FROM 

        RecursiveCSV 

    WHERE

        SUBSTRING(y,CHARINDEX(',',y,0)+1,LEN(y)) <> '' OR 

        SUBSTRING(y,0,CHARINDEX(',',y,0)) <> ''

)

(select x FROM RecursiveCSV)

OPTION (MAXRECURSION 32767);

자주 까먹어서 포스팅

void CopyClipboard( IN const tstring strTemp )
{
 if( ::OpenClipboard( NULL ) )
 {
  ::EmptyClipboard();

  HGLOBAL hBlock = ::GlobalAlloc( GMEM_MOVEABLE, sizeof(TCHAR) * ( strTemp.size() + 1 ) );
  if( hBlock )
  {
   TCHAR *pwszText = (TCHAR*)::GlobalLock( hBlock );
   if( pwszText )
   {
    _tcscpy( pwszText, strTemp.c_str() );
    ::GlobalUnlock( hBlock );
   }
   ::SetClipboardData( CF_UNICODETEXT, hBlock );
  }
  ::CloseClipboard();
  // We must not free the object until CloseClipboard is called.
  if( hBlock )
   ::GlobalFree( hBlock );
 }
}

OUT const tstring GetClipboard()
{
 if( ::OpenClipboard( NULL ) )
 {
  if( ::IsClipboardFormatAvailable( CF_UNICODETEXT ) == TRUE )
  {
   HANDLE hMem;
   hMem = ::GetClipboardData( CF_UNICODETEXT );
   const tstring reStr = (LPCTSTR)GlobalLock((HGLOBAL)hMem );
   GlobalUnlock( (HGLOBAL)hMem );

   return reStr;
  }
  ::CloseClipboard();
 }

 return tstring();
}

거북이만 된다.
속성에 tsvn:logminsize 를 넣어준다.
속성이라는게 있다는걸 왜 인제 안 거지-ㅅ-ㅋ

그전까지 synchronized block구현을

#define __SAUTOLOCK_SCORPED(cs) cs.Lock(); for( int __synchronized_count = 0; __synchronized_count < 1; __synchronized_count++, cs.Unlock() )

이런식으로 사용하고 있었다.

안에서 break를 걸면 문제가 생기지만 그렇게 쓸일은 없고-ㅅ-;
익셉션 처리는 안하므로 별상관없고...라고 생각하고 있었는데
for문 안에서 사용하는 경우에 for문을 종료할려고 break를 한다던가 continue를 해보리면 먹어버린다는 엄청난 버그가-_-;
게다가 요새는 VERIFY_RETURN식으로 쓰는게 많아서 불안한 부분도 꽤 있다.

이에 대해 gpg에 여러 글들이 올라오는 와중에 획기적인 해결방법이 나왔다.

synchronized block in C++
http://ricanet.com/new/view.php?id=blog/050807

improved synchronized block in C++
http://ricanet.com/new/view.php?id=blog/050811a

코드도 상당히 깔끔하며 여러가지 문제점을 쉽게 해결을 해주는 솔루션이다...
역시 세상은 넓다

_BitScanReverse, _BitScanReverse64

#pragma intrinsic(_BitScanReverse)
를 꼭 같이 써주도록 하쟈

+ Recent posts