추천 단어 사이트

언어 2014. 2. 6. 23:48

특히 번역이나 영단어 찾기 등에 도움이 많이 되어 근래 많이 사용했는데 블로그엔 올리지 않았다는 것이 생각났다.



http://www.wordreference.com/



보통 검색할 때에는 찾고 싶은 단어 + wordreference 라고 한다.


ex : 링크



Posted by OOJJRS
,

회사 스터디 시간에 이 화두를 던졌다가 시간이 꽤 흐르게 되었는데


관련 내용으로 역시 글타래가 있어 스터디가 생각나서 링크를 걸어본다.


http://stackoverflow.com/questions/8960918/how-encapsulation-is-different-from-abstraction-as-a-object-oriented-concept-in



캡슐화와 추상화에 대해 명확한 정의를 알고 있지 않으면 누군가 명확하게 정의를 내려주어도 위와 같은 논쟁이 일어나곤 한다.

(논쟁 수준으로 비화할 만큼 활성화된 글타래는 아니고 쟁점을 제시한 사람도 많진 않지만)



그냥 생각나서 적어봄

Posted by OOJJRS
,


Nemo.exe



뭐랄까, 진짜 허접한 네모네모 로직의 완전 기본 기능만 있는 게임인데


2010년도 막 입사한 해에 메인 프로젝트의 빌드 시간이 너무 오래 걸려서 시간 때우기 위해 만들었다는 것이 함정.

(왜 윈도우 게임에는 여러 가지가 있지만 네모네모 로직이 없는 거냐, 를 외치면서)


그 뒤로 여러 가지가 개선되고 게임 따위 할 시간이 없게 되면서 잊혀졌지만 다시 발굴해내어


코드 최신화도 하고 소스 태깅도 하고 하면서 추억팔이 삼아 올려본다. 아마 앞으로도 버전업은 없겠지만.


소스 태깅을 하다보니 지금 나의 소스 폴더 구조가 그다지 편하지 않다는 것을 깨닫게 되어 변혁이 예고되어 있다는 것을 기념하기 위해서라도 올리는 중.

Posted by OOJJRS
,
-_- 이래저래 정리도 하고 스샷도 올리고 MS에서 배포한 패치 링크도 걸고 테스트 결과도 올려야 하지만

귀찮으므로 다 건너뛰고 결론만 올림.

XP 서팩2 이하에서는 한 번에 할당 가능한 메모리가 280메가 상한이 잡혀 있어서 그 이상 메모리 할당을 시도할 경우


관련 함수들이 실패하면서 예외가 발생함.


꽤나 실무에서 많은 사람을 당황시켰던 문제.

(데이터 파일이 280메가를 넘어가면서 XP 업데이트를 하지 않고 사용하던 사람들에게서 나타난)


불친절한 내용 정리는 이것으로 끝



Posted by OOJJRS
,

Structs in C#

개발 2014. 1. 29. 23:15

http://www.codeproject.com/Articles/8612/Structs-in-C


C#에서의 구조체에 대해 잘 정리해둔 페이지

Posted by OOJJRS
,

Process.MainWindowHandle 은 활성화된 윈도우의 핸들 중 최상위를 리턴하므로


대상이 최소화 또는 hidden 상태라면 (tray-icon 활용 등의 이유로) 프로세스 정보로는 윈도우 핸들을 얻을 수 없다.


따라서 FindWindow 를 이용해야 함... 뭐 이자식아?^^;


더러운...

Posted by OOJJRS
,

 "헤~이! 누구 나와 함께 게임 엔진 만들어볼 사람 없냐!"


  겨울 오후 해가 많이 기운 시간, 기온은 많이 낮지만 바람은 불지 않아 목 뒤가 차가운 정도로 타협이 가능한 날씨에 행인도 없는 거리를 가득 메우는 소리가 발생했다.

  창문으로, 충분히 젊은 백인 청년이 홀로 거리 곳곳의 집을 향해 소리를 지르는 모습이 목격되었다. 잔뜩 흥분하고 즐거워보이는 모습. 스스로도 저런 때가 있었던가 과거를 되짚어본다.

  두 번째 외침, 세 번째 외침은 첫 번째와 비슷한 내용이었지만 점점 가까워졌다. 마침내 네 번째 외침에 이르러서는,


 "없냐아! 이 즐거움을 함께할 얼빠진 놈들 말이야아! 정말 끝내준다구우!"


  바로 창문 아래에서 들려왔다. 방금 전까지 고민하게 만들던 모니터를 달칵 끄고, 창문을 드르륵 열어젖힌다.


 "요, 젊은 친구."


  겨울의 신선하고도 차가운 공기와 청년의 시선이 넘실 흘러들었다.


 "나와 함께 해볼까? 나도 지금 만들고 있는게 있는데. 참여해보겠어?"


  역광 때문인지, 청년이 잠시 어리둥절한 표정으로 올려다보다가, 진짜 대답이 나올 줄은 몰랐다는 듯이,


 "당신도 이런 것에 관심 있는 개발자나 지망생 같은 거요, 가이?"

 "물론. 난 현업 개발자라네, 청년."

 "와우, 끝내주는데! 거기 나도 참여해도 되는 거요?"

 "나 혼자 하고 있는 프로젝트니 내 맘대로지. 자넨 충분해 보이는군."


  청년의 기쁜 표정과 흥분한 말투, 힘찬 단어들이 2층으로 뛰어오르고 그에 대한 대답들이 툭툭 던져졌다. 청년은 그 대답들을 날름날름 집어먹으면서 점점 힘을 얻더니,


 "좋아요! 아주 좋아! 자, 그럼 이제 내가 뭘하면 되지요? 아, 난 스티브라고 합니다."

 "반갑군, 스티브. 나는 셸리라고 하네. 하나 묻겠는데, 자네가 할 줄 아는 언어는 뭐지? 혹은 공부했던 분야나. 얼마나 했나?"

 "정보검색을 방금 한 시간 했죠."


  다음 대답에 간극은 없었지만 막이 넘어간 것 같은 효과가 있었다.


 "좋아, 충분하군. 오늘은 이미 늦었으니 내일 점심 시간에 여기로 오게. 밥이나 한 번 먹지."


  2층에서 표창처럼 날린 명함을 청년이 아름답게 받아챈다. 명함에 찍힌 회사는 게임의 명가 컨스트럭터. 청년의 얼굴에 놀라움이 번지면서 해가 졌다.




  셔츠와 청바지 차림의 스티브가 쭈뼛거리며 정문을 서성일 때 우연히 구제하게 되었다. 11시. 바람은 불지 않지만 꽤나 추울텐데도 아랑곳않고 쭈뼛거리며 사방을 돌아다녔다.


 "헤이, 스티브. 일찍 왔군."

 "오, 셸리. 좋은 아침입니다."

 "왜 이렇게 일찍 왔나?"

 "일찍이라뇨. 점심 시간에 오라고 했잖아요? 11시 아닌가요?"


  그는 개발자의 자질을 일단 갖추고 있는 것 같다. 안 좋은 쪽으로 몇 개.


 "그래, 내가 미처 몰랐군. 좋은 아침이지만 올라가서 점심 식사를 하도록 하지. 구내 식당이지만 근처에서는 꽤 호평인 곳이라네."


  스티브는 그저 싱글벙글하며 걷고 있다. 회사 내부의 풍경도 자못 신기한 듯.

  중간 과정은 생략되고, 밥과 함께 시작된 대화.


 "셸리는 이 회사에서 뭘 하고 있나요?"

 "일반적인 개발이지. 자네는 앞으로 개발자가 되려고 하나?"

 "물론이죠. 이번에 만들 엔진으로 세계 최고가 될 예정입니다."

 "멋지군."




 "이쪽에서 사고가 났다고 가정해보게. 아마도 도로는 몇 시간 동안 심하게 마비되고, 앞쪽 터널은 꽉 막히게 될 거야. 상상되나?"

 "물론이죠."

 "자네 생각이 지금처럼 막혀버린 경우, 이 사고에 빗대어 처리할 수 있지. 당장 떠오르는 건 두 가지군. 뒤쪽으로 와서 사고 지점을 바라본다. 앞쪽 터널을 헤치고 나아가본다."

 "뒤로 와서 사고 지점을 보는 건 충분히 검토하겠다는 뜻인 것 같아서 잘 이해가 되는데, 앞으로 나아가는 건 뭐죠?"

 "상상해보게, 스티브. 앞쪽 터널을 꽉 막고 있는 구경꾼과 기자진이 있지만, 이쪽에서는 사고로 인해 차가 나아가지 못하기 때문에 그 사람들만 뚫으면 그 뒤는 텅 비어있지 않겠나?"

 "그렇다면요?"

 "사고 지점을 무시하고 억지로 진행해도 깨달음을 얻을 수 있다는 것이지. 고정관념에서 벗어난."


  스티브가 아리송한 표정으로 터널 지점을 바라본다.




