유니티를 사용하다 보면 디버깅을 위해 로그를 찍을때 리스트 뷰에서는 콜스택에 대한 정보를 볼수 없어 귀찮은 경우가 많다. 어셋 스토에서 판매하고 있는 'Console Pro'라는 어셋을 사용하면 편리하긴하지만..

using UnityEngine;


public static class LogHeader

{

    public static string Path

    {

        get

        {

#if UNITY_EDITOR || USE_DEBUGGING

            string callStack = StackTraceUtility.ExtractStackTrace();

            callStack = callStack.Substring(callStack.IndexOf("\n") + 1);

            callStack = callStack.Substring(0, callStack.IndexOf("\n") + 1);

            return callStack;

#else

            return "";

#endif

        }

    }


    public static string Function

    {

        get

        {

#if UNITY_EDITOR || USE_DEBUGGING

            string callStack = StackTraceUtility.ExtractStackTrace();

            callStack = callStack.Substring(callStack.IndexOf("\n") + 1);

            callStack = callStack.Substring(0, callStack.IndexOf("("));

            //callStack = callStack.Substring(0, callStack.IndexOf(" ") + 1);

            return "[" + callStack + "] ";

#else

            return "";

#endif

        }

    }


    // example :

    //     Debug.Log(LogHeader.Function + "any log text will be here");

    // result :

    //    CallStackLogMain:func_2() (at Assets/CallStackLogMain.cs:17)

    //    any log text will be here

}



Posted by kukuta
TAG C#, unity

댓글을 달아 주세요

1. jQuery CDN 연결

jQuery 자바스크립트를 다운 받고 서버에 다시 올리기 귀찮으니 구글과 MS에서 제공하는 CDN(Content Delivery Network)을 사용하도록 하자 :

Google CDN :

<head>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

</head>


Microsft CDN :

<head>

<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.min.js"></script>

</head>



2. jQuery 문법 기본

$(selector).action()

  • '$' : jQuery를 사용하겠다는 선언
  • (selector) : html 엘리먼트를 찾고 접근하기 위한 selector
  • action() : 엘리먼트에 수행할 작업
  • jQuery selector는 css selector방식을 사용하고 있음. [진리는어디에/Web] - CSS Selectors 를 참고.
  • eg :
    • $(this).hide() - 현재 엘리먼트를 보이지 안도록 감추다
    • $("p").hide() - <p> 엘리먼트는 모두 보이지 않도록 감추다.
    • $(".test").hide() - class="test" 인 모든 엘리먼트를 보이지 않도록 감추다.
    • $("#test").hide() - id="test" 인 모든 엘리먼트를 보이지 않도록 감추다.

3. jQuery 시작

$(document).Ready(function() {

  // ...

});



jQuery Event

$(selector).click(function() {

});

* manual : https://www.w3schools.com/Jquery/jquery_events.asp

* reference : https://www.w3schools.com/Jquery/jquery_ref_events.asp


jQuery Effect :

$(selector).hide();

* manual : https://www.w3schools.com/Jquery/jquery_hide_show.asp

* reference : https://www.w3schools.com/Jquery/jquery_ref_effects.asp


jQuery HTML :

text() - Sets or returns the text content of selected elements

html() - Sets or returns the content of selected elements (including HTML markup). 위에꺼에 html도 같이 포함해서 리턴한다.

val() - Sets or returns the value of form fields. form에서 value에 매핑 된 값만 리턴한다.

attr() method is used to get attribute values.


append() - Inserts content at the end of the selected elements

 eg) ol 태그에 하위 li 태그를 append 할 수 있다

prepend() - Inserts content at the beginning of the selected elements

after() - Inserts content after the selected elements

before() - Inserts content before the selected elements


remove() - Removes the selected element (and its child elements)

empty() - Removes the child elements from the selected element


jQuery Traversing

* first()

* last()

* eq()

* filter() : https://www.w3schools.com/Jquery/jquery_filters.asp

