페이지

2017년 1월 29일 일요일

실력이란


의룡 20권 아사다의 대사

2017년 1월 28일 토요일

역사속의 소프트웨어 오류


하늘에 떠 있던 위성과 비행기가 떨어지고
발전기와 전화국이 멈추며,
병원의 기기가 폭주한다.

그로인해 사람이 죽어 나가고 
수백억 손실이 발생하며
많은 사람들이 불편을 겪는다.

원인을 찾아보니 소프트웨어 오류였다.

무엇이 문제 였었는지 책 한 권을 다 읽은 후, 생각나는대로 한 번 기록해 본다.

--------------------------------------------------------------------------------------------------------------------------------------
- 나는, 혹은 우리는 절대 문제가 없을거라는 안일한 생각. 혹은 최대한 책임을 회피하려는 자세.

- 기존의 다른 환경에서 잘 동작 되었던 모듈이 새 환경에서도 잘 구동 되리라는 믿음.
  즉 테스트 미흡.

- 소숫점 연산 정밀도 문제. 작은 숫자라도 연산량이 크게 쌓이면,
  연산에 오차가 생겼을 경우 재앙이 발생한다.

- 데이터 송수신 간의 데이터 단위 표준 불일치에 의해 사람의 실수로 발생할 수 있는 코딩 오류.

- 0으로 나누기. 나눗셈 연산은 웬간하면 곱셈 연산으로 처리 하거나 연산 전에 제수의 0 검사 실행.

- 임베디드 환경에서 다수의 테스크 간에 발생할 수 있는 데드락.
  가급적 단일 쓰레드/프로세스로 문제를 해결해자.

- 유지보수가 불가능할 정도의 복잡한 코드. 순환 복잡도라는 개념을 참조해 보기.
  http://story.wisedog.net/sw-metric-cyclomatic-complexity-%EB%B3%B5%EC%9E%A1%EC%84%B1-%EC%A7%80%ED%91%9C/
--------------------------------------------------------------------------------------------------------------------------------------

2017년 1월 20일 금요일

Unity3D에서 클래스 이름(string)으로 System.Type 얻기

    // 어셈블리로부터 클래스 이름 문자열을 보내 System.Type을 얻는다.
    public static Type GetTypeFromAssemblies( string TypeName )
    {
        // null 반환 없이 Type이 얻어진다면 얻어진 그대로 반환.
        var type = Type.GetType( TypeName );
        if( type != null )
            return type;

        // 프로젝트에 분명히 포함된 클래스임에도 불구하고 Type이 찾아지지 않는다면,
        // 실행중인 어셈블리를 모두 탐색 하면서 그 안에 찾고자 하는 Type이 있는지 검사.
        var currentAssembly = System.Reflection.Assembly.GetExecutingAssembly();
        var referencedAssemblies = currentAssembly.GetReferencedAssemblies();
        foreach( var assemblyName in referencedAssemblies )
        {
            var assembly = System.Reflection.Assembly.Load( assemblyName );
            if( assembly != null )
            {
                // 찾았다 요놈!!!
                type = assembly.GetType( TypeName );
                if( type != null )
                    return type;
            }
        }

        // 못 찾았음;;; 클래스 이름이 틀렸던가, 아니면 알 수 없는 문제 때문이겠지...
        return null;
    }

가끔씩 Unity3D 환경에서 툴 개발을 하다보면 컴포넌트 이름으로 컴포넌트를 찾아서
특정 오브젝트에 그 컴포넌트를 붙여준다던가 하는 작업이 필요하다.

보통 System.Type.GetType( string className )을 통해 클래스 타입을 얻을 수 있는데
Unity3D환경에서는 바로 Type이 얻어지질 않아, 어셈블리를 활용해서
Type을 찾아내곤 한다.

예전 프로젝트에서도 애니메이션 툴에서 Key를 박아 넣고,
그 Key와 연동되서 실행 되어야 할 모듈을 클래스 이름과 함수명을
설정해 줄 수 있게 해 주었고,

최근에서 tk2d+Spine환경에서 Spine데이터를 원터치 조작으로
내가 원하는 형태의 프리팹으로 만들어 줄 때,
특정 컴포넌트를 그 프리팹에 붙여주어야 했다.

나중에 또 필요해 질 때 바로 찾을 수 있도록 코드를 정리해 보았다.

2017년 1월 13일 금요일

'깨달음으로 가는 위빠사나 명상'을 읽고


이 책을 읽은 후 기억나는 소절들을 나열해 본다.