낮잠에서 깨자마자 세 번 가량 반복 음미하고 스토리를 갈무리한 다음 글로 옮겨 적었으나 1/3 시점에서 더 이상의 내용이 기억나지 않는다. 가장 잘 기억이 나는 중요 대목이라고 된 부분만 글로 옮겨 적으며 꿈에서의 말도 안 되는 내용들을 현실로 순화하여 옮겨 적음.


재미있는 점은 배경 무대가 미국이라는 것과 영어로 꿈의 대화 부분이 시작되었다는 것.


뭔 꿈을 꾸다가 이렇게 된 거지

Posted by OOJJRS
,

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html



옛날 언어들이라고 치부하던 것들도 아직 당당히 현역인 것을 보면 그저 놀랍다.


생각보다 세상은 크게 변하지 않았다고도 할 수 있는 자료들.




Jan 2014Jan 2013ChangeProgramming LanguageRatingsChange
11C17.871%+0.02%
22Java16.499%-0.92%
33Objective-C11.098%+0.82%
44C++7.548%-1.59%
55C#5.855%-0.34%
66PHP4.627%-0.92%
77(Visual) Basic2.989%-1.76%
88Python2.400%-1.77%
910JavaScript1.569%-0.41%
1022Transact-SQL1.559%+0.98%
1112Visual Basic .NET1.558%+0.52%
1211Ruby1.082%-0.69%
139Perl0.917%-1.35%
1414Pascal0.780%-0.15%
1517MATLAB0.776%+0.14%
1645F#0.720%+0.53%
1721PL/SQL0.634%+0.05%
1835D0.627%+0.33%
1913Lisp0.604%-0.35%
2015Delphi/Object Pascal0.595%-0.32%


PositionProgramming LanguageRatings
21Logo0.592
22SAS0.585
23PostScript0.520
24Assembly0.495
25PL/I0.488
26ABAP0.474
27COBOL0.461
28Fortran0.412
29Lua0.375
30Ladder Logic0.369
31C shell0.355
32Tcl0.351
33Scala0.337
34RPG (OS/400)0.337
35Max/MSP0.331
36Go0.326
37OpenEdge ABL0.310
38ActionScript0.308
39ML0.292
40Ada0.280
41Common Lisp0.275
42cT0.268
43Haskell0.265
44R0.252
45JScript.NET0.246
46Emacs Lisp0.242
47Prolog0.220
48Modula-30.215
49Scheme0.213
50S-PLUS0.212


Programming Language201420092004199919941989
C122111
Java21116--
Objective-C34248---
C++433224
C#58932--
PHP656---
(Visual) Basic745337
Python86112222-
JavaScript99821--
Perl107451723
Lisp1418151072
Ada2321161763




Programming Language Hall of Fame

The hall of fame listing all "Programming Language of the Year" award winners is shown below. The award is given to the programming language that has the highest rise in ratings in a year. 

YearWinner
2013Transact-SQL
2012Objective-C
2011Objective-C
2010Python
2009Go
2008C
2007Python
2006Ruby
2005Java
2004PHP
2003C++


Posted by OOJJRS
,

C# 의 LinkLabel 을 쓰다가, 링크를 여는데 계속 익스플로러로 열리더랬다.


뭐지? 난 크롬이 디폴트인데? 설마 ms가 이 컨트롤 그냥 쓰면 IE로 열게 박아놨나 라면서 구시렁대는데,


알고보니 부끄럽게도 디폴트가 IE였다.