* not()

* find()


jQuery AJAX(Asynchronous JavaScript and XML.)

* $(selector).load() : https://www.w3schools.com/Jquery/jquery_ajax_load.asp

* $.get(URL, callback)/$.post(URL, data, callback) : https://www.w3schools.com/Jquery/jquery_ajax_get_post.asp

* reference : https://www.w3schools.com/Jquery/jquery_ref_ajax.asp


Posted by kukuta

댓글을 달아 주세요

linux command

도구의발견 2018.03.30 12:08

check cpu

$ cat /proc/cpuinfo

$ dmesg | grep cpu


check cpu architecture(x86, x64, x86_64)

$ arch


check 'RAM' memory size :

"free" to see RAM information in KB.

"free -m" to see RAM information in MB

"free -g" to see RAM information in GB


$ cat /proc/meminfo


check 'Disk' storge

"df -h" to see disk partition and storage information

"fdisk -l" to see hard disk information

"du -sk" to see usage of current directory


$ cat /proc/ide/hda/model    -- hda

monitor processes and system resource usage :

"top"

https://www.booleanworld.com/guide-linux-top-command/





Posted by kukuta
TAG Command, Linux

댓글을 달아 주세요

여러 리눅스 서버를 관리하다 보면 현재 내가 어느 서버에 접속해 있는지 헷깔릴때가 있다. 터미널에서 제공하는 여러가지 도움을 주는 도구들이 있지만 개인적 경험으로 보았을때 쉘에서 현재 접속중인 서버의 이름을 보여주는 것이 가장 도움이 되었다.


하지만 쉘프롬프트를 꾸미는 셋팅이 자주 있는 일이 아니라 자꾸 방법을 까먹어 여기에 기록 해놓도록 한다.

(언젠가 이 블로그에 적은 기억이 있는것 같은데 찾을 수가 없어 중복 같지만 다시 한번 더 작성한다)


user_id@ip-172-31-15-60:~$ vi ~/.bashrc


# .bashrc


PS1="\u@<server name>:\w\$ "


위에서 :

 \u 는 현재 사용자의 이름을 나타낸다

 @ 는 그냥 @이다

 <server name>은 해당 서버를 구분하기 위해 넣어주는 이름이다

 \w 는 현재 디렉토리를 나타낸다.

 \$ 는 '$' 문자를 표시하기 하기 위해 앞에 역슬래쉬를 넣어준것 뿐이다.


위와 같이 작성을 완료하고 PS1 환경 변수의 변경을 적용하기 위해서는 source 커맨드를 사용해야 한다. 그럼 아래와 같이 쉘 프롬프트가 변경되어 출력 된다.


user_id@ip-172-31-15-60:~$ source ~/.bashrc

source .bashrc

user_id@build:~$


쉘프롬프트를 꾸미기 위해 보다 자세한 기호를 찾는 다면 아래 블로그를 참조하면 좋다

 http://webdir.tistory.com/105


Posted by kukuta

댓글을 달아 주세요

유니티로 작업하다 보면 데이터를 저장하기 위해 SerializedField와 같은 어트리뷰트를 사용한다. 문제는 개발 도중 이 필드의 이름이 변경되어 기존 저장된 데이터들을 사용하지 못하게 되는 경우가 있다. 이런 경우 FormerlySerializedAs 어트리뷰트를 이용해 기존 버전과의 호환성을 유지해 줄 수 있다.


만일 아래와 같이 m_MyVariable이라는 멤버 변수를 사용하고 있는데 :

class MyClass : MonoBehaviour

{

  [SerializeField]

  private string m_MyVariable;

}


m_MyVariable의 이름이 다른 것으로, 예를 들자면 m_ABetterName와 같이 바뀐다면 기존에 m_MyVariable의 이름으로 저장된 데이터를 읽어 들이지 못하게 된다.