- 본래무아. 원래 '나'라는 존재는 없다.
- 본래절대. '나'는 절대적인 근원으로부터 나왔으니 원래 '나'는 하나였고 절대적인 존재이다.
- 그러므로 내가 했다 네가 했다 생각 말고 근원에 서서 모든 것을 통째로 보라.          
- '나'라는 개체의 한정된 시각, 생각, 경험 을 버리고 절대적인 '주시자'의 입장으로 전체를 보라.
- 모든 것은 근원으로부터 출발했고 연기법칙( 스스로 일어나는 자연법 )에 의해 움직인다.
- 그러므로 자기 스스로 움직일 수 있는 것은 하나도 없다. 자유의지란 없다.
- 근원으로의 귀환 과정 동안 겪는 것들은 결국 허상에 불과한 것이다.
- 지식 체득의 수준을 넘어 본래무아/본래절대를 공감/체험했을 때 큰 깨달음을 얻을 수 있으리라.


일단 모든 인간을 자유의지를 가진 존재로 인정했던 내 사고 체계로는 받아 들이기 힘든
부분들이 좀 있었지만 절대적인 '주시자'의 입장에서 전체를 바라보라는 교훈에서
큰 가르침을 받을 수 있어 좋았다.

보통 사는 것에 취해, 세상에 취해, 자신에 취해
세상 돌아가는 바를 한정된 시각에 바라보는게 대부분의 사람들이다.
자연스럽게 샤를 보를레르의 '시', '취하라'가 연상되었다.

시간의 노예가 되지 않기 위해 취할 수 있는 모든 것에 취하라는 것이 시의 내용인데,
이렇게 되면 숲을 보지 못하고, 그 숲의 나무 하나에만 온 정신이 매달려,
중요한 것은 모두 놓친 채 삶을 마감하게 될 것이다.


취하라 / 샤를 보를레르
http://frdaejeon.tumblr.com/post/138470220382/%EC%B7%A8%ED%95%98%EB%9D%BC-%EC%83%A4%EB%A5%BC-%EB%B3%B4%EB%93%A4%EB%A0%88%EB%A5%B4-enivrez-vous-charles-baudelaire


'나'만의 틀에서 벗어나 '신'의 입장에서 세상을 바라볼 때 지혜가 열릴 것은 자명하다.

아쉬운 점은 무엇을 위해 깨달아야 되는지는 의문인 것이다.
어짜피 연기 법칙에 의해 모든 만물이 근원에서 나와 내 자유의지는 없이 자연법에 의해
근원으로 다시 흘러 들어갈 갈 것인데 이 시스템을 받아 들이고 모든 것을 놓아 버린채
그저 흘러 가는대로 사는 것이 과연 옳은 길일까?

한 쪽에서는 우리 모두 신이 될 수 있다고 말하고 있고
한 쪽은 우리 모두가 이미 신이었고 다시 신을 향해 돌아갈 것이다라고 말한다.
우리는 완성되어야 하는가? 아니면 이미 완성 되었으니 그것을 기억해 내야 하는가?

나, 혹은 세상에 취해 있지 말고 '신'의 입장에 서서 세상을 바라보자.


2017년 1월 8일 일요일

최순실, 정유라의 자식 걱정을 전해 듣고,,,

세상이 뒤틀리든 말든 자신의 혈육,
즉 자기 자신의 사리사욕을 위해서는
어떤일이든 서슴치 않을 저 가증스러운 모습들을 보라.


최순실 변호인 "최씨, 딸 정유라 어떻게 될지 계속 걱정" ( 출처 : SBS 뉴스 )



 아이 걱정하며 울먹인 정유라, 의혹엔 딱 잘라, "엄마가 다 했다"                                


역사 속에서 정의를 위해 자기 자신과 같은 혈육을 포기했던
의로운 어미니들을 떠올려 본다. 저들과 얼마나 대비되는가.

삼국지에서 서서의 어머니가 주군을 버리고 자신을 찾은 서서를 질책했던 일화.
일제 시대때, 안중근 의사의 어머니가 사형을 앞둔 아들의 각오를 다지게 했던 일화.
역사속 의로운 어머님들의 정신은 이순신 장군님의 필생즉사, 필사즉생 정신과 연결된다.

이 땅에 사리사욕을 위해 세상을 망치는 악인들이 얼마나 많은가.
이들을 이겨내기 위해 힘 없는 사람들끼리 아무리 희생하고 뭉친다 한들 부족하거늘,
하지만 대부분의 사람들은 자기 자신, 자기 혈육만을 챙기기에 급급하다. 마치 악인들처럼.