그래서 이게 어찌된 일인가? 하고 다시 막 뒤졌다. 난 분명 크롬이 디폴트였는데 뭐야? 하면서.


기본 브라우저가 갑자기 바뀌었다고 의심할 수 있는 상황이 몇 가지 나왔다. 다른 건 다 건너뛰고, 크롬박스가 아무리 버튼을 눌러도 기본 브라우저로 바뀌지 않고 IE는 해제되어 있고 난리라, 다른 방법(레지스트리 수정 같은)을 찾았더랬다.


그런데 인스톨 버전이 아니라서 등록이 안 되는 건가 의심할 즈음, 크롬박스 폴더 내부에 Set Default Browser.exe 가 있더랬다. 오호? 근데 실행해도 설정이 안 돼!!


다시 크르렁 거리며 뭐지? 하는 순간 UAC가 떠올라 관리자 모드로 하니 됐다.



결론 : 회사 컴이라서 삽질함. 배고프다.

Posted by OOJJRS
,
절대 까먹을 일이 없을 거라고 생각했으나

까먹고 나서 식겁해서 남겨둠


검색해도 찾는 게 쉬운 게 아니었어... ㅎㄷㄷ



Posted by OOJJRS
,

vs2012 vs vs2013

개발 2013. 12. 15. 15:19

vs가 세 개나 필요하다니!


2012보다 2013이 그럭저럭 더 마음에 든다.


정작 내가 주력으로 쓰는 언어들에서는 바뀐 게 거의 없지만서도.


뭐가 차이일까?

Posted by OOJJRS
,

http://www.dovelet.com


특별함이 있어서라기보다 기록 보관용

Posted by OOJJRS
,

통계청

아직 분류 없음 2013. 11. 24. 22:16

http://hikostat.kr/



즐겨찾기 쉽게 등록되는 블로그 같은 건 없나

Posted by OOJJRS
,

http://pixlr.com/editor/


http://www.colourlovers.com/palettes

Posted by OOJJRS
,

컴퓨터로 뭐 하는 것도 없는데 이런 유니크한 사태들을 직면할 때마다 귀찮아 죽을 것 같다.



아마도 밑의 깜빡임 / dx 버퍼 문제 해결을 위해 nvidia의 최신 그래픽 드라이버를 설치한 이후라고 추측되는데


난데없이 부팅 후 네트워크 어댑터가 바로 인터넷에 연결이 안 되는 희귀한 문제가 발생했다.


잘 모르고 있다가 어제서야 발견했는데, 귀찮아서 컴퓨터를 부술까 하다가 마음을 다잡고 검색질.


다행히 network adapter must 까지만 쳐넣자 자동완성으로 적당한 키워드가 바로 튀어나와주는 걸 보니


나만 삽질하는 유니크한 문제는 아닌 듯. 기뻤다(뭐?)


해결 방안으로 2가지가 검색되었는데, 둘 다 해보니 다 되었다.

(여기는 전문 http://answers.microsoft.com/en-us/windows/forum/windows_vista-networking/why-do-i-have-to-reset-my-network-adapter-local/5b7b073d-a57b-4c73-b025-3a33adb5d6f8 )



1. 장치 관리자 - 네트워크 어댑터 - 장치의 전원 관리 - check box들을 모두 끔

(체크 박스 내용은 뭐, 이해하기 쉬운 내용이므로 그냥 읽어보면 되겠다)


2. ms에서 직접 달아준 답변으로 다음과 같은 명령어를 수행하면 된다. 뭐, 뻔하지만 그냥 설치 리셋이다.


netsh winsock reset catalog

netsh int ipv4 reset reset.log

netsh int ipv6 reset reset.log



1번의 방법보다는 2번이 더 보편적이므로 2번으로 해결하였다.


조만간 귀찮아 죽을지도 모르겠다.

Posted by OOJJRS
,

삽질도 가지가지 한다. 부끄러워 죽을 것 같은 실수를 많이 하면 실력도 늘어날 날이 올까 생각해보자.



윈도우 7의 깜빡임 현상이나 요 일주일간 겪고 있던 2d 렌더링 시 viewport 설정에서 백버퍼가 줄어들어버리는 현상 등이


모두 그래픽 카드 드라이버 미설치에 의한 것이었다.


윈도우 7이 드라이버를 설치하지 않더라도 워낙 디폴트로 잘 나오다보니 간혹 잊을 때가 있는데,


이번에 윈도우를 밀고 나서 잊어버린 듯 하다.


깜빡임 현상이 완전히 해결되었다고 보긴 어렵지만 (아직도 아주 간혹 깜빡이기는 한다) 성능상 이슈도 있다고


ms에서 분명 밝힌 바도 있으므로 이 정도면 없다고 봐도 좋고, 그래픽 카드 드라이버 미설치에 의한 것이라고 보는 게 맞을 것 같다.

(크게 완화되어 이젠 의도적으로 발생시키지 않는 이상 보기 어렵다)



dx 라이브러리 의심도 하곤 했는데, 결국 그래픽 카드 드라이버 문제였다니, 조금 뒤통수이기도 하다.


쪽팔린다. 잠수 타야할 필요성이 제고된다.


잊지 않기 위해 블로깅

Posted by OOJJRS
,

소스에 주석을 달아두었지만 이제 필요 없어져서 삭제하려는데 svn에 기록은 있으나 찾기 어려우므로 여기에 따로 올려둔다.


아래 내용 중 뭐가 틀렸는가 하면, visual studio 2010 sp1 버전 기준으로 iPaddedBorderWidth 멤버는 OS 버전이 0x0502 이하일 때 없는 게 아니라 0x0600 이상일 때 존재한다.

0x0502 와 0x0600 사이에는 sp 버전들이 존재하므로 두 설명이 완전 일치하지는 않는다.

(하지만 결국 코드는 지침대로 만들었다는 게 함정)



bool CRenderer::CreateNullFont()

{

    /*

        근데 문제는 아래 설명마저 틀렸어...

        If the iPaddedBorderWidth member of the NONCLIENTMETRICS structure is present,

        this structure is 4 bytes larger than for an application that is compiled with _WIN32_WINNT less than or equal to 0x0502.

        For more information about conditional compilation, see Using the Windows Headers.

    */


    OSVERSIONINFOW v = {sizeof(OSVERSIONINFOW)};

    if(GetVersionExW(&v) == FALSE)

    {

        this->WriteError(wstr(L"CreateNullFont::GetVersionEx() : %s",

            GetApiErrorString().c_str()));

        return false;

    }


    NONCLIENTMETRICSW s = {sizeof(NONCLIENTMETRICSW)};

    if(v.dwMajorVersion <= 5 && v.dwMinorVersion <= 2)

        s.cbSize -= sizeof(int);


    if(SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(s), &s, 0) == 0)

    {

        this->WriteError(

            wstr(L"CreateNullFont::SystemParametersInfo(SPI_GETNONCLIENTMETRICS) : %s",

            GetApiErrorString().c_str()));

        return false;

    }


    auto* font = this->_OnCreateFont(s.lfMessageFont, L"NullFont");

    if (!font)

        return false;


    m_rm->SetNullObject(*font);

    return true;

}