이럴 경우 아래와 같이 작성해주게 된다면 기존  m_MyVariable의 데이터를 m_ABetterName으로 치환해서 읽어 들일수 있다 :


class MyClass : MonoBehaviour

{

  [FormerlySerializedAs("m_MyVariable")]

  [SerializeField]

  private string m_ABetterName;

}


그리고 FormerlySerializedAs 는 여러번 중복해서 사용가능하다. 만일 이름이 여러 번 변경 된다고 하더라도 변경 히스토리에 따라 FormerlySerializedAs 어트리뷰트를 유지해 준다면 여전히 데이터 손실 없이 사용이 가능하다.


class MyClass : MonoBehaviour

{

  [FormerlySerializedAs("m_MyVariable")]

  [FormerlySerializedAs("m_ABetterName")]

  [SerializeField]

  private string m_EvenBetterName;

}


원문 : https://blogs.unity3d.com/2015/02/03/renaming-serialized-fields/

Posted by kukuta

댓글을 달아 주세요

개발을 하다 보면 딱히 프로세스가 죽는 것은 아닌데 과도하게 cpu를 먹는 다던지(특정 스레드 무한루프), 프로세스가 살아는 있지만 아무런 응답을 하지 않는다던지(데드락)하는 경우가 있다. 이런 경우 실행 중인 프로세스에 직접 붙어 현재 상태를 체크 해 볼수 있다면 문제 해결에 많은 도움이 될수 있다.


이번 포스팅에서는 실행 중인 프로세스에 gdb 디버거를 붙이고 각 스레드의 상태를 확인, 문제가 되는 스레드의 스택을 트레이싱하는 방법에 대해 알아 보도록 하겠다.


스레드 상태 확인하기

$ ps -eLf | grep <process name>


UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD

kukuta   11048     1 11048  0    8 10:52 pts/0    00:00:00 <process name>

kukuta   11048     1 11050  1    8 10:52 pts/0    00:00:27 <process name>

kukuta   11048     1 11051  0    8 10:52 pts/0    00:00:19 <process name>

kukuta   11048     1 11052  0    8 10:52 pts/0    00:00:19 <process name>

kukuta   11048     1 11053  0    8 10:52 pts/0    00:00:00 <process name>

kukuta   11048     1 11054  0    8 10:52 pts/0    00:00:00 <process name>

kukuta   11048     1 11055  0    8 10:52 pts/0    00:00:00 <process name>

kukuta   11048     1 11056  0    8 10:52 pts/0    00:00:00 <process name>


ps의 e 옵션은 전체 프로세스를 출력, L은 스레드 상태, f는 출력할수 잇는 모든 내용을 출력하라는 의미다.
LWP(Light Weight Process) 컬럼은 스레드의 아이디를 나타내는 것이다.

실행 중인 프로세스에 gdb 붙이기(Attaching 'gdb' on running process)


$ gdb - p <pid>


만일 실행 권한이 충분치 않다는 에러 메시지가 나오면 sudo로 실행 한다. 위 외에도 다양한 방법이 있다. 다음 링크를 참고 하도록 하자. 위의 예에서는 pid에 11048이 들어가야 한다.

참고 : http://stackoverflow.com/questions/14370972/how-to-attach-a-process-in-gdb


스레드의 상태 보기