악인들이 펼쳐놓은 세상 속에서 생존하기 위해 어쩔 수 없다 하지만
이게 바로 악인들이 민중들을 비웃으며 쳐놓은 함정이다.
웬간해선 빠져 나오기 힘든 함정.

보다 나은 세상을 만들기 위해 사람들의 의식 수준이 보다 높아져야 한다.
이를 위해 당장 내가, 우리가 할 수 있는 일은 무엇인가?

2017년 1월 7일 토요일

깃허브 데스크탑(GitHub Desktop) 체험

그동안 개발하면서 얻게 되는 재활용할만한 코드들은
틈틈히 압축해서 클라우드 서비스에 올려 놓곤 했다.

그러다 문득, 필요할 때 쉽게 찾아 쓸 수 있도록
개인 코드들을 보다 체계적으로 관리 하고 싶은 생각이 들었다.

게다가 누군가 내 코드라도 필요한 사람이 있다면 공유하고 싶기도 했다.
그 동안 나도 구글을 통해 도움 받은게 한 둘이 아니니......

그래서 결론은,,,,,
이 결심을 회사 동료에게 알렸더니 그에게 깃허브 데스크탑을 써보라는 권유를 받았다.
그래서 깃허브 데스크탑을 통해 깃허브에 Unity3D, Python코드들을 한 번 올려봤다.

1. 저장소 만들기
데스크탑의 좌측 상단의 +마크를 클릭하고 저장소 이름과 로컬PC 경로를 넣어준다.

2. 저장소에 파일 추가하기


저장소를 만들 때 정했던 PC의 로컬 경로에 새 폴더가 생성 되었다.
이 안에 업로드 할 것들을 넣고 데스크탑을 살펴본다.
백그라운드로 파일 비교 작업이 진행되는듯 하다.
수 초후, 데스크탑 화면 중앙에 추가된 파일 목록들이 뜬다.

바로 Commit to master를 실행하기 전에 해야 할 일이 있다.

3. 무시 목록 추가.

위 메뉴는 변경된 파일을 마우스 오른쪽 버튼으로 선택 했을 때 뜨는 팝업 메뉴다.
unity3d 프로젝트 같은 경우, Library나 obj폴더는 관리 되지 않도록 설정이 필요하다.
위와 같이 폴더 째로 무시 하는 메뉴는 보이지 않았다.


결국 저장소를 만들때 폴더와 함께 같이 생기는 .gitignore파일을 열어서
무시할 폴더명을 직접 넣어줘야 했다.

.gitignore파일을 수정 후, 다시 데스크탑으로 돌아가면,
내가 무시하고 싶었던 폴더가 변경 파일 목록에서 빠져 있는 것을 확인 할 수 있다.
이제 안심하고 Commit to master를 실행한다.

4. Push를 위한 Publish / Sync버튼


이제 깃허브에 저장소를 업로드 해 보기 위해 Push메뉴를 찾다가,
데스크탑 우측 상단의 Publish / Sync버튼을 발견했다.
처음 올릴때는 버튼에 Publish라고 표기되고, 
그 이후부터 Sync라고 표시되는듯 하다.

버튼을 누른 후, 작업이 완료 되었다는 안내를 받고 깃허브 사이트로 들어가 보았다.


내가 만든 저장소들이 당당하게 포지셔닝 하고 있는 모습을 확인할 수 있었다.

5. Read Me!!!
깃허브 데스크탑을 알려준 회사 동료가 힘주어 강조하던 것이 있었다.
ReadMe파일을 저장소 안에 꼭 넣어 주라는 것이었다.
그 이유는......

깃허브 사이트에서 내가 만든 저장소를 클릭해 들어가 보니,
위와 같이 ReadMe내용이 아래에 펼쳐져서 저장소를 설명해 주고 있었다.

ReadMe를 예쁘게 꾸밀 수 있게 도와주는 리드미 문법(?) 및 보조프로그램이 있는듯 하다.
그건 나중에 따로 한 번 도전해 봐야 겠다.

6. Clone을 통해 업로드한 소스 가져오기

올리기만 하면 뭐하나. 필요할 때 가져와서 써야지.
소스를 올리는건 회사에서 했었고 이제 집의 PC에 올렸던 소스를 다시 가져와 본다.

저장소를 만들때 열었던 +메뉴를 누른 후 Clone명령을 실행한다.
그러면 로컬PC의 폴더 경로를 선택할 수 있게 되는데,
그 폴더에 업로드 했던 소스들을 다운로드 받게 된다.