Posted by OOJJRS
,

근래에 Notepad++가 다음과 같은 현상을 자주 보였다.




검색도 시원찮고 이슈 트래킹도 시원찮아서 내 기분도 시원찮게 며칠이 갔다.


딱 봐도 인코딩 문제구나! 하고 인코딩을 이리저리 바꾸어보았으나 처참히 털렸다.


이전에는 잘 써왔으므로 버전이 문제라든지 64비트 컴퓨터가 문제라든지 오만 생각이 머릿속에서 맴돌았는데 결국 버전을 내려볼까 하면서 Open Containing Folder 기능이 들어간 버전을 찾기 위해 키워드를 때린 순간 우연히도 다음과 같은 글이 얻어걸렸다.


http://stackoverflow.com/questions/15748936/opening-a-file-containing-unicode-characters-using-notepad-appears-corrupted


6.3.x 인가에서 추가된 것으로 기억해서 그냥 그 버전으로 다운하면 되겠지 라는 막연한 생각으로 삽질을 하던 중이었는데 아니 저렇게 정확하게 내 현상과 일치하는 글을 전혀 다른 키워드로 매칭할 줄이야?

(내 검색 능력이 엉망이라는 게 이런 식으로 들통나길 원치 않았지만)


저곳의 답변에 희망을 걸고(희망 고문?) 다음과 같이 뙇 시도해보았다.




위 메뉴를 누르면 다음과 같이 열리는데, 테마는 관심 없으므로 글꼴만 변경한다.

(※ 처음에 Style : 쪽 리스트 박스 선택이 Global override가 선택되어 있을 수 있는데, Default Style로 바꾸어야 한다)





돋움체로 바꿨더니 뙇!!!!!!!!!!!!!!




야이 망할 npp ㄴㅁ이러ㅏ매38ㅓㅁ2햐ㅓㅁㅈ해멎대럄헞대ㅑ헞ㄱㅎ 언늠이 버전업하면서 글꼴 건드린 거야




아무튼 수정해서 기분은 조금 업되었다.


다만 아직도 풀지 못한 미스테리는, 윈도우 7의 flickering 현상과 엮인 문제인데, npp가 처음에는 잘 보여주다가 몇 번 깜빡임 현상을 겪고 IME가 튀는 문제를 일으키고 나면(아무래도 컴퓨터 성능이 구려서 나는 문제라고 잠정 결론을 짓고 있다만) npp의 한글이 깨졌다는 것이다. (유독 이놈만?)


이런 완전 특수성 넘치는 나님 한정 문제가 발생하는 바람에 해결까지 시간 꽤나 잡아먹은 문제였다.


누군가에겐 도움이 되길 바랍니다.



--------------------------------------------------------------------------------------------------


라고 글을 쓰고 일단 작업을 먼저 해결한 다음 아침에 일어나서 tsvn을 보니 똑같은 현상이 있기에 아차 저놈이 잘못한 게 아니구나 하면서 (내가 요즘 작업을 심하게 안 하긴 했나보다) 즉시 진화에 들어갔다.

그리고 Courier New 폰트가 뭔가 병맛이라는 단서로 검색을 시작하자마자 이런 현상에 대한 글들이 아주 천지에 깔려 있더라 (역시 중요한 건 키워드인가)


그런데 왜 갑자기 Courier New 폰트 패밀리에 대한 정보가 털렸는지는 여전히 미지수다. 그건 또 시간 내서 찾아봐야겠다.


다음은 전역적 해결법


시작 - 실행 - regedit.exe


HKEY_LOCAL_MACHINE / SOFTWARE / Microsoft / Windows NT / CurrentVersion / FontLink / SystemLink / 


에 보면 여러 폰트들의 패밀리가 설정되어 있다.


새로 만들기 -> 다중 문자열 값 -> Courier New 를 만들고 값으로


cour.ttf,Courier New

MSGOTHIC.TTC,MS Gothic

MINGLIU.TTC,MingLiU

SIMSUN.TTC,SimSun


요러코롬 써주면 위에서부터 하나씩 매칭하면서 찾는다. 물론 맨 윗줄만 Courier New 폰트고 나머진 돋움체에서 뜯어왔다.
(Courier New가 고정폭을 가진 폰트이므로 적절히 맞는 패밀리를 선정하는 것이 좋다)


수정하고 나면 리부팅이 필요하다.


하지만 문제라면 cour.ttf가 가장 윗줄에 있으니 npp가 여전히 깨져서(tsvn은 수정되었지만) 아 발로 만들었구나 라고 욕을 한 번 해주고 cour.ttf를 가장 아래로 내리려는데 생각해보니 그럼 별 의미가 없잖아? 라면서 그냥 더 괜찮은 폰트로 바꿔야겠다며...???

Posted by OOJJRS
,

실행파일명을 자꾸 잊어먹어서 블로그에 정리해둔다 -_- 몹쓸 기억력이...



보통 작은 파일이나 짧은 텍스트 문구 등이 포함된 파일은 stdout 을 redirection 하여 만드는 방법을 많이 쓰지만 내용은 상관 없이 특정 용량(특히 큰)의 파일을 만들 때에는 부적합하다.


이 때에는 파이썬 등의 스크립트 언어로 후다닥 할 수도 있겠지만, 다음과 같은 명령어를 사용하면 편리하다.