(gdb) info threads

  Id   Target Id         Frame

  8    Thread 0x7f0ec8fcc700 (LWP 11050) "<process name>" 0x00007f0ecdb81dbd in nanosleep () from /lib/x86_64-linux-gnu/libc.so.6

  7    Thread 0x7f0ec3fff700 (LWP 11051) "<process name>" 0x00007f0ecdbb69b3 in epoll_wait () from /lib/x86_64-linux-gnu/libc.so.6

  6    Thread 0x7f0ec37fe700 (LWP 11052) "<process name>" 0x00007f0ecdbb69b3 in epoll_wait () from /lib/x86_64-linux-gnu/libc.so.6

  5    Thread 0x7f0ec2ffd700 (LWP 11053) "<process name>" 0x00007f0ecdbb69b3 in epoll_wait () from /lib/x86_64-linux-gnu/libc.so.6

  4    Thread 0x7f0ec27fc700 (LWP 11054) "<process name>" 0x00007f0ecee09d84 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/x86_64-linux-gnu/libpthread.so.0

  3    Thread 0x7f0ec1ffb700 (LWP 11055) "<process name>" 0x00007f0ecee09d84 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/x86_64-linux-gnu/libpthread.so.0

  2    Thread 0x7f0ec17fa700 (LWP 11056) "<process name>" 0x00007f0ecee09d84 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/x86_64-linux-gnu/libpthread.so.0

* 1    Thread 0x7f0ecf67db00 (LWP 11048) "<process name>" 0x00007f0ecee09d84 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/x86_64-linux-gnu/libpthread.so.0


모든 스레드들의 호출 스택 보기
(gdb) thread apply all bt


디버거가 붙어 있는 스레드 변경하기

(gdb) thread <tid>


스레드의 호출 스택 보기

(gdb) bt





[도구의발견] - gdb - breakpoint

[도구의발견] - GDB Tutorial


Posted by kukuta
TAG gdb

댓글을 달아 주세요

1. limits.conf 파일 수정

$ sudo vi /etc/security/limits.conf


/etc/security/limits.conf 파일에 아래 두 줄을 추가

kukuta soft core unlimited

kukuta hard core unlimited


위에서 kukuta는 계정명. 각자가 사용하는 계정을 적어 주면 된다.


위와 같이하면 프로세스가 예기치 않게 죽을시 코어 덤프를 남기고 죽게 된다.


코어 덤프 pattern 수정

/etc/sysctl.conf 파일에 아래 내용을 등록해 준다.

kernel.core_pattern = core.%e.%p.%t


처음은 단순 core라고만 적혀 있다. 아래를 참고하여 각자가 원하는 형태로 바꾸도록 한다.


%p: pid

%: '%' is dropped

%%: output one '%'

%u: uid

%g: gid

%s: signal number

%t: UNIX time of dump

%h: hostname

%e: executable filename

%: both are dropped


파일을 저장하고 변경 사항을 로드하기 위해 아래와 같이 입력한다.

# sysctl -p



테스트

$> kill -s SIGSEGV $$

Posted by kukuta

댓글을 달아 주세요

스프라이트 객체를 AssetBundle로 만들고 난뒤 AssetBundle을 통해 스프라이트 객체로 로드를 했는데 로드를 하지 못하고 null을 리턴하는 현상이 발생했습니다. Unity 4.3 버젼에서는 스프라이트는 어셋번들로 만들면서 데이터가 떨어져 나가고 텍스쳐로 로드해서 스프라이트로 변환 해야 한다고하는 군요.


그래서 텍스쳐를 스프라이트로 변경하는 방법에 대해서 살짝 짚고 넘어가보도록 하겠습니다.


Rect rect = new Rect(0, 0, texture.width, texture.height);

sprite.GetComponent<SpriteRenderer>().sprite = Sprite.Create(texture, rect, new Vector2(0.5f, 0.5f)); 


참 쉽죠?ㅋ


추가 : Sprite Packer를 이용해 패킹한 sprite는 asset bundle을 통해서도 정상적으로 로드 되었다.

Posted by kukuta

댓글을 달아 주세요

1. Apache 설치

$ sudo apt-get install apache2

 

설치가 완료 되고 나면 각 계정 별로 pubilc_html 디렉토리를 사용 할 수 있도록 셋팅 한다.

/etc/apach2/httpd.conf(or /etc/apache2/apache2.conf)

Include /etc/apache2/mods-available/userdir.load

Include /etc/apache2/mods-available/userdir.conf


UserDir public_html