글을 마치며...
훗날 재활용 예감이 드는 개인 코드들을 여기저기 쟁여 놨었는데
틈틈히 시간 날 때 마다 정리해서 깃허브에 올려 놓을 생각이다.
그 동안 했던 일들을 돌이켜 보면서 좀 더 자신의 코드에
애착 및 책임감이 느껴지는듯 하다.

어느 정도 깃허브에 소스 정리가 끝나면 올려놨던 것들을 블로그에 소개해 보고자 한다.

2017년 1월 1일 일요일

마크 패시오(Mark Passio)의 자연 법칙( Natural Law )

< 1부 동영상 >

2부https://www.youtube.com/watch?v=bFCXAONxgtE&t=9925s
3부https://www.youtube.com/watch?v=MTJB43-RBHA

동영상 하나당 2~3시간에 육박하는 긴 내용이지만,
나 같이 진리 탐구를 입문하는 사람들에게 가이드가 될만한 내용이 많아서 좋았다.
시청하고 익힌 내용들 몇 가지를 간추려 기록해 본다.


- 모든 것의 시작은 생각이라는 행위에 의해 출발한다.
  우주도 신의 생각에 의해 탄생했다. 빛이 있으라.

- 세상에 변화를 주고 싶다면 원하는 변화를 상상하고 생각하라.
  그리고 그를 위해 필요한 지식을 모으고, 그 지식을 이해하려고 힘쓴 후,
  이해가 끝났다면 그 이해에 기반하여 행동하라.
  행동하지 않으면 그대가 원하는 것은 물론 세상의 어떤 변화도 가져올 수 없다.
  단지 간절히 바라는 것만으로는 아무런 결과도 얻을 수 없을 것이다.

- 시간을 들여서 관심을 가지라.
  이를 통해 지식을 얻고, 그 지식에 기반한 지혜를 개발한 후 행동하라.
  이것을 통해 그대가 얻고자 하는 것을 얻고 세상을 변화 시킬 수 있는 힘을 얻게 된다.
  이 힘을 기반으로 행동 했을 때 세상은 변하기 시작한다. 그대가 생각한 방향으로.

- 대부분의 사람들은 논리(좌뇌)에 치우치거나, 감성(우뇌)에 치우쳐 행동한다.
  이렇게 해서는 누군가를 지배 하거나 누군가에 지배 당하는 사람이 된다.
  우리는 누군가를 지배할 권리도 없고, 누군가에게 지배를 당해서도 안된다.
  논리와 감성의 균형을 이루어야 자유를 이루고 질서를 얻을 수 있는 힘을 얻을 수 있다.

- 사랑하라. 그를 통해 지식을 얻고 자신의 주권을 찾아라.
  그러면 자유를 얻을 것이니 이로 말미암아 질서를 찾게 될 것이다.

- 진실을 알게 되는 것이 두려운가. 그렇게 되면 무지로 인한 혼란(CONFUSION)에
  빠지게 된다. 그리되면 결국 누군가의 통제를 받게 되며 이로 인해 세상은
  혼돈(CHAOS)으로 뒤덥힐 것이다.

- 단지 자신만의 생존을 위해, 자신만의 이익을 취하기 위해 사는 삶은
  결국 모든 인류의 의식 수준을 낮추어서 지구를 지옥으로 만들게 될 것이다.
  깨달아라. 그리고 깨달은 것을 세상에 전파하기 위해 노력하라.
  세상을 보다 나은 방향으로 나아가게 하기 위해.

Unity3D 던전 생성 툴


취미 프로젝트로 3D 환경의 던전 탐험 모바일 게임 개발을 준비해 보려고 하던 중,
유니티 애셋 스토어에서  던전 생성 도우미 툴을 검색해 보니,
아니나 다를까 시중에 나와 있는게 꽤 있었다.

그리스 신화에 나오는 던전 건축가 장인 다이달로스의 이름을 딴 툴이
꽤나 그럴듯해 보인다.

직접 구현할려고 했다면 꽤나 시간 들이고 노력 들이고 해야 했을 것이다.
좀 더 시간을 들여 살펴보고 적당한거 구매해서 사용해 봐야 겠다.

다이달로스( Daedalus ), 가격 : 70$
https://www.assetstore.unity3d.com/en/#!/content/14492
http://daedalus.artskillz.net/

Dungeonizer, 가격 : 10$
https://www.assetstore.unity3d.com/en/#!/content/22162

Dungeon Level Generator, 10$, 가격 : 10$
https://www.assetstore.unity3d.com/en/#!/content/2944