명령어 사용법과 간단 예제까지 곁들었으므로 자세한 설명은 생략한다.


위에서는 abc.txt 를 64kb 짜리 용량으로 만들어보았다.


XP 이후 버전에서는 모두 지원한다.

Posted by OOJJRS
,

LUA require

개발 2013. 10. 11. 01:41

와우 초창기 시절 애드온 만들어본답시고 깔짝대던 게 사용기의 전부였던 루아가 갑자기 눈앞에 닥쳤다. 일이 닥친 후에 공부해둘걸 하는 후회는 언제나 한발 늦다. ㅅㅂ



문제가 된 코드는 require 함수. 다른 루아 파일을 레퍼런스로 포함해주는 파일로 C의 include 같은 쓰임새를 보이는데 평소라면 문제가 안 되겠지만 내가 닥친 상황에서는 문제가 되었다.


프로젝트에서는 lua_tinker를 사용하였는데 일반적인 파일 입출력으로 다음과 같은 코드를 썼다.


lua_State* state = lua->getLuaState();

lua_tinker::dofile(state, "initialize.lua");


그런데 문제는 저 initialize.lua 라는 파일이 개발 중에는 파일로 있지만 데이터가 패킹된 후에는 파일이 아니라는 것. 저 정도는 다음과 같은 함수로 금방 대체 가능하다.


std::string script = ::getScript("initialize.lua");

lua_tinker::dostring(state, script);


문제는 그 다음이었는데,


lua_tinker::dofile(state, "common.lua");


initialize야 어차피 환경 설정과 경로 설정 등을 제하면 별 일을 하지 않는데 common이란 놈은 앞으로 사용될 녀석들의 바탕이 되는 녀석들이 정의된 파일이기 때문에 그 안에서 require 함수를 호출하고 있었다.


common.lua


require "a"

require "b"

require "c"

...


자, 여기서 require는 루아가 먼저 정의해둔 함수로 내부적으로 알아서 loadfile 등을 이용해 '파일'을 불러오는 동작을 한다. 그런데 우리 파일들은 전부 패킹되어 있잖아? 당연히 경로를 찾을 수 없다는 에러가 와르르 뜨게 되었다.



인고의 몇 시간을 보내고 나서 (별 것 아니라고 생각했는데 의외로 해당 상황에 대한 레퍼런스가 부실했을 뿐 아니라 키워드를 제대로 못 맞춘 건지 버전이 안 맞는 건지 찾은 코드들도 노화되었거나 제대로 동작하지 않는 게 부지기수였다) 다음과 같은 코드를 완성해낼 수 있었다.


int my_require(lua_State* state)

{

const char* name = lua_tostring(state, 1);    // require 다음의 파일을 가져온다

const char* relpaths[] =                      // 상대 경로 조합을 위한

{

"Lua/SubPath/%s.lua",

"Lua/TowPath/%s.lua",

};


for (int i = 0; i < _countof(relpaths); ++i)

{

char bf[256] = {0};

_stprintf(bf, relpaths[i], name);          // 상대 경로를 조합하여 경로 생성


std::string script = ::getScript(bf);

auto err = luaL_loadbuffer(state, script.c_str(), script.size(), bf);

if (err)

lua_error(state);

break;

}


lua_call(state, 0, 1);    // 핵심. 이걸 몰라서 2시간 헤맸다.

return 1;

}


int luaInitialize()

{

...


lua_tinker::def(state, "require", my_require);    // 루아가 만든 함수도 재정의가 가능


lua_tinker::dostring(state, script);

...


return 0;

}


루아가 제공하는 require 함수를 내가 만든 함수로 재정의했으며 직접 파일 내용을 가져와서 버퍼를 셋팅해주게 하였다. 대충 처리한 뒤에는 lua_call 로 마무리를 해주어야 문제가 일어나지 않았다. 최신화된 코드를 못 찾아서 별다른 레퍼런스 없이 어셈블리 코드를 까서 (지금 생각해보면 pdb라도 얻어다 할 걸 하는 생각이 든다) 노가다한 결과물이 되었다.


물론 실제 서비스할 코드는 위와 같이 이상하지 않도록 여러 가지를 더 신경써야 한다. 상대 경로도 하드코딩하는 것이 아니라 루아 전역 변수로부터 가져와야 하고, 기존 require처럼 로딩된 리소스는 다시 로딩하지 않도록 처리해주는 것도 효율을 중시한다면 필요하다.


하지만 난 하지 않겠어...


올리기는 부끄럽지만 한글로 된 관련 내용은 잘 없는 것 같아서 올려본다.


본격 루아를 잘 몰라서 헤맨 오늘의 일기 끝


Posted by OOJJRS
,

ㅇㅇㅇ

개발 2013. 10. 1. 21:49

http://www.ndepend.com/

http://www.jetbrains.com/profiler/

Posted by OOJJRS
,

한계

아직 분류 없음 2013. 9. 29. 22:51

간혹, 또는 자주, 전공자와 비전공자의 대화에서 상하 관계를 상정하고 이야기하는 것을 목격한다. 비전공자가 아니라, 전공자가 그런 태도를 보이는 경우가 많다. 마찬가지의 관점에서, 경험자와 비경험자의 대화에서는 경험자가, 선배와 후배에서는 선배가, 경력과 신입에서는 경력자가 그러하다.

전문가의 의견을 주의깊게 청취하는 것도 중요하지만 그에 못지 않게 청자를 함부로 판단하지 않은 것도 중요하다. 대학 4년 전공은 그리 대단한 기둥은 되지 못하며 상대보다 1, 2년 먼저/많이 경험했거나 몇 차례 해보았다는 것은 오래 가지 못하고 1, 2년 오래 살았다는 것은 장점도 되지 못 한다. 안타깝게도 선천적인 능력의 차이, 또는 후천적 열정의 차이(아니면 둘 다)로 그 정도는 쉽사리 뒤집어진다.


심리학적인 이유로, 위와 같은 행위들은 열등감을 극복하기 위해 발생한다. 하지만 본인이 적절하게 제어하지 못하고 지나치게 자신의 자존감을 방어하게 된다면 마찬가지 심정인 다른 사람과 충돌을 빚게 된다. 그 갈등의 결과물이 현피나 내기, 고성토론 등으로 비화되는 것은 찾아보기 어렵지 않다.