<Directory /home/-/public_html>

        AllowOverride All

        Options ExecCGI

        <Limit GET POST OPTIONS>

                Order allow,deny

                Allow from all

        </Limit>

        <LimitExcept GET POST OPTIONS>

                Order allow,deny

                Allow from all

        </LimitExcept>

</Directory>


ServerName localhost 

 

설정이 끝나고 난 뒤 apache를 재시작 한다. 이제 각 계정별로 public_html 디렉토리 만들게 되면 웹에서 해당 디렉토리 아래에 있는 파일들에 접근 가능 하다. 예를들어 호스트 이름이 some.host.com, 계정이름이 dev 인경우 http://some.host.com/~dev 와 같은 형식으로 각 계정별 접근이 가능하다.

 

2. php 설치

위 1번 과정을 끝내고 .php파일을 웹브라우저를 통해 보려고 하면 php파일의 내용을 보여주는 것이 아니라 파일을 다운로드 하려고 한다. php가 아직 설치가 안되서 그렇다. 아래처럼 php를 설치해주자.

$ sudo apt-get install php5

 

3. mysql 설치

$ sudo apt-get install php5-mysql

ref : http://egloos.zum.com/linguistics/v/1996546

'도구의발견' 카테고리의 다른 글

Ubuntu core dump 셋팅  (0) 2017.03.30
[Unity] Texture2D를 Sprite로 변경  (0) 2017.02.28
Ubuntu Apache(14.04) 설치  (0) 2015.04.29
MySQL 백업 스크립트  (1) 2015.03.06
MySQL master-slave 리플리케이션  (0) 2015.03.06
MySQL Event 등록  (2) 2014.09.24
Posted by kukuta
TAG apache, php, ubuntu

댓글을 달아 주세요

아래 쉘 스크립트를 crontab등에 등록 해두고 매일매일 실행 시키면 4일 까지의 덤프 데이터가 남는다.

 

#!/bin/sh

BACKUP_DIR=/home/SOMEWHERE/db_backup
TODAY=`date +%Y%m%d`
RETENTION_PERIOD=4  # 백업 덤프 파일 보관 기간 4일

 

DAY_BEFORE_RETENTION_PERIOD=`date --date "${RETENTION_PERIOD} day ago" +%Y%m%d`

#echo "DAY_BEFORE_RETENTION_PERIOD:"${DAY_BEFORE_RETENTION_PERIOD}

 

#유저가 작성한 DB 목록 추출

mysql -u root -h 127.0.0.1 -P 3306 --password='PASSWORD' --skip-column-names -e "select schema_name from information_schema.schemata where schema_name not in ('information_schema','mysql','performance_schema')" > ${BACKUP_DIR}/backup_schema_list.${TODAY}

 

for db_schema in `cat ${BACKUP_DIR}/backup_schema_list.$TODAY | awk '{print $1}'`
do
        backup_schema_list=${backup_schema_list}" "${db_schema}
done

 

# 백업 파일 덤프
mysqldump -u root --password='PASSWORD' --master-data=2 --routines --events --single-transaction --databases ${backup_schema_list} > ${BACKUP_DIR}/tk_db_backup.${TODAY}.sql

rm -f ${BACKUP_DIR}/tk_db_backup.${DAY_BEFORE_RETENTION_PERIOD}.sql

 

'도구의발견' 카테고리의 다른 글

[Unity] Texture2D를 Sprite로 변경  (0) 2017.02.28
Ubuntu Apache(14.04) 설치  (0) 2015.04.29
MySQL 백업 스크립트  (1) 2015.03.06
MySQL master-slave 리플리케이션  (0) 2015.03.06
MySQL Event 등록  (2) 2014.09.24
svn externals 설정  (0) 2014.07.18
Posted by kukuta
TAG MySQL

댓글을 달아 주세요

  1. 싸리끼 2016.09.26 10:30  댓글주소  수정/삭제  댓글쓰기

    유용한 글 너무 감사드립니다.~