사람에게 주어지는 24시간은 동일하며 같은 시간을 어떻게 쓰느냐에 따라 자신의 영역이 크게 달라진다. 스스로의 근거 빈약한 우월감을 잘 억누르고 한계를 항상 의식하여 행동한다면 최소한 난데없이 잘난 척 나서다가 쪽을 사게 되는 상황은 면할 수 있겠다.


이 글은 어느 정도 반성문의 의미가 포함되어 있다. :-)


아, 그런데 참고자료는 항상 기록하기가 귀찮네...



※ 참고자료

에릭 에릭슨, 알프레드 아들러

Erikson's stages of psychosocial development

열등감Inferiority

개인심리학Individual psychology


Posted by OOJJRS
,

 

아직 분류 없음 2013. 9. 26. 00:20

...


누리도, 모세도, 삼국지 열전도 만들어야 하는데 나는 여기서 무엇을 하고 있나?!


다시 시동이 걸리고 있다 부릉부릉

Posted by OOJJRS
,

작업을 하다보면 왕왕 컴퓨터가 변경된다거나 현재 상황을 통으로 공유해야 한다거나 추측하기 어려운 모종의 이유로 현재 열려 있는 페이지의 목록을 몽땅 저장해서 보존해야할 필요가 생기는데 즐겨찾기를 이용하여 쉽게 가능하다. IE에서도 안 되는 것은 아니지만 하나하나 페이지를 수동으로 추가해야 하기 때문에 귀차니즘이 도질 수 있다. 반면 즐겨찾기 목록 자체의 관리는 크롬보다 IE가 변하다고 느끼기 때문에 이 간극을 어떻게 극복해야하나 고민 중이긴 하다. (여타 다른 브라우저는 잘 사용하지 않아서 모르겠다)


여튼, 크롬에서는 현재 열린 페이지 목록이 만약 다음과 같이 있다고 한다면




아래와 같이 북마크 메뉴를 열어 열린 페이지를 북마크에 추가 메뉴를 선택한다 (단축키 Ctrl + Shift + D)




대략 다음과 같이 알아서 폴더명을 정해서 저장을 해주면




북마크 관리자 메뉴를 열어보면 다음과 같이 저장된 것을 볼 수 있다.




위 내용을 어떻게 볶아먹을지는 이후의 선택 (불친절한 마무리)

Posted by OOJJRS
,

Local, LocalLow, Roaming

개발 2013. 9. 22. 21:56

보통 임시 폴더로 알고 있지만 임시 폴더라고 하기엔 사용처나 개념이 약간 다르다. XP 시절에는 별달리 구분이 없이 Application Data 라는 폴더 하나만 있었지만 (부모 경로도 미묘하게 다르다) 비스타 이후 세분화되었다.


Local 과 Roaming 폴더는 윈도우의 제반 환경이 사용 시 서버가 필요한가(AD) 여부에 따라 역할이 구분된다고 한다. 폴더 이름대로, 어느 컴퓨터에서든 내 계정으로 로그인할 경우 이전에 사용했던 환경이 현재 컴퓨터에 내용 일치(동기화)가 필요하면 Roaming 아래에, 그런 게 아니면 Local 에 기록한다는 것이다. 만약 동기화가 필요 없는 커다란 데이터가 불필요하게 Roaming 아래를 사용하면, 그 계정은 아마 로그인할 때마다 많은 시간을 필요로 하게 될 것이다. 그래서 대부분은 사용 로깅이나 환경 설정 같은 기록들을 Roaming 아래에 사용한다고 한다.


LocalLow 는 권한 등급(Integrity Level, 권장 번역 단어가 없음. 이하 IL)이 낮을 때에도 사용할 수 있는 폴더라는 뜻이다. 보안 위협이 큰 익스플로러 같은 브라우저는 IL이 Low로 설정되어 있다. 이런 프로그램도 당연히 임시로 뭔가를 저장하거나 기록할 수 있는 위치가 필요한데, 그때 Local은 사용하지 못하니 LocalLow를 사용하게 된다. 반대로 말하자면 프로그램이 가질 수 있는 권한이 설정에 따라 매우 다양한데, 무조건 뭔가를 기록해야할 필요(로그, 덤프 등)가 있다면 LocalLow에 하면 된다는 뜻.


※ 참고자료

Low IL로 프로그램을 실행하는 방법

Posted by OOJJRS
,

CSIDL

개발 2013. 9. 22. 21:15

msdn 페이지 링크

http://msdn.microsoft.com/en-us/library/windows/desktop/bb762494%28v=vs.85%29.aspx


저 동네 주소가 변경되어도 상관없는 tinylink 주소 같은 건 어떻게 못 하려나 백방으로 찾아도 빡세다.


CLSID 와 비슷해보이지만 전혀 다른 녀석들이다.


Posted by OOJJRS
,

즐겨찾기 정리 중 오래된 페이지지만 아직 유용한 곳을 재발굴해냈다.


http://speller.cs.pusan.ac.kr/


이 페이지는 내가 높은 관심을 갖고 있는 언어와 인공지능 양쪽의 지식이 모두 동원되어야 한다는 점에서 마음에 든다.


당시에는 단기 프로젝트인가, 어디까지 갈라나, 같은 기분이었지만 의외로 요즘까지 살아있는데다 불과 며칠 전에 새 버전이 나왔다 하니 왠지 즐겁다.


널리널리 알려졌으면 좋겠다. :-)


Posted by OOJJRS
,

원문은 이쪽을 참고하기 바랍니다.

http://tortoisesvn.net/tsvn_1.8_releasenotes.html


메이저 버전이 올라갈 때마다 뭔가 적절한 기능이 추가되었다는 소리이므로 (1.7 버전으로 올라갈 때에는 .svn 폴더가 루트 쪽으로 통합된다는 내용이 가장 마음에 들었다) 이번에도 역시 기대를 갖고 보았다.

(물론 1.8 버전이 나온지는 좀 되었고, 안정화...를 기다린다는 명목으로 1.8.3 에 와서 좀 돌려보았다. 그런데 이번에는 마이너 버전이 1.7 시절에 비해 팍팍팍 올라간 기분.. 그냥 기분 탓)



다음은 개선된 기능의 목록


1. 블레임 UI 에서 각 리비전 별로 컬러가 추가됨

2. 파일 중 일부 내용만 커밋할 수 있음 (나이스!)

3. 거북이 merge 의 기능 향상

리본 UI 의 도입, go to line (항상 왜 없는지 의아했던), 등등

4. 저장소 브라우저 개선

드디어 한 svn 서버가 가진 모든 저장소를 루트로부터 찾아볼 수 있다. (나이스!)

뒤로 가기와 앞으로 가기 (나이스! 좀 더 브라우저스럽게 되었다)

5. Third Party Library 개선

외부에서 제작된 라이브러리를 svn 에 커밋했을 경우, 해당 라이브러리가 버전업이 되면 관리에 약간 부담을 갖게 되는데 대표적으로 파일이 삭제된 경우가 있다. 기존에는 파일의 추가나 변경은 그럭저럭 상관 없었지만 파일의 삭제는 캐치하지 못하고 계속 svn 에 등록된 채로 남아있었는데, 이제 1.8 버전부터는 간단한 마우스 우클릭 메뉴를 통해 그러한 녀석들도 한 방에 정리해줄 수 있게 되었다.

6. Progress Dialog

업데이트 등을 할 때 뜨는 진행 상태 다이얼로그가 좀 더 좋아졌다~

7. SubWCRev.exe 개선 (일종의 매크로 치환 동작을 하는 프로그램이다)

A. UTF-16 인코딩을 예쁘게 지원하게 되었다.

B. 작업소에 리비전을 박아넣을 때, 특히 리비전을 버전 정보로 사용할 때를 위한 새 옵션이 추가되었다. 기존에는 윈도우의 리소스가 16bit를 사용하기 때문에 65535 이상의 리비전 번호를 버전 정보로 사용할 수가 없었는데, 그래서 종전에는 16bit를 넘어가는 리비전 번호는 음수로 표기되는 골 때리는 일이 있었다.

C. SubWCRev 가 이제 등록되지 않은 (작업소 내의) 파일과 폴더 등도 찾아준다. 요 기능을 통해 커밋 때 빠뜨리고 올리지 않은 파일 같은 걸 찾아내서 담당자를 욕할 수 있다 에러를 콱 반환할 수 있다.

8. Custom 속성들

커스텀 속성을 사용하면 거북이svn을 좀 더 편리하게 사용할 수 있단다.

근데 이건 문서도 따로 있을 뿐더러 너무 길어서 해석은 생략 (죄송합니다) > 링크는 여기 <

9. 훅 스크립트를 속성 설정으로도 가능! (우와 씨앙 나이스!!!! 이번엔 네가 베스트)

기존에는 다이얼로그로만 설정이 가능해서 하나의 설정을 여러 컴퓨터에서 써야할 경우 (개인이 여러 플랫폼을 사용할 때 뿐 아니라 특히 대형 프로젝트에서 각자 설정할 때) 별도의 툴을 만들어 쓰거나 서비스 마인드를 함양하거나 포기했어야했는데 이제 속성으로 걸 수 있게 되었다. 이제 막 포맷하고 다시 깔아도 돼

이거 설정하면서 왜 서버에 한방에 설정하는 기능이 없냐고 욕을 바가지로 했었는데 이제 귀차니즘에서 해방된다!!



일단 무조건 버전업하고 보는 거다.


Posted by OOJJRS
,

설계의 정반합 1

개발 2013. 8. 31. 17:14

내가 개발 설계에서 항상 고민하는 점은 어떻게 해야 나중에 가서 이 작업이 고민거리로 발전하는 것을 막을 수 있을까 하는 점이다.


쥐뿔도 모르던 옛날부터 눈만 높아진 지금에 이르기까지 나를 개발자로 있게 하는 원동력은 욕망과 귀차니즘이었다.


컴퓨터로 하고 싶은 것들은 여럿 있는데 어찌나 사용하기 불편하고 귀찮은 게 많던지, 꽤나 세월이 흐른 지금도 나는 버튼 하나만 누르면 내가 원하는 기능이 딱 되는 그런 환경을 꿈꾼다.


모르긴 몰라도 수많은 설계 서적들에서 도달하고 싶은 경지는 결국 나와 같지 않을까 하고 상상한다.


하나의 마법과도 같은 단어, 혹은 함수 호출, 키워드, 정의를 통해 프로그램 하나가 턱 하고 튀어나오는 그런 세계.


수많은 개발자들이 일자리를 잃게 될지도 모르지만 어릴 때부터 항상 나는 귀차니즘에 휩싸여 살아왔던 듯 싶다.





다음과 같은 (Pseudo C++) 예제를 보자.


// 1단계 : 1에서 100까지 출력

printf("1\n");

printf("2\n");

...

printf("100\n");



근성을 발휘하여 100라인을 만들어보았다(상상 속에서). 그런데 조금만 공부해도 반복문이란 것을 배운다. 컴퓨터가 좀 더 우리의 삶을 윤택하게 해줄 수 있는, 가장 잘하는 일 아닌가?


// 2단계 : 반복문을 사용하여 1에서 100까지 출력

for(int i = 1; i <= 100; ++i)

printf("%d\n", i);


좀 더 재사용성을 높여서 함수로 만들 수 있을 것 같다.


// 3단계 : 1에서 100까지 출력하는 로직을 함수화

void func()

{

for(int i = 1; i <= 100; ++i)

printf("%d\n", i);

}


자, 이제 우리는 func() 함수만 호출하면 무조건 1에서 100까지 출력할 수 있는 기능을 갖게 되었다.


여기까지는 우리가 보통 어렵지 않게(그리고 순식간에) 도달하는 영역이다.




함수를 배우고 나서 조금 지나면 Parameter/Argument라는 것을 배운다. 갑자기 함수의 활용폭이 넓어진 것 같은 기분을 느끼며 시작값 1과 종료값 100을 외부에서 줘본다.


// 4단계 : Parameter를 통해 함수의 활용폭을 넓힘

void func(int begin, int end)

{

for(int i = begin; i <= end; ++i)

printf("%d\n", i);

}


어이쿠, 갑자기 1과 100이라는 숫자가 보이지 않으니 이 함수가 어떤 값을 처리할 수 있는지 명확하게 보이지 않아 조금 불안해졌다(의미 응집성 하락). 하지만 이 작업 하나로 지금 1에서 50까지 출력해야할 곳에서도, 나중에 927에서 23598까지 출력해야할 곳이 생겨도 모두 처리할 수 있게 되어 행복도가 증가했다(활용도 증가). 이 함수는 이제 뭐든지 다 할 것 같다. 그래서 약 5000군데에서 호출하여 사용했다.




이 단계까지는 연습용 코드 몇 개만 해봐도 그렇게 어렵지 않게 겪어볼 수 있다(5000곳에서 호출하는 정도는 아니겠지만). 그런데 아무래도 여러 곳에서 사용하다보니 점점 함수의 견고함이 증명되어 신뢰도가 올라간다. 따라서 이 함수에 기능을 추가하면, 적어도 기존에 돌아가던 기능은 잘 돌아가고 추가 동작도 매끄럽게 될 것 같아서 다음과 같은 요구사항도 끼워넣게 되었다.


// 5단계 : begin ~ end 사이에서 2단위로 출력

void func(int begin, int end, bool jumpTwoStep)

{

if(jumpTwoStep)

{

for(int i = begin; i <= end; i += 2)

printf("%d\n", i);

}

else

{

for(int i = begin; i <= end; ++i)

printf("%d\n", i);

}

}


아뿔싸, Parameter 하나 추가했다고 5000군데에서 호출하던 곳에서 빌드 에러가 나서 동료/친구/나 스스로에게 욕을 왕창 얻어먹고 나서 5000곳을 변경할 자신은 없으니 황급히 Default-Argument 를 끼워넣는다.


// 5.5단계 : 기존 호출되던 함수와의 호환성 보장

void func(int begin, int end, bool jumpTwoStep = false)

{

if(jumpTwoStep)

{

for(int i = begin; i <= end; i += 2)

printf("%d\n", i);

}

else

{

for(int i = begin; i <= end; ++i)

printf("%d\n", i);

}

}


그런데 내 작업을 우연히 지나가다 본 선배/파트장/팀장/라이벌/리드개발자가 이 함수는 확장성이 없다며 변경할 것을 권고했다. 하지만 아무리 생각해도 나는 단순한 작업 대신 복잡도를 올리고 앞으로 더 쓰일지 확신도 없는 코드를 힘들여 생산해내는 것에 회의적이다. 하지만 그들의 부드러운 말투가 험악한 욕설과 구타로 변하기 직전 뜻을 꺾고 그들의 조언을 받아들였다.


// 6단계 : 확장성을 위해 명료함을 희생함. 또는 복잡도를 높여 미래를 대비함

void func(int begin, int end, int step = 1)

{

for(int i = begin; i <= end; i += step)

printf("%d\n", i);

}


만들어두고 보니 이전 코드가 시작과 종료값만 처리했지, step은 처리해두지 않았다는 설계적 구멍이 있었음을 역설한다. 그리고 그것 때문에 내가 고생했다며 억울함을 역설하면서, 한편으로는 이 견고하고 확장성 있던 함수의 약점을 내가 찾아 보완했다는 것에 기쁨과 자부심을 느끼며 업무를 종료하고 그날의 턴을 마친다(음?).




설계 시에 항상 화두에 오르는 것 중 하나는 명료함 vs 확장성이 아닐까 한다. 이제 와서 다시 1~3단계의 코드를 보고 6단계의 코드와 비교해보자. 애초에 우리는 1에서 100까지 출력하기 위해 작업을 시작했다. 하지만 6단계의 함수로는 대충 무엇을 하는지는 파악했어도 정확하게 어떤 출력값이 나오는지는 저 함수를 호출하는 코드를 포함하여 전체를 다 뒤져보거나, 실행해보기 전에는 알 수 없게 되었다. 데이터(1, 100, 1)와 로직(반복문)이 분리됨으로써 활용도가 높아지고 확장성을 가지게 되었지만, 프로그램의 정확한 동작을 분석하기 위해서는 좀 더 넓은 영역의 코드를 볼 필요가 생겼다는 뜻이다.


만약 나중에 가서 func() 함수의 step 기본값을 1에서 2로 변경해야할 일이 생긴다면, 그 사람에겐 5000군데 이상의 의존성을 지닌 코드를 모두 조사하고 분석해보고 나서야 문제 없이 작업을 완료할 수 있을 것이다. 더 슬픈 사실은 그렇게 시간을 들이고 나서 "이 작업은 진행할 수 없습니다" 라고 이야기할 지도 모른다는 것.

Posted by OOJJRS
,

코드에 대한 블로그도 많지만, 아무래도 격식 있는 구조를 좋아하다보니 티스토리를 비롯한 많은 블로그가 사실 맘에 안 들었는데,


글을 쓰다말고 주화입마에 빠져서 내가 원하는 기능을 열라 찾아 헤맸지만 결국 못 찾아서 귀찮음이 커지고 짜증이 커져버렸다.


SyntaxHighligter 도 뭐 그렇다 치지만, 글을 쓰기 위해 html 을 왔다갔다 하기가 얼마나 귀찮은데 단축키라든지 메뉴로


textarea 등을 만들어내는 기능이 없는 건지 역시 블로그는 나와 맞지 않나 라는 생각이.


옛날처럼 개인 사이트, 게시판 등을 운영하기엔 시간이 허락하지 않을 것 같은데...



하지만 그때도 결론이 '네 맘에 맞으려면 그냥 네가 만들어야 함'이었다시피 요즘도 그건 별로 다르지 않은 듯 싶다.


결국은 글 쓰다 말고 다시 귀찮아져서 완성을 못 해버렸군?




블로그 계의 la-tex 과 같은 에디터는 없나?

(어차피 css가 있으니 그런 게 있을 턱이 있나 싶긴 하지만서도)


하지만 사실 내게 필요한 건 레이텍도 아니고 걍 아래아 한글 정도만 충분하긴 한데


정녕 만들어 써야 하는 거냐

Posted by OOJJRS
,