출처 : http://www.devpia.com 에 박제성(breadfan)님이 올리신 글입니다...


전에 회사 사람들 알려주려고 만들었던 건데요... 허접하지만 간단하게 나마 이용하실분 계실까 해서 올립니다...

1. 제 경험으로 봐서는 워드파일이나 파워포인트 문서를 .htm 파일로 변경하는건 좋지않은 방법 같습니다.
   알수없는 지저분한 소스들도 너무 많이 붙고... 그래서 저는 아예 첨부터 .htm 파일 만드는것으로 시작
   합니다. 깔끔하거든요... 이쁘게 하고 싶으면 아는 소스 다 쓰셔서 휘황찬란하게 할 수도 있습니다.
   뭐... 나모나 드림위버를 써서 이쁘게 할 수도 있겠죠.

2. 일단, 작업할 .htm 을 먼저 만듭니다. 이때, .chm 파일의 구성을 생각하셔서 소단위별로 만드시는게 좋습니다.
   파일하나당 화면하나의 구성이 좋습니다. 싫으면 마시구요... -_-;;

3. .htm 파일이 모두 만들어졌으면, "HTML Help Workshop" 을 실행시킵니다. 그리고 File->New를 선택하시면
   생성할 종류를 선택하는 창이 하나 뜨는데요, 여기서 "Project"를 선택합니다. 그러면, 위저드가 하나 뜨고요,
   첫 화면에서 그냥 다음으로 넘어갑니다. 그리고 두번째 화면에선 만들고자 하는 프로젝트 파일의 경로와
   프로젝트 이름을 지정할 수 있습니다. 마음에 드는 이름과 경로를 선택한 후 다음으로 넘어갑니다.

   그러면 컨텐츠파일과 인덱스 파일, html 파일을 지정할 수 있는 화면이 나오구요, 여기서 모두 선택하지 않고
   다음으로 넘어갑니다. (선택하면 어떤 일이 생기는지는 한번 해보시기 바랍니다.) 그러면 마침이 나오네요,
   그리곤 프로젝트가 열려서 작업을 할 수 있게 해줍니다.

4. 자! 여기서 우리가 필요한 .htm 파일을 추가시켜야 하는데요, 왼쪽 프레임이 "Project", "Contents", "Index"
   이렇게 세가지 탭이 있죠? 여기서 일단 "Project" 에서 위에서 두번째 버튼에 마우스를 올리면 "Add/Remove
   Topic Files"라고 설명이 나오죠? 이걸 눌러주세요. 여기서 필요한 .htm 파일을 선택해주세요. 그러면 "Project"
   창에 추가시킨 파일이 모두 뜰겁니다. 그러면...

5. "Project" 옆에 있는 "Contents" 탭을 열어주세요. 그러면, 컨텐츠파일을 하나 새로 만들거나 있는걸 활용하라는
   메시지 창이 하나 뜹니다. 하나 새로 만드시죠... 역시 원하는 위치에 원하는 이름으로 만듭니다. 이왕이면 프로
   젝트 폴더에 만드시는게 좋겠죠...? 그러면 컨텐츠 탭이 활성이 됩니다. 그럼... 위에서 두번째 버튼을 보시면
   "Insert a heading" 이라는 설명이 나오죠? 이건... 챕터 단위로 구분을 하고 싶을때 씁니다. 그 밑에 "Insert
   page"는 챕터아래 파일을 둘때, 아니면 간단한 도움말 파일이라서 챕터 단위의 구분이 필요없을때 씁니다.

   우리는 일단, 챕터 단위로 해보죠. "Insert a heading" 버튼을 강하게 압박해주세요. 그러면, 창이 하나 뜹니다.
   여기서 add 버튼을 클릭하면 추가시킨 .htm 파일들이 모두 뜨는 창이 하나 나오구요. 그중에 헤더로 쓸 파일을
   하나 선택해서 추가시킵니다. 그리곤, 파일의 타이틀을 써주세요. 이건 도움말 피일 리스트에 표시될 이름이니
   이쁘게 선택하세요. 자, 메인헤더가 결정이 되었으면 다음 챕터의 시작이 필요하겠죠? 다시 "Insert a heading"
   을 눌러서 챕터의 헤더를 선택하세요. 여기서 아마도 두번째 추가시킨 헤더가 위로 올라가는 경우가 있을 수도
   있습니다.

   당황하지 마시구요... 아래쪽에 보면 화살표들이 있죠? 아래 화살표를 사뿐이 누르시면 밑으로 내려갑니다.
   그리곤, 메인헤더가 두개면 안되죠? 오른쪽 화살표를 눌러주세요. 그러면 Layer 로 챕터가 만들어집니다.
   이런식으로 오른쪽, 왼쪽, 위, 아래 화살표를 이용해서 depth 를 조절해주세요. 챕터의 아래에 사용할 파일을
   넣으시려면 좀 전에 설명드렸듯이 "Insert page"를 눌러주세요. 방식은 같답니다.

6. 다음은 "Index" 입니다. 이건 검색어를 미리 입력해서 검색기능을 부여하는 텝인데요, 재미있습니다. "Index" 탭
   을 선택하면 "Contents" 처럼 파일을 선택, 생성할수 있는 창이 뜹니다. 방식은 같습니다. 그래서 "Index" 탭이
   활성이 되면 두번째 버튼이 열쇠로 되어있죠? "Insert a Keyword" 라고 설명이 뜹니다. 이걸 선택해주세요.
   그럼 파일을 선택하고 검색어를 지정할 수 있게 되어있죠? 컨텐츠와 거의 비슷합니다. 이런식으로 작업을 하신
   후 툴바에 있는 왼쪽에서 세번째 버튼을 보시면 "Compile Html File" 이라는 설명이 나오는데요, 이걸 눌러주세
   요. 그러면 .chm 파일이 생깁니다. 그리고 그 옆의 버튼은 만들어진 도움말 파일을 볼수 있게 해주는 버튼이구
   요...
   
이정도면 연습삼아 도움말을 만들 수 있을 정도는 되는것 같네요. 그다지 많은 기능이 있지 않으니 해보시면서 이것저것 눌러보시면 금방 익숙해지시리라 믿습니다.
참고로, "HTML Help Workshop" 은 비졀스튜뎌 써비스팩에 포함되어있습니다.




출처 : http://www.devpia.com 에 탱크장(tank952)님이 올리신 내용

Microsoft HTML Help Downloads

HTML Help의 다운로드는 마이크로 소프트 다운로드 센터에서 받으세요.

Help Viewer 업데이트

HTML Help 설치와 업데이트 패키지 (Hhupd.exe) 1.40는 HTML Help를 최신 버전으로 갱신하며, 자유롭게 배포가 가능합니다. 1.40 버전은 인텔 플랫폼에서만 사용 가능하며 모든 언어를 지원합니다. Windows XP, 2000, ME, 98 사용자는 Hhupd.exe를 실행하지 마십시오. 자세한 것은 주의를 참조하세요.

Download Hhupd.exe

최신 버전의 HTML Help Workshop 받기

Download Htmlhelp.exe

일본 버전의 HTML Help Workshop에만 적용됩니다:

Download Htmlhelpj.exe

HTML Help 문서

문서에는 다음의 파일이 포함되어 있습니다.

  • HTML Help 저작 가이드 (Htmlhelp.chm)

    HTML Help Workshop을 사용하여 도움말 프로젝트 계획짜기,만들기,컴파일 하기등을 설명합니다.

  • HTML Help ActiveX 컨트롤 레퍼런스 (Hhaxref.chm)

    HTML Help ActiveX Control의 메소드, 명령어, 매개 변수등을 설명합니다.

  • HTML Help API 레퍼런스 (Api.chm)

    HTML Help API의 경고 메시지, 구조, 명령어등이 있습니다.

  • HTML 레퍼런스 (Htmlref.chm)

    기본 HTML 레퍼런스

  • HTML Help Viewer의 도우말(Viewhlp.chm)

    HTML Help 뷰어에 제공되는 도움말 주제의 설정을 필요에 따라서 설정할 수 있습니다.

  • HTML Help API 라이브러리 파일 (Htmlhelp.lib)

Download HelpDocs.zip

최종 사용자 계약

The end-user license agreement (EULA) 는 HTML Help 다운로드의 일부입니다. 제품을 다운로드 받기 이전에 나타납니다.

시스템 요구사항

인터넷 익스플로어 최신 버전으로 설치. http://www.microsoft.com/ie.

8 MB 정도의 여유 공간.

주의

중요합니다! 설치 및 업데이트 하기전에 워크삽을 닫습니다. HTML Help ActiveX 컨트롤이 제대로 동작하지 않는 경우가 발생할 수 있습니다.

설치하려면, 링크를 오른쪽 클릭해서 "다른 이름으로 대상 저장"을 선택하고 저장할 위치를 선택하세요. 파일이 다운로드되면, 더블 클릭하여 실행합니다.

Windows XP, 2000, ME, 98 사용자는 Hhupd.exe를 실행해서는 안됩니다. 급한 경우가 아닌경우에는 서비스 팩이나 윈도우 업데이트를 통해 다루어지게 됩니다.

관리자 허락이 없는 경우에는 HTML Help 설치와 업데이트 패키지는 윈도우 NT 시스템에서는 설치할 수 없습니다.

새로운 기능을 추가할 계획은 아직 없습니다.

Posted by 노을삼킨별
,

출처 : http://blog.naver.com/pinocc/120029993192

1. 데몬의 종류(펌)

데몬에는 sendmail 이나 아파치 처럼 단독으로 실행되는 것들이 있고 데몬들을 여러가지 서비스 등을 한꺼번에 관리하는 슈퍼 데몬이 있다

리눅스 초기 설치 시, 또는 추가 또는 수정하였을 때 데몬을 리스트에 올리거나 내릴 수 있으며(ntsysv) 지금 나열하는 데몬의 종류는 레드헷 리눅스(Red hat Enterprise Linux) AS 4.0 버전 기준으로 작성한 것이다. 출처는 각 데몬의 도움말을 참고하였다.

1. NetworkManager : 자동으로 최대 사용가능한 연결에 네트워크 연결을 스위칭한다.

2. acpi : 커널로부터 ACPI 이벤트들을 받아서 처리한다.

3. anacron : downtime까지 남겨진 cron 작업들을 실행한다.

4. apmd : 베터리 상태를 모니터링하고 기록(syslog(8))한다. 고급 전원 관리기능을 하는 데몬

5. arptables_jf : 자동으로 arptables로 패킷 필터링을 하는 방화벽 데몬

6. atd : 백그라운드 작업을 수행하거나 예약 명령을 처리한다.

7. autofs : 서버의 파일을 읽을 때 자동으로 마운트하도록 해주는 데몬

8. bluetooth : 서비스 검색과 인증 서비스를 위한 데몬

9. chargen : 케릭터를 발생시키는 내부적인 xinetd 서비스 데몬(tcp버전)

10. chargen-utp : 9번과 동일 utp버전이다.

11. cpuspeed : 동적인 cpu speed 데몬

12. crond : 리눅스에 등록된 명령어들을 정기적으로 수행하는 데몬

13. cups : 프린터 데몬

14. cups-config-deamon : D-BUS를 통한 프린터 환경설정 데몬

15. cups-lpd : cups와 통신하는 레거시 lpd 프로토콜 데몬

16. daytime : 현재 시스템 시간을 가져와 프린트해주는 내부 xinetd 데몬 (tcp버전)

17. daytime-udp : 현재 시스템 시간을 가져와 프린트해주는 내부 xinetd 데몬(udp버전)

18. diskdump : 시스템 충돌이나 diskdump모듈이 초기화되면 덤프파일을 저장

19. echo : echo의 케릭터들을 클라이언트로 뿌려주는 xinetd데몬 (tcp)

20. echo-udp : (udp) version

21. eklogin : 케베로스 5를 가지고 암호화시키는 데몬

22. gpm : 텍스트기반의 리눅스 어플리케이션에 마우스를 서포트하는 데몬

23. gssftp : kerberized ftp 서버 케베로스 5를 가지고 암호화

24. haldeamon : 소스로부터 하드웨어에 대한 정보를 모으고 유지하는 데몬

25. iiim : 중요한 IIIMSF 요소

26. iptables : 방화벽 설정 데몬(iptables)

27. dirda : (infrared Data Association) wireless를 위한 표준 협회

28. irqbalance : 프린터 작업 분배 담당

29. idsn : ISDN 서비스 설정 데몬

30. klogin : 케베로스 5 인증, dsd 타입, rlogin 세션을 설정하는 데몬

31. krbs-telnet : 케베로스 5 인증, 보통의 텔넷 세션

32. kshell : 케베로스 5 인증, rshell 인증

33. kudzu : 하드웨어 검색 데몬 이 서비스를 중지시키면 새로 장착하는 하드웨어가 없는 한 부팅시간을 단축시킨다. 보통의 경우엔 꺼두는 것이 좋다.

34. Im-sensors : 메인보드 센서값을 모니터링한다.

35. mdmonitor : RAID 모니터링과 관리 담당 데몬

36. mdmpd : 다중 경로 디바이트 모니터링과 관리

37. messagebus : 시스템 이벤트나 다른 메시지를 알려줌

38. microcode-ctl : cpu 마이크로코드를 지원하는 스크립트

39. netdump : netconsol과 netcrashdump 요소들을 초기화시키는 데몬

40. netfs : NFS, SMB/CIFS, NCP등을 마운트 또는 언마운트 시키는 데몬

예를 들어 NFS서비스를 사용하고자 할때는 미리 이 데몬을 띄어 놓아야 한다.

41. netplugd : non-static 네트워크 인터페이스를 관리하는 데몬

42. network : 부팅시 모드 설정된 네트워크 인터페이스를 활성화 또는 비활성화시키는 데몬

43. nfs : tcp에서 파일 공유 데몬, 리눅스에서 nfs서버를 운영할 때 쓴다.

41. nfslock : nfs서버를 운영할 때 다수 사용자들의 접근을 방지할 때 쓴다.

42. nscd : 느린 DNS서비스나 NIS, LDAP를 쓰면 이 데몬을 띄어 주어야 한다.

43. NTPD : ntpV4 데몬, 시간 동기화를 맞춰 주는 데몬

44. pcmcia : 이더넷 데몬 노트북에서 주로 사용하는 데몬이다.

45. portmap : RPC 연결 관리 데몬(NFS, NIS)

46. psacct : 프로세스에 대한 설명을 시작하거나 중지할때 쓰는 데몬

47. rawdevices : raw디바이스를 블록 디바이트에 맵핑시켜주는 스크립트

48. readahead : startup 퍼포먼스를 증가시킨다.

49. readahead-early : 위와 같다.

50. rhnsd : 서비스 레벨에 따라 시스템 모니터링 작업 수행과 업데이트 등을 위해서 연결된 작업을 레드햇 네트워크 서버에 핸들링한다.

51. rpcgssd : 유저레벨 데몬 시작, NFSv4 클라이언트를 위해서 RPCSEC 관리

52. rpcidmapd : 유저레벨 데몬, 유저 uid와 gid값을 매핑시켜준다.

53. rpcsucgssd : 유저레벨 데몬

54. rsync : crc check summring, 동기화 데몬

55. rwhod : finger와 비슷하다. 원격 유저가 유저 리스트를 얻을 수 있다.

56. saslauthd : 인증된 요청을 핸들링하는 서버 프로세스

57. sendmail : 메일 서버 데몬

58. smartd : 자기 모니터링과 리포틍

59. snmpd : 단순 네트워크 관리 프로토콜

60. snmptrapd : snmpd trap 데몬

61. sshd : 오픈 ssh 서버 데몬

62. syslog : 로그 데몬

63. telnet : 텔넷 서버 데몬

64. time : RFC 868타임 서버 데몬 (TCP버전)

65. time-udp : time 데몬과 같다. (udp버전)

66. uncserver : uncserver를 설정

67. vsftpd : ftp 데몬

68. winbind : 삼바 win bind 데몬

69. xfs : X-window 폰트 데몬

70. xinetd : 슈퍼 데몬 각종 서비스를 관리 한다. (telnet, ftp, rlogin 등)

71. ypbind : NIS 데몬

다. 데몬의 실행과 중지
단독 데몬들은

# service deamonname start | stop

을 실행함으로서 실행과 중지를 할 수 있다.

ex) # service network start | stop | restart

이 데몬들은 /etc/rc.d/init.d 디렉토리에 스크립트 파일을 가지고 있다.

스크립트 파일안의 내용을 수정하여도 된다.

부팅시 자동실행되는 데몬을 관리하기 위해서는 ntsysv명령어를 쳐서 쉽게 관리가 가능하다.

# ntsysv   // 현재 레벨의 데몬 관리 지정

# ntsysv --level 3 // 3번 레벨의 데몬 관리 지정

많이 사용하는 데몬 : 주로 사용하는 데몬으로는 xinetd, ftp(단독일경우), sshd(ssh 서비스 사용시)
정도가 있고 sendmail 을 사용하다면 이 데몬을 띄어 준다.
NFS 서비스를 사용한다면 nfs, nfslock, portmap, netfs 데몬들을 띄어 준다. 만일 사용하지 않는다면 꺼두는 것이 보안상 좋다.
named서비스를 사용하면 이 데몬을 띄어 주면 된다.
스케줄링 작업 데몬으로는 atd, crond 데몬 정도를 띄어 주면 된다.
시디를 자주 사용하지 않는다면 autofs 데몬을 정지시켜 놓는다.
테스트용이나 서비스를 하지 않는 데몬은 정지시켜 놓는 것이 바람직하다.

출처 : AS 4.0버전의 도움말




2. 데몬의 관리(펌)



   1). chkconfig  -->  runlevel에 따라 동작 하는 프로세스들을 확인 할 수 있다.


[root@panic-LINUX ~]# chkconfig --list | more
NetworkManager  0:off   1:off   2:off   3:off   4:off   5:off   6:off
NetworkManagerDispatcher        0:off   1:off   2:off   3:off   4:off   5:off
6:off
acpid           0:off   1:off   2:off   3:on    4:on    5:on    6:off
anacron         0:off   1:off   2:on    3:on    4:on    5:on    6:off
apmd            0:off   1:off   2:on    3:on    4:on    5:off   6:off
atd             0:off   1:off   2:off   3:on    4:on    5:on    6:off
auditd          0:off   1:off   2:on    3:on    4:on    5:on    6:off
autofs          0:off   1:off   2:off   3:on    4:on    5:on    6:off
bluetooth       0:off   1:off   2:on    3:on    4:on    5:on    6:off
cpuspeed        0:off   1:on    2:on    3:on    4:on    5:on    6:off
crond           0:off   1:off   2:on    3:on    4:on    5:on    6:off
cups            0:off   1:off   2:on    3:on    4:on    5:on    6:off

chkconfig 는 아래와 같은 option이 있다.
[root@panic-LINUX ~]# chkconfig
chkconfig version 1.3.20 - Copyright (C) 1997-2000 Red Hat, Inc.
This may be freely redistributed under the terms of the GNU Public License.

usage:   chkconfig --list [name]
         chkconfig --add <name>
         chkconfig --del <name>
         chkconfig [--level <levels>] <name> <on|off|reset>
응용을 해보면
[root@panic-LINUX ~]# chkconfig --list yum(서비스명)
yum             0:off   1:off   2:off   3:on    4:on    5:on    6:off
[root@panic-LINUX ~]# chkconfig --level 45(runlevel)  yum(서비스명)  off(on/off)
[root@panic-LINUX ~]# chkconfig --list yum
yum             0:off   1:off   2:off   3:on    4:off   5:off   6:off  ==> 4,5 runlevel 목록이 off로 바뀌었다.
[root@panic-LINUX ~]#


      2) ntsysv


ntsysv 1.3.20 - (C) 2000-2001 Red Hat, Inc.

                                   Services                      
                                                                  
                What services should be automatically started?    
                                                                  
                        [ ] NetworkManager                        
                        [ ] NetworkManagerDispatcher              
                        [*] acpid                                
                        [*] anacron                              
                        [ ] apmd                                  
                        [*] atd                                  
                        [*] auditd                                
                        [*] autofs                                
                                                                  
                                                                  
                          Ok                   Cancel            
                  
Press <F1> for more information on a service.                                  


      3)  직접 각 runlevel에 들어가서 수정 하기


[root@panic-LINUX ~]# cd /etc/rc.d/rc5.d
[root@panic-LINUX rc5.d]# chkconfig --list yum
yum             0:off   1:off   2:off   3:on    4:off   5:off   6:off
[root@panic-LINUX rc5.d]# ls | grep yum
K01yum
[root@panic-LINUX rc5.d]# mv K01yum S01yum
[root@panic-LINUX rc5.d]# chkconfig --list yum
yum             0:off   1:off   2:off   3:on    4:off   5:on    6:off
[root@panic-LINUX rc5.d]#

Posted by 노을삼킨별
,

Windows Version List

게임 개발 2008. 1. 28. 17:31

<Windows Version List>

Windows 3.0 / 3.1 (DOS)
Windows 95
Windows 98
Windows ME(Millennium Edition)
Windows NT 4.0 : 4.0
Windows 2000 : 5.0
Windows XP : 5.1
Windows Server 2003 : 5.2
Windows Vista : 6.0

operating system DirectX 의 버전
Microsoft Windows® 98 Gold DirectX 5.2
Windows 98 SE DirectX 6.1a
Windows 2000 DirectX 7.0
Windows Millennium Edition (Windows Me) DirectX 7.1
Windows XP DirectX 8.1

Posted by 노을삼킨별
,


초급개발자가 본 어이없는 프로젝트의 진행..

개발경력 1년이 조금넘는..개발자라고 말하기에는 스스로 아직은 부끄러워하는
신입개발자입니다.
컴공출신이긴 하나 졸업하고 전혀엉뚱한 일을 꽤 많은시간 하였고, 실제 학교에서도 공부를
거의 안한탓에 개발에 관한 지식은 전무한, 늦은 나이나마. 아 나도 '개발일을 하고싶다!'
의욕만 가득한 그런 사람입니다. (KLDP에는 개발관련자료훔쳐보기하고 가끔 아주 초보적인 질
문종종 올리곤 합니다. 고수님들이 바로 명쾌한 답변주실때 어찌나 행복하던지^^)

처음으로 들어간 회사의 개발팀이, 본연의 개발업무보다 고객시스템유지보수/관리등의
업무에 크게 치우쳐있어 못마땅하게 여기던중 여기저기 이력서를 넣다가 어렵사리
어떤기관의 개발팀에 입사할수있었습니다.
사내에는 기존 개발팀은 이미 존재하고 있고(주로 SI관련업무,거의다 외근을 나가십니다)
새로만들어진 개발팀에 새로운 인원으로 합류를 하게된것이죠.
면접당시 팀장님이 내가 해야할 업무를 알려주었을때, 하고싶은 분야에 하고싶은 일을
하게되어서 상당히 고무된상태였습니다.

프로젝트의 기간은 6개월, 인원은 고급1명(팀장),중급 2명(과장급,대리급) 이란거는
회사에 입사후 1주일후에 알았습니다. 당시 팀장은 중급중 1명을 본인(초급)으로 뽑았고
나머지 1명을 과장,대리급을으로 찾고있었지요. 저도 당시 사수없이 일을 할수없는 실력이란
것을 알고있기에 무조건 대리급이상으로 뽑으셔야합니다 하고 말했었습니다.
하지만 생각보다 사람 구하기가 무척 어렵다고 하더군요. 결국 중급인원을 못찾고 저와같은
신입이 1명 들어와 프로젝트를 시작하게 되었습니다.

여기서부터가 문제의 시작입니다.
자잘한 이야기는 하지 않겠습니다. 프로젝트중 자잘한 문제거리가 얼마나 많겠습니까?
가뜩이나 신입으로 들어온 개발인원이요. 그래도 프로젝트는 진행합니다.
코드는 C++로 진행한다고 하네요. 전회사에서 C만 만진탓에 당황스러웠지만
요즘엔 워낙 관련동강이 잘 되어있어서 공부하는게 크게 어렵진않더군요
(기본서를 벗어난 내용, 특히 디자인패턴 같은건, 뭐랄까.굉장히 난해하네요^^)

한달정도는 업무관련스터디로 시간을 보내고 한달후 본격적으로 코드를 만들기 시작합니다.
여기서부터가 조금 억지이긴하죠.
뭐 어쨋든 일단 코드를 만들어냅니다. 같이 새로들어온 신입(이하 옆친구)과 함께 어리숙하지만
조금씩 배워나가면서 코딩을 합니다. 그 친구가 벽돌을 만들면 전 그 벽돌로 건물을 짓는게
둘의 나눠진 업무였지요.

그친구, 벽돌..클래스를 못만듭니다. 자바를 했다고 들어온친구인데. 클래스를 모릅니다.
상속,포함관계..의 차이를 모릅니다. 좋습니다. 저도 몰랐고 여기 시작해서야 알기 시작했으니깐요.

그래도 일단 만듭니다. 설계 그런거 없습니다. 관련문서를 바탕으로 그것을 구현하는것인데.
일단 코드를 만들어야 합니다.
그래도 대강 벽돌 모양이 어떤지는 알아야 건물을 지을꺼 아닙니까?
대략적으로 디자인된 벽돌모양을...(당근, 동작안합니다) 상상을 하여서 아마 이런동작을..할꺼야.
하고 건물을 짖기시작합니다. 애당초 문서같은건 없습니다.

한 두세달 걸려 10층정도 지었습니다. 근데 벽돌 모양이 바뀌기 시작합니다.
이 친구 그래도 여전히 본인이 만든 벽돌. 설명못합니다.
클래스에 주석도 없고 본인설명도 없고, 걍 헤더파일, 라이브러리 딸랑입니다.
역시 상상의 나래를 펴서 건물을 짓습니다.
뭐 좋습니다. 문제는 저도 입장이 비슷한 신입이라 말없이일단 받아들이고 문제점 찾아낸다음에
지적해주고 다시 돌려받는식으로 업무를 진행했습니다.

한20층정도 지을때입니다. 이친구 벽돌이..아예 새로운 모양이 됐습니다.
솔직히 짜증은 대단히 많이 났지만, 그래도 조금씩 벽돌 모양을 하는거같아 반갑더군요.
그래서 20층 모조리 허물었습니다. 1층서부터 시작합니다

이미 이상황도 좀 웃기죠? 추상클래스? 그런거 없습니다. 클래스가 말도 없이, 주석도없이
한 뭉탱이가 날라옵니다. 만든 본인조차 이해를 못합니다. 설명을 못하는것이죠
주석을 달아달라고 해도 달지를 않습니다. 오히려 성질을 냅니다.
설명을 해달라면 황당하게 본인이만든 코드를 저보고 먼저 설명을 해보랍니다. 제 생각은 어떠냐구 물어봅니다. 황당.
더군다나 그 클래스의 메쏘드명조차 없어졌다 생겼다 수시로 바뀝니다.(이제와서야 이런게
콘크리트 클래스, 결합도가 너무 높은..이란걸 알았습니다. 하지만 팀장 지시로 계속 진행합니다.)
할말없습니다. 모르니깐 그럴수도 있죠.

다시 20층을 만들었습니다. 처음엔 무척 힘들었는데 두번째는 쉬워지더군요.
이제부터 진짜 문제가 시작합니다.
아예 기본적인 약속자체가 뒤흔들려 버립니다. 예를 들어 '코드내에서의 counter는 1부터
Index는 0부터 시작' 등의 약속내용이 바뀌어버립니다.
어느순간 그친구 클래스가 제동작을 안하나 했더니 이친구는 Index를 1부터 시작한걸로 바꿔버렸더군요
지적하면 화를 냅니다. '주석에 적어놓았다구! 왜 주석을 안보냐구!'
주석에 아무런 내용없습니다. 황당합니다만 참습니다. 제코드도 덕분에 그 기준을 맞추기위해
바뀌어 버립니다.
이친구 아예 코드 자체를 모릅니다. public과 private의 차이를 모릅니다.
new와 delete를 모릅니다. 이정도면 뭐 아실껍니다.

좋습니다. 전 이 프로젝트가 너무 맘에 들었고 꼭 하고싶었던 일이기에 사소한 감정싸움은
하기 싫었습니다. 그냥 참았지요(이게 나중에 굉장히 큰 화근이 되더군요)

하지만 이런일이 반복된다면 프로젝트가 산으로 가겠구나하는 걱정이 문득 들더군요.
팀장에게 제안을 했습니다.
'설계문서라던가 무언가의 기준이 정해져야합니다, 그렇지 않으면 이런일이 계속 반복될수있습니다'

팀장한테 혼났습니다.
팀장 : '장난하나? 넌 니 코드나 똑바로 만들기나해!'
황당했습니다. 그래서 데꾸했죠.
본인 : '팀장님, 기준이 없이 진행하는 지금 프로젝트 매우 위험합니다.
업무프로세스를 파악하기가 너무힘듭니다. 설계서같은것이 존재하는게 좋을듯 합니다.'
팀장 : '프로세스가 바로 코드다, 넌 코드를 만들어서 나한테 보고만 하면돼'

프로세스가..코드라..허..
....시키는 대로 했습니다. 팀장도 나름대로 무척 스트레스받겠지요. 회사에서 나름 중요한
프로젝트를 외부에 아웃소싱할것을 새로 만든 팀에게 주었는데 결과물은 제대로 안나오고있으니깐요.
일이 이상하게 진행되고있음을 알았지만.. 이런식으로 아옹다옹 4개월이 지났습니다.
중간에 회의석상에 팀장도 아닌 신입개발자가 오너이 하 간부들에게 너네 결과물이 대체 뭐냐?
뭐하고 있냐? 모 이런식으로 깨지는건 일상다반사이므로 얘기 안하겠습니다.

어쨋든 중간에 우리팀 모두가 박살이 나고 기간이 3개월 더 연장되었습니다.
계속~ 진행합니다.
벽돌에 새로운 기능이 추가됩니다. 만든 당사자는 역시 설명을 못합니다.
전 샘플코드를 요청합니다. 샘플코드를 못만드는지,안만드는지 안옵니다.
물어봅니다. 파라미터가 뭐고 리턴값이 무엇인지.
황당한 대답이 옵니다. 자기 소스코드를 디버깅 모드로 돌아가는걸 보여줍니다.
그랬더니 '자. 동작하죠?' 그리고 화를 냅니다.

그래서 다시 묻습니다. "내가 그 내용을 알필요는 없고 파라미터와 리턴값만 확실히 명시하라!"
대답못합니다. 다시 물으면 화를 냅니다. 아까 보여주지 않았냐구..
심지어는 컴파일 에라가 나오는 코드까지 넘어옵니다. 테스트라는건 애당초 기대도 할수없습니다.

이미 말이 안통하는 상황입니다.이 친구 둘러대기 바쁩니다.
저도 이쯤이면 화가 납니다만, 그래도 또 참아봅니다.

그리고 이친구 클래스를 제가 직접 테스트/검증합니다. 그리고 여기저기 문제점 찾아내면서
며칠을 보내고 그 사항을 지적해줍니다. 이건 모르겠다고 하면 저도 잘모르니 여기저기 찾아서
남의 소스긁어내거나 해서 직접 기능 구현하고 가르쳐주고 넘겨주고 그럽니다.
일단 제대로된 벽돌이 만들어져야 건물을 지을꺼 아닙니까?
그리고 이친구 바로 칼퇴근합니다. 전 제업무 남아서 야근하는수밖에요.

그리고 전 회의때 팀장한테 혼이 납니다. '넌 대체 지금까지 뭐를 했냐?'
그친구를 물끄러미 쳐다봅니다. 본척도 안합니다. 하핫.이쯤되면 웃음이 나옵니다.
무슨 드라마에서나 나올듯한 상황이네요.
뭐 이정도면 좋습니다.

프로젝트 중간 발표가 있었습니다. 오너이하 간부들이 모두 참석하는 자리에서 우리팀이
하고있는걸 정확히 파악하여야 한답니다.
이친구가 나이가 저보다 한살많으니. 팀장이 니가 선임해서 문서만들고
발표잘해라 이러더군요. 그친구 한 1주간 무언가 하는데 낑낑거리더군요. 내용도 보여주지 않습니다.
근데 발표를 코앞에 앞두고 결과물이 나오지않자 제가 너무 답답해서 팀장한테 직접 하겠다고 했습니다.

기존에 만든거 달라고 했더니 내용이 하나도 없습니다.
'허걱..업무자체를 파악을 못하고' 있더군요. 세상에 벽돌을 만드는 사람이, 그 벽돌이
무슨역할을 할지,무슨기능을 가져야하는지, 4개월동안 본 친구가 옆에서 곁눈질로 본 저보다
모르는겁니다.

답답하지만 급한와중에 일단 자료부터 만들었습니다(뭐 90%가 copy&paste)
도와달라고 했더니 바빠서 안된답니다. 당연히 바쁘겠지요, 업무파악을 못하고있는데..
ppt 20장정도? 반나절만에 휘리릭 만들었더니 발표를 같이 하겠답니다.
그래서 황당했죠. 아니 자료는 내가 만들었는데 왜 발표를 같이 하냐?
이친구 책상을 치고 소리지르며 나갑니다. 그래서 들어와서 하는말이 '같은 팀원인데 왜 혼자 다 하려그러냐?'
허..거참. 아니 발표야 둘중 아무나 하면 돼지 10분이면 할텐데, 그럼 당신이 할래?
그러니깐 입을 다뭅니다. 혼자서 알아서 잘하랍니다.

발표를 시작합니다.
그래도 내용전달은 오너+이하 간부들에게 잘 전달되었는지 고생많다고 칭찬받습니다.
이어서 바로 Q&A 시간입니다.

오너가 바로 옆친구한테 지적합니다.
오너: "자넨 모했나?"
옆친구 : "아 이번발표는 저친구가 말빨이 좋아서 발표를 하는거구 내용은 같이 만들었습니다'
나 : 황당..침묵.
오너: '너네 정해진 기간내에 프로젝트를 완수할수있는거지?'
나 : '정확히 표현한다면 지금 저희 작업속도로는 목표된 기일내에 맞추는것은 힘들듯합니다.'
오너: '야 그게 말이돼냐? 니들 기간알잔아?'
옆친구 정색을하며..'사장님 최선을 다해서 하고있습니다. 밤을 새서라도 기어코 만들어내겠습니다'
나 : 헐 ㅡ.ㅡ;

안믿겨지시죠? 저도 안믿겨집니다만 보통 이런식입니다.

매번 회의가 이러니 전 까다로운 녀석이 되버렸구, 옆친구는 성실한 친구가 되어버렸네요.
뭐 이것도 좋습니다. 전 이 프로젝트가 최우선이라 생각하고 올바른 결과물만 내면 된다고 생각하니깐요.
(뭐 이것도 혼자만의 착각이라는걸 후에야 알았습니다)

여하튼 이런식으로 또 시간이 흘러갑니다.
3개월이 늘어났다고 하나 도저히 그 기일을 맞출수 없을것같아서 팀장한테 또 제안해봅니다.
더 늦기전에 설계문서를 만들자구요. 또 혼납니다.

그리고 같은 일은 계속 일어납니다. 그나마아 이제는 클래스에 주석이 달려서 넘어오더라구요.
난 테스트를 하고넘기라고 제안합니다. 화를 냅니다. 주석에 다 있지 않느냐.
테스트가 다 끝났답니다. 그리고 직접 내가 테스트 하면 아예 동작을 안하는게 태반입니다.

도저히 안되겠다 싶어, 한바탕 난리를 친후..

팀장한테 말했습니다. 못참겠다. 저친구 저렇게 일하는거 바꿔야한다. 그렇지 않으면 프로젝트가 진행이 안된다.
그 친구 박살이 납니다. 공개적으로요.
그리고 팀장은 저에게 조용히 말하더군요.
'이미 너네둘이 프로젝트 중반이라 둘중 아무도 그만둘수 없다. 니가 참아라'

휴우. 하지만 바로 다음날부터 또 악순환의 반복입니다. 저한테 독한감정을 품은건지, 아예 팀장이 나가면 말을 안합니다.
벽돌이요? 이젠 의도적인지 아주 이상한 걸 주고 물먹이려 합니다. 세상에 이리 유치한 행동을 하다니..
주위에 말하기 조차 부끄러울정도입니다.
팀장들어오면 그래도 업무적인 얘기를 합니다. 쥐꼬리만한 목소리로. 아 그게 그건 그거고...어쩌구 저쩌구, 했던말 또하고
바쁘다고 나중에 얘기하자고 그럽니다.
팀장나가면 바로 소리칩니다. 저번에 말하지 않았냐구! 이해못하냐구!

이쯤되면 화도 안납니다. 기가막힐뿐이죠 이외에도 황당한 일이 많으나 너무 유치한거같아 그만하겠습니다.

휴. 저도 그래도 나름 많이 스트레스 받았나 보네요. 쓰다보니 이런 장문이..

결론입니다.

대단히 화가 많이 나있습니다. 인내심의 한계를 몇번 오르락내리락 반복하니 거의 제정신이 아닌것같습니다.
일단 가장먼저, 능력부족의 제스스로에게 화가 나고 부끄럽습니다. 제가 업무파악을 제대로 못하고 있고 변명이나마 지금 주어진
일은 능력밖의 일인것같습니다.(사수없이 혼자 설계,코딩,검증.. 너무 어렵네요. 솔직히 잘 모르겠습니다.)
나머지 절반은 일이 이지경이 되도록 방관하고 있는 팀장탓을 하고싶습니다.

좀더 정확하게 말하자면 옆 두사람에게 이젠 더이상 말이 아닌 주먹이 날아갈정도로 흥분된 상태입니다.(문제죠..이정도면)
이상태로 일이 되겠습니까? 어떻게 더 참으면서 일해볼까요? 다른분들은 이런상황에서 잘 일하고 그러고 계신지 궁금하네요?

무척이나 답답합니다.. 이거원.. 말도안되는 일을 해야하나 사직서를 쓰고 빨리 다른곳을 찾아야하나?
프로젝트 중반에 나가는 어이없는 실수는 하긴싫지만.. 이젠 참는 정도의 수준은 넘었다고 생각합니다.

뭐 나름 흥분해서 투덜투덜 해보았습니다. ㅡ.ㅜ

nike984의 그림

회사에 탄원 넣어서 다른분 짤라버려요 -_-a

jedi의 그림

그쪽 분야만 그런

그쪽 분야만 그런 것은 아닙니다.

제가 일하는 분야도 그렇고요.

아마 한국의 모든 산업분야가 "당장 하루만 어떻게 모면하자... "로 알고 있습니다.

그걸 바꾸려면 혁명을.....

+++ 여기부터는 서명입니다. +++
국가 기구의 존속을 위한 최소한의 세금만을 내고, 전체 인민들이 균등한 삶을
영위할 수 있는 착취가 없는 혁명의 그날은 언제나 올 것인가!
-- 조정래, <태백산맥> 중에서, 1986년

맞습니다.

안녕하세요. 초보 리눅서입니다
잘부탁해요 ^^

저역시..다른분야도 제가받는정도이상의 스트레스를 받을것이라 냉정하게 생각해봅니다.
영업으로 일하는 제친구는 오너가 화나면 사무실에 재떨이가 날라다닌답니다.
역시 남의 돈을 받는 것은 결코 쉬운것이 아니겠죠.

아쉬운건. IT에서..개발프로젝트가..이모냥으로 진행되다니..다른 개발프로젝트도..정말 이지경이면..난감하네요.

저도 그런 경험을 지금 하고 있습니다..

그 사람들 엉터리로 해 놓고 기한 못 맞춘 상태에서 칼퇴근에 주말에 집에 쉴때..
제가 그 사람들 표준 스팩에 코드까지 분석끝내고..
그 사람들 부분까지 구현하고 있네요..

저의 황당한 경험도 이야기 해드려야겠네요

제가 다니던 회사의 상사가 경력 6년짜리였는데 어느날 나갔죠.

그리고 그 상사가 짠 코드를 두번째로 본 사람이
'어떤 놈이 이렇게 개념없이 만들었냐? 경력 6개월짜리밖에 안되는 놈이구먼' 하더군요.
참고로 두번째 본 사람은 경력이 4년 정도 되었고요.
제가 봐도 웃깁니다. 메소드 하나에 프로그램의 모든 기능이 다 들어가 있더군요 -_-; (참고로 mfc였음)

사장이 전화했습니다.
그러더니 오는 대답이 '내가 그동안 볼 때는 아무 이상 없었는데 왜 이제와서 딴소리냐' 합니다.
저한테도 '니가 잘짜세요' 그러고,
좀 손봐주겠다는거는 말은 기대하지도 않습니다. 어차피 나가버린 사람이니
근데 미안하다는 얘기 한마디도 안하더군요.

그 사람 저랑 같이 다녔을때는 컴퓨터 조립할때 나사 하나 빠진것까지도 뭐라고 혼내는 사람이었는데
지금 와서 보니 굉장히 괘씸하네요.

p.s.

자바 했다면서 클래스를 모른다면 그건 경력 구라친거 같군요.
자바 강좌 보면 클래스 얘기 하나도 안빠지던데. C++보다도 클래스개념이 더 중요한게 자바인데

Written By the Black Knight of Destruction

JuEUS-U의 그림

어떤 책에서는

어떤 책에서는 클래스의 개념을
"프로그램 하나에 한개" 정도로 설명했더군요....

즉, 어떤 사람은 Java를 써서 C처럼 코딩할수있다, 입니다...

난잡하게 나오는 그런 책들은 제발 사라져야 할텐데 말이죠...

superwtk의 그림

헉-_- 거의 독극물

헉-_- 거의 독극물 수준이군요

--------------------------------------------------------------------------------
http://blog.superwtk.com

프로젝트를

프로젝트를 진행하다가 보면 전혀 예상치 못한 적들이 생기게 됩니다.

이렇게 생기는 적들이 경쟁회사가 되면 좋겠지만,
대부분의 경우 고객, 영업, 팀장, 동료, 심지어는 부하직원까지도 적으로 변하게 됩니다.

밉죠.. 얼굴만 봐도 화가 납니다.
이상하죠? 같은 목표를 가지고, 같이 일을 하는데도
전혀 다른 일을 하는 타부서 사람들이 오히려 편하고 친하게 느껴질 정도니까요.

제 생각에는 회사생활에서 가장 중요한 것은
개발 스킬보다는 사람을 다루는 방법인것 같습니다.

싫은 사람, 나와 맞지 않는 사람...
이런 사람들은 잘 구슬려서 내가 원하는 방향으로 이끌어가는 것...
이것이 회사생활에서 가장 필요한 능력이 아닐까 싶습니다.

팀장, 동료, 부하직원과 맞지 않는다고 일이 늦어졌다는 것은
핑계일 뿐이죠...(절대 비난하는 것은 아닙니다.)

동료와 술이라도 한잔하면서 어떻게든 풀어가셔야지요...
잘 해결하시면, 최고의 스킬을 얻으실 것 같습니다.
부디 성공하시길 빕니다.
(저도 항상 같은 고민을 하게 됩니다. ㅜㅜ);

글 쓰신 내용을 보니

글 쓰신 내용을 보니 경력이 꽤 된 분 처럼 보이네요.

사실 개발쪽 일을 하다보면 적지 않은 개발자분들이 스킬 & 테크닉을 탐닉하는 경우가 아주 많죠. 그리고 그것이 자신의 가장 큰 의미로 생각하고 있구요. 물론 그 자체가 나쁘다고 생각하지는 않습니다.

언급하신 것 처럼, 일을 하다보면 실제로 웃음밖에 나오지 않는 코드를 생성하는 공부를 게을리 한 개발자들이 있습니다. 하지만 정작 본인은 무엇이 잘못되었는지 모릅니다. 그 이유는 자신이 알고 있는 최대한의 일을 했기 때문입니다. 젊은 날 공부를 게을리 하지 않고 열심히 했던 개발자들의 눈에는 그 것이 얼마나 한심한 것인지 다 보이지만 알고 있는 내용이 한심한 수준의 개발자는 그것이 보이지 않을 뿐입니다.

너무 그런 사람들을 몰아세우기 보다는 조금씩 조금씩 나은 스킬을 보여주고 그렇게 하도록 독려해서 조금이라도 내가 귀가하는 시간을 짧게 하도록 만드는 것이 더 현명하지 않을까 합니다.

그런데 경험상으로 코딩 실력이 제대로 되어있지 않은 개발자는 다른 사람들과 co-work 하는 것도 물론 제대로 하지 못했습니다. 그러면서도 원하는 것은 엄청 많죠. 왜냐면 스스로도 살아남아야 하니까요. 그 기본적인 생존본능을 당연하게 받아주지는 못하지만 어느정도 이해는 해 주어야 했습니다. 그래야 어떻게든 구슬려서 부려먹을(?) 수 있었으니까요.

개발자에서 긍정적으로 매니저로 가는 길이 바로 이런 것들을 이해하는 것이라고 생각합니다.

ydhoney의 그림

..

+1 
 
====================여기부터 식은어치====================
안녕하세요. 저는 야동 초등학교 2학년 6반 11번입니다!! 제 컴퓨터에 리눅스를 깔아보고 싶습니다. 리눅스라는건 어제 처음 들어 보았습니다.
리눅스에서도 카트라이더는 되겠지요? 설마 안되나요? 안되면 왜 쓰나요? =3=33 리눅스에서는 카트라이더 캐릭터 머리가 너무 커서 못받아들이나요?

gogisnim의 그림

작년 초 3년짜리

작년 초 3년짜리 프로젝트의 마지막 3년째에 투입되었습니다.

기존에 여자개발자가 한명있었는데 그 사람이랑 같이 개발하는 거였죠.
나보다 1년 먼저 투입되었는데 제가 오기까지 결과물이 없는겁니다
꼴랑 DB 명세서랑 어이없이 만든 클래스다이그램이 전부였죠(이것마저도 나중에 다 뜯어 고쳤죠)
저는 어떻게어떻게 제가 맡은 부분은 마무리가 되었는데 그때까지도 별다른 결과물이 안나와서 좀 어이가 없더군요.

성격은 지랄같은게 자존심은 있어서 물어보지도 않고 본인 혼자서만 끙끙거리는 그런 스타일..
나중에 보니 업무파악 자체가 안되어 있더라구요.
팀장한테 따졌죠. 왜 저런사람을 쓰냐고?
팀장도 포기한 그런 상태더군요.. 다행히 프로젝트가 큰 편이라서 인원도 많고 어떻게 어떻게 땜방식으로 무마했습니다.

결국은 나가더군요.
실력없고, 꼴에 자존심은 있고 성격 까칠한 개발자의 전형을 보았습니다.

picpic76 님 힘드시겠네요.
제가 보기엔 옆친구도 물론 잘못이지만 1차적으로 팀장의 잘못입니다.
그러한 인력은 뽑지도 말아야 하고 설사 뽑았더라도 그러한 문제가 있는 것을 알았으면 짜르던지 다른 개발자를 투입하던지 조치를 취해야 합니다.
제가 보기엔 그 프로젝트 100% 실패할거 같습니다.
picpic76님도 처신을 잘하셔야 할거 같구요.. 우울하네요 ㅠㅠ
좋은 결과 있으시길 바랍니다.

성격이 좋아야

성격이 좋아야 합니다. 주석을 안달았다고 마치 큰 잘못을 한 마냥 사장님앞에서 새로 들어온 사람에게 욕을 먹은적이 있는데 그 부분은 주석이 필요없는 부분이었습니다. 주석의 중요성을 교과서적으로 설명하고 얼마나 큰 잘못을 했는지 사장님앞에서 오버를 하는데.. 저는 미안하다.. 바쁘다보니 주석을 못달았다라고 했습니다. 많이 바빴거든요. 사장님이 더 잘아셔서 이해하고 넘어갔습니다. 얼마 안지나서 그 사람은 프로그래밍을 못하는 사람으로 판명되어서 쫓겨났습니다. 황당하더군요.

이런 부류도 있는데.. 사장님이 간단하지않은 일을 한사람에게 맡겼습니다. 이 사람은 좋은 대학나와서 평소 다양한 분야에대해 해박한 지식을 가지고 있으며 정말 많이 알고있는듯한, 의심의 여지가 없었습니다. 사장님도 믿고 맡겼는데 1개월이 지나고 2개월이 지날쯤에 진행사항을 모두가 궁금해 했습니다. 왜냐하면 뭘 하는지 아무에게도 말하지 않았기 때문에.. 그저 좀 안되는 부분이 있다, 어려운 말 써가며 애기하는데 그러냐며.. 열심히 해라고 하고 다시 3개월이 지나고 4개월이 지났는데 사장님은 조바심이 생기죠. 저희들은 의심을 하는거고.. 뚜겅을 좀 열어보자고 했는데 1개월만 더 달라고 해서 줬는데 5개월이 지나고 결국 6개월째 되던 날에 못만들었다며 모든걸 책임지겠다며 사표쓰고 나갔습니다. 사장님은 너무 화가나서 그 사람 pc에 작업물을 보자해서 보여줬더니 파워포인트 몇장.. 쓰다만듯한 워드문서.. 테스트용으로 만든듯한 예제 코드 몇개.. 결국 사장님 뚜겅이 열려버렸지요. 같은 사원들도 그 사람 욕 많이하고... 그런데 저는 달랐습니다. 그사람.. 반년동안 마음고생 정말 심했겠다 라는 생각이 들더군요. 불쌍했습니다.

atie의 그림

대놓고 맞부닥치지 말고...

버전 관리 싫다고 하는 상사 없습니다. cvs나 svn을 쓰십시오. 그러면 저런 경우에도 대처할 수단이 되고 커밋 로그만 봐도 무슨 생각으로 프로그램을 짜는지 볼 수도 있습니다. 물론 본인의 것도...
----
I paint objects as I think them, not as I see them.
Ubuntu Edgy user / Ubuntu KoreanTeam

codebank의 그림

원문의 글 내용을

원문의 글 내용을 읽어보니 cvs, svn을 쓸 정도도 안되는 것 같습니다.
만일 그정도로 소스관리를 한다고하면 원문 같은 글은 나오지도 않았을 거라고 생각합니다.
그리고 만일 사용하다고 하더라도 개발자가 커밋 로그도 '...'정도만 남길 것 같다는
생각이 드네요. :-)
------------------------------
좋은 하루 되세요.

atie의 그림

예. 꼭 저 프로젝트가

예. 꼭 저 프로젝트가 아니더라도 후에 다른 프로젝트도 하실테니... 그 때는 도움이 될 겁니다. ^^;;

그리고, 둘이서 하는 일이라면, 화이트보드에 그리는 것은 같이 그리고 코딩은 혼자서 하는 편이 일 진행이 빠르겠지요. ㅎㅎ
----
I paint objects as I think them, not as I see them.
Ubuntu Edgy user / Ubuntu KoreanTeam

분석설계없이 구현이라...

분석,설계없이 구현이라...

과장 조금 보태면 분석,설계없이 구현하고 계시는군요...

감리할때 티나지 않나요? ㅎㅎㅎ

"힘내세요!!" 라는 말 밖에 드릴말이 없네요..

공학에서 가장

공학에서 가장 필요한 것중에 하나가 커뮤니케이션입니다.
실무에서 말 안통하면 실력 유무를 떠나 같이 일하기가 힘듭니다..
전 개념없는 동료보다 관리자에 문제가 있다고 생각 드네요; 실력이나 개념은 어느날 깨달음을 얻으면 자라나기 마련이지만 -.-
대화를 자꾸 시도해 보세요. 같이 일할때 감정 세워서 좋은적은 없었습니다 -.-;
용서하세요; 탓도 마세요; 똘레랑스~

저 역시 커뮤니케이션이 문제라고 보입니다.

화난 사정도 이해하고 어쩔 수 없는 환경도 이해가 됩니다.
하지만 그런 극한 상황까지 가도록 된 것은 잘못한 팀원도 잘못이나 더 큰 책임은 관리자의 문제입니다. 상황 통제를 못한 탓이죠.
더우기 좀 더 상대방과 대화가 많이하고 명확하게 이야기를 나눴다면 적어도 문제점 자체가 무엇인지 최악의 상황 전에 어느정도 도출이 되지 않았을까 하는 아쉬움이 남습니다.
비록 상대방은 속으로 인정하지 못하더라도 들어난 결과물을 내밀었다면 겉으로 어느 정도 수긍을 했을 것 같군요.

맞짱 뜨세요.

계급장 떼고 맞짱 뜨세요.
이기는 사람 뜻대로 가는겁니다.

warpdory의 그림

꼭 소프트웨어 개발만이 아니더라도...

문서화 되지 않은 건 하지 않은 것이라고 보고 있습니다.
소프트웨어 개발뿐만이 아니라 다른 것 모든 것을요.

사장이 팀장이든 부장에게든 어떤 일을 지시하고, 팀/부장은 그것을 과장이든 대리든 사원이든 ... 쭉 업무분장을 하게 되죠. 그리고 그것을 모두 문서화 합니다.

그리고, 그 문서화 된 업무분장에 따라서 일을 진행하죠. 그리고 진행하는 모든 것은 또한 문서화시켜서 남깁니다. 그것이 협조전 형태로 되어 있든, 시행문이든 뭐든 ... 업무 지시, 업무 보고 모든 것을 문서화 하여 남겨야 합니다. 구두로 "여기까지 했어요." .... 이건 안됩니다.

그리고 업무가 끝나면(전체를 말할 수도 있고, 어떤 한 세션이나 파트가 될 수도 있습니다.) 그때마다 역시나 문서화 시킵니다.

문서화에 익숙지 않다면 시간낭비라고 볼 수도 있겠지만, 처음에 제대로 문서화시켜서 하게 되면 나중에는 그게 습관이 되어버립니다.

물론, 문서화에만 매달려서 일은 안하고 워드프로세서나 파워포인트만 붙잡고 있어서는 안되겠죠. - 가끔 이런 사람들이 .. 있죠 ... 그럴 때 쓰는 방법은 .. 문서화 작업은 모두 이사람에게 떠 넘겨 버리는 방법도 있습니다.

이렇게 해두면 나중에 '너 일안하고 뭐 했어' 라거나 ... 비슷한 일이 발생하는 것을 미리 방지할 수 있고, 또 설사 그런 일이 발생하더라도 최소한 책임을 뒤집어 쓰는 것은 피할 수 있습니다.

저희 회사의 경우는 보고서를 5단계로 관리합니다. 모든 일지는 회사의 KMS(Knowledge Management System (철자가 맞나...))에 자동으로 등록됩니다. - 아예 회사 인트라넷에 업무지시, 업무보고 가 따로 있습니다.

DPR - Daily Process Report ; 그냥 단순한 업무일지 정도라고 보시면 됩니다. 퇴근하기 10분전에 팀장에게 보내야 합니다. 일정횟수 이상 빼먹으면 기획팀에서 전화 옵니다. ...
WPR - Weekly ... ; 일주일 동안 진행한 상황을 적습니다. 보통 파워포인트 1,2 장 정도 됩니다. 일주일치 DPR 을 쭉 묶어서 첨부하여 제출합니다. 주간 회의할 때 이거 가지고 프로젝트든 어떤 과제든 일이든 ... 진행상황을 체크합니다.
MPR - Monthly ... ; WPR 을 묶어서 매월 2일에 지난달의 상황과 이번달에 할 일을 체크하고 보완하며 계획 수정이 필요한 것이 있다면 고치고 .. 합니다. 여기까지는 각 부서 단위로 움직입니다.
QPR - Quarter ... ; 1/4분기, 2/4분기, 3/4 분기, 4/4 분기 .. 각 분기별로 일의 진행상황을 체크합니다. QPR 부터는 회사 전체가 모여서 체크 합니다. 팀장과 각 팀의 PL 급이나 선임 과장 정도가 같이 회의에 참가해서 각 팀의 일이 어떤지, 계획 대비해서 진행상황은 어떤지, 그리고 그 구체적인 수치까지 들어가야 합니다. 단순히 일정이 늦어지고 있다. 가 아니라 일정상 3월 4일에 끝나야 하는 일인데, 이러 저러한 사정으로 인하여 4월 4일까지 끝낼 수 있을 것으로 예상되며 이것으로 인하여 생기는 영향은 이러 저러한 것이 있을 것으로 여겨지며, 그것은 이러저러하게 하여 보완할 수 있다. ... 뭐 이런 내용입니다.
YPR - Yearly ... ; 1년치를 모은 거죠. 이것으로 인사평가 합니다. 즉, DPR 부터 시작해서 쭉 써온 것을 가지고 인사평가가 쌓여서 이루어지죠. 문서화가 안되어 있다면 일은 했더라도 근거가 없으므로 인사평가에서 좋은 소리 못 듣습니다.

이렇게 5단계로 되어 있고, 각 프로젝트는 각 프로젝트 별로 또 정해져 있는 규정에 따라서 문서화가 됩니다. 그래서 KMS 를 뒤져보면 5,6 년전에 퇴사한 사람이 어떤 실험을 어떤 조건에서 해서 어떤 결과가 나왔다.. 까지도 찾아볼 수 있습니다. 그래서 했던 삽질을 또 하는 것을 미연에 방지하는 효과도 있습니다.

이렇게 문서화 하는 게 아예 시스템화 되어 있습니다. 즉, 김팀장이 강과장에게 A 를 시켜놓고서 나중에 '왜 이거 했냐 내가 시킨 건 B 다.' 라고 우겨댄다거나, 반대로 강과장이 김팀장에게 '전번에 보고 했지 않느냐' 라고 우기는 건 가능하지만, 설득력이 전혀 없습니다. 'KMS 에 등록돼 있어 ?' 라고 하면 거기서 결정됩니다. KMS 에 등록되어 있으면 그것을 안 읽은 사람 잘못입니다. '몰랐는데...' 이거 안 통합니다.

물론, 이렇게 문서화만 시킨다고 끝나는 건 아닙니다. 제일 앞에서 얘기했던 업무분장 한다고 했는데, 그때 참 신나게들 치고 박습니다. 예를 들어서 K 프로젝트의 범위는 우리팀의 소관을 벗어나니깐 옆팀의 누구까지 끌어들여야 한다.. 라든가 ... 등등. 하지만, 일단 결정되면 쭉 .. 업무분장을 합니다.
예를 들어서, 플라즈마 해석은 warpdory 가, 열처리 조건은 박과장이, 압력 및 time profile 은 유대리가, PR 및 ER 조건은 또 누가 잡고 ... 이런 식으로 쭉 .. 업무분장하고 이걸 전부 문서화해서 시스템에 남깁니다. 그리고 각각의 진행상황을 역시 쭉 ... KMS 에 등록시킵니다. 그러면 굳이 서로 바쁘고 해서 회의에 못 들어오거나 출장을 나가 있더라도 ... 진행상황을 알 수 있고, 만일 일의 방향이 조금 이상하다 싶거나, 괜히 삽질하고 있다.. (전공분야가 다 다르므로 일을 하다보면 가끔 다른 전공분야를 해야 하거든요.) 느끼면 조언을 구하거나 조언을 해줄 수도 있습니다.

이렇게 하는데.. 3년 걸렸다더군요... 회사 문화 바꾸는 게 힘들다고 합니다. 특히, 차장 이상급에서 이걸 받아들이는데.. 힘들어 했다더군요. 기존처럼 '말'로 지시하고 ... 이런 것에 익숙하다가 문서로 작성해서 지시하려니... 힘들었지만, 회장이 아예 못을 박아버리니 ... 그냥 다들 따라왔다고 하더군요.

---------
귓가에 햇살을 받으며 석양까지 행복한 여행을...
웃으며 떠나갔던 것처럼 미소를 띠고 돌아와 마침내 평안하기를...
- 엘프의 인사, 드래곤 라자, 이영도

즐겁게 놀아보자.
http://akpil.egloos.com

와우~ 너무 좋은 경험담~ 감사~

저도 가끔 사내의 정보 흐름의 단절 때문에 많은 생각을 하고 있었는데,

어떤 문제의 발생부터 해결과정을 찬찬히 읽다보니,

그간의 상황이 좌르륵 머리속에 지나가는 느낌입니다.

형상관리 서버를 통한 소스 관리(CVS나 SVN등)와

KMS와 같은 history가 남는 서버를 통한 업무 관리가 되면,

지금보다 더 많이 효율적이 될 것 같네요~

태터툴즈 사이트를 보면, SVN으로 소스 관리하고, issue관리자로 일을 관리하고,

Wiki로 명세서나 Changelog를 관리하는 것을 봅니다.

좋은 프로젝트 관리 사례가 될 것 같네요.

Sheep의 그림

와....

악필님의 내공이 엿보이는 글이네요...

--------
From Buenos Aires, Argentina
No sere feliz pero tengo computadora.... jaja
닥치고 Ubuntu!!!!!
To Serve My Lord Jesus
blog: http://sheep.tistory.com (블로그 주소 바꼈습니다)

warpdory 씀:

warpdory 씀:
모든 일지는 회사의 KMS(Knowledge Management System (철자가 맞나...))에 자동으로 등록됩니다.

KMS (Knowledge Management System) ; 지식관리 시스템 ※ 출처 : 텀즈 에서...

철자가 맞네요. =)

warpdory 씀:
제일 앞에서 얘기했던 업무분장 한다고 했는데,

근데 여기서 분장이 분장( 分掌 ) 맞나요?

warpdory의 그림

한자가 그거 맞습니다.

- 한자를 한글로 바꿔주는 글꼴을 쓰고 있어서 왜 한글을 쓰고 괄호치고 또 한글을 쓰셨나 했습니다. -_-

---------
귓가에 햇살을 받으며 석양까지 행복한 여행을...
웃으며 떠나갔던 것처럼 미소를 띠고 돌아와 마침내 평안하기를...
- 엘프의 인사, 드래곤 라자, 이영도

즐겁게 놀아보자.
http://akpil.egloos.com

문서화 동감합니다.

문서화 동감합니다. 최소한 어떻게 돌아간다는 전체적인 흐름도 정도는 있어야 합니다.

그것도 없이 주먹구구식으로 개발한다면 모래성이 될게 뻔합니다.

윗글 보니까 공통적인 표준도 없고 주먹구구식으로 개발이 되는거 같아 안타깝습니다.

가장 좋은 방법은 술한잔하면서 진솔하게 대화나눠 보는것도 좋을듯 하네요.

커뮤니케이션이 안 통하면 절을 나오시는게 좋을듯 합니다.

Sheep의 그림

Death March....

http://en.wikipedia.org/wiki/Death_march_(software_development)

the project is doomed....

글쓴분 진짜 답답하시겠어요..

--------
From Buenos Aires, Argentina
No sere feliz pero tengo computadora.... jaja
닥치고 Ubuntu!!!!!
To Serve My Lord Jesus
blog: http://sheep.tistory.com (블로그 주소 바꼈습니다)

현재 Team의 성숙도가 얼마일까요?

The Joel Test
====================================================================
1. Source Control(소스 컨트롤)을 사용하십니까?
2. 한번에 빌드를 만들어낼 수 있습니까?
3. daily build(일별 빌드)를 만드십니까?
4. 버그 데이타베이스를 가지고 있습니까?
5. 새로운 코드를 작성하기 전에 버그들을 잡습니까?
6. up-to-date(최신) 스케줄을 가지고 있습니까?
7. spec(설계서)를 가지고 있습니까?
8. 프로그래머들이 조용한 작업환경을 가지고 있습니까?
9. 돈이 허락하는 한도내의 최고의 툴들을 사용하고 있습니까?
10. 테스터들을 고용하고 있습니까?
11. 신입사원들은 면접때 코드를 직접 짜는 실기시험을 봅니까?
12. hallway usability testing(무작위 사용성 테스팅)을 하십니까?
====================================================================

위의 12가지에서 몇개나 되고 있나요? 아닌 팀이면 이런 방식으로
일해가도록 설득하십시오. 당근 자기 자신부터 이런 식으로 해야지요.

하지만 안된다면? 나가야 합니다. 그래야 같이 안망합니다. 물론 9점
이상 되도 짱나는 일 많습니다. 하지만 이게 지켜진다면 최소한 기본은
갈 수 있습니다. 화띵입니다. ^^

http://www.devjob.co.kr/

1day1의 그림

시스템의

시스템의 문제입니다.

팀장, 팀원, 동료. 사장, 투자자. 모두 한가지 목표를 가지고 있습니다.
'프로젝트의 성공'

서로가 적이되면 안됩니다.
프로젝트가 잘 안된다면, 시스템에 문제가 있는지 살펴봐야 합니다.

소스버전관리(svn,cvs) , 문서관리(wiki ..) 정도만 도입해도 해결되는 문제 프로젝트들이 많이 있습니다.

시스템을 점검해보세요.


F/OSS 가 함께하길.. (F/OSS서포터즈 : FOSS/Supporters, FOSS/Supporters/Group)
- 추천 프로젝트 : 추천하기 힘드시나요? 추천 꾹 눌러주세요! -

정말

정말 엄청나군요...

제가 기업 업무용 프로그램 만드는 회사 다닐 때는 우리 회사가 제일 주먹구구인줄 알았는데, 그보다 더 한 곳이 많군요...

적어도 우리 회사는 프로젝트 시작할 때, 명세서나 DB SPEC 같은 건 확실하게 다 많들고 시작했었거든요...

물론, 시작은 괜찮았지만, 중간 중간에 엄청나게 많은 수정이 가해졌고 그 수정에 대한 문서화가 제대로 이루어지지 않아서 결국은 싸움도 많이 하고 기간도 많이 늘었었죠...

그런데, 처음부터 문서화가 되지 않았으면 왜 그걸 짚고 넘어가지 않으셨나 싶습니다...

물론, 팀장한테 이야기를 하셨다고 했지만, 좀 약했던 거 같습니다... 그런 건 아주 팀장하고 틀어질 각오를 하고 해야 하는 얘기가 아닐까 합니다...

머... 제가 성격이 까칠해서 그런 것일 지는 몰라도 회사 다니는 3년 동안 정말 엄청 많이 싸웠습니다...

그리고 의사 소통에 문제가 있으면 참거나 하지 않고 회의 시간에 반드시 얘기했고 어떤 문서화된 결과물이 없으면 아예 일을 진행하지 않았습니다...

그렇게 진행해도 결국은 기간이 연장되고 문제가 많이 발생하더라구요...

솔직이 제 생각에 설계에 문제가 있는 프로젝트는 정상적인 프로젝트라고 봅니다... 그런데, 구현체에 문제가 많다면 그건 정말 기본의 문제라고 보거든요... 설계를 반영하는 구현체를 못 만드는 회사라면 아주 심각한 문제인거죠...

계속 그런 문제가 있을 경우에는 그 회사 그만 두는 게 더 좋을 거라고 봅니다...

언제까지 몸고생 마음고생 하시렵니까...

cvs/svn을 사용하지 않는 회사들이 많은가요?

저는 입사해서 가장 처음 배운게 vss (Visual Source Safe)사용법이었고, 두번째로 할당받은 계정이 vss계정이었는데... (첫번째는 회사 메일) vss는 MS에서 나온 형상관리 툴입니다. 아마 지금은 별로 사용되지 않을겁니다.

cvs/svn에서 개발이력 관리만 되더라도 위와같은 최악의 상황은 피할 수 있으리라 생각됩니다만...

(누가 어떤 일을 얼마나 했는지, 어디서 어떤 문제가 왜 발생했는지가 파악이 되지요)

개발이던, 이력 관리던 결국 사람이 하는 것이기 때문에 cvs/svn에 모든걸 해결해줄 수는 없지만, 위와 같은 문제점들을 많이 예방하고 해결할 수 있는 것은 사실입니다.

실제 개발자들 열명

실제 개발자들 열명 중 여덟명은 형상관리가 뭔지도 모릅니다.
대부분 공유폴더를 이용하더군요. 그과정에서 수정한 파일 옛날껄로 되돌리는 사고도 자주 일어나고요.

그리고 mfc 프로젝트 같은 경우 비주얼스튜디오에서 생성하는 각종 리소스나 코드들이 버전관리시스템때문에 엉켜서
알면서도 안쓰는 사람도 있습니다.
아무리 얘기해도 윗사람들이 귀찮아하면 다 꽝이죠.

Written By the Black Knight of Destruction

sozu의 그림

^^

스스로 해결하기 힘든 문제를 만났을 경우 문제를 공론화 해야 합니다.

동료분께 요청한 문제가 해결되지 않았을 경우 혹은, 중요한 문제임을 인식하지 못하여 일정에 차질을 주는 경우에는

개인적인 커뮤니케이션을 해결하려 들면 본인만 까다로운 사람으로 되기 쉽습니다. (다른 사람은 그 상황을 알수 없으니까요)

동료분께 현재 업무 프로세스의 문제점을 메일로 작성하시고 프로젝트 관련자들을 참조하세요. (증거가 있어야 합니다.)

이때 중요한 점은 프로젝트 관련자들도 문제를 쉽게 파악할수 있게 작성해야 한다는 것입니다.

자잘한 건단위로 해결하지 마시고 살짝 모아서 해결해주는 센스도 필요합니다.

건단위로 할경우 사소한 것까지 문제를 크게 만든다라는 인식을 가져올수 있습니다.

만약, 프로젝트 관련자들이 해당 문제점을 인식하지 못한다면~~ 대략 낭패입니다.ㅠㅠ

그럴 경우에는 문제가 너무 어렵습니다. 답이 않나와요( .. )

특히 상사가 그럴경우...신입사원의 말을 고분고분 들어주는 경우는 드물죠..이미 자기 고집에 빠져있기 때문에..

음...같이 일하시는 그분...

어떻게 취업하셨데요? -ㅁ-;

아직 학생인 저도...그 분보다는 잘할 수 있을듯;;

우선 제가 봤을때 팀장의 프로젝트 관리 능력이 조금 문제가 있는듯하고요.

예를들면 처음 프로젝트 시작때 문서화에 대한 내용, 업무보고방식같은걸 정해두고

일을 시작했으면 지금 처럼 팀이 흔들리는 일은 없었을듯 한데요.

지금 제가 있는 연구실에서 프로젝트하면 하루,1주일,1달 단위로 진행 보고서를 만들어서

1주일에 한번,한달에 한번씩 자기가 맡은 내용과 진행상황을 점검하면서 프로젝트 진행관리를 하는데

학교에서 하는 엉터리 프로젝트 -ㅁ-;보다도 더 프로젝트 관리가 안되는것 처럼 보이네요;;

그리고 같이하는 그 동료분....짤라내고 다른 개발자를 구하는게 최적의 solution일겁니다.

고생많으시겠네요. 물

고생많으시겠네요.

물론 급해서 인력은 초급으로 뽑았다지만

주관적인 견해로는
프레임웍 설계서를 만들려면 중급에 근접한 실력은 되어야 되는데.
몇년되지 않은 초급2분께 맡긴것 차체가 ...
일차적으로 개발이 지연되는건 개발자의 문제가 아닙니다.
보통 개발자가 욕을 많이 먹게 되지만 개발자의 잘못은 거의 없다고 할수 있을정도지요.
개발이 무너지고 또 세우고 무너지고 하는건 전형적인 인력운영의 문제지요.
프레임웍을 잡아줄 사람이 없기 때문이죠.

동료에 대해서 떠벌리잔니 나쁜놈되는것 같고 안 떠벌리자니 프로젝트 안되고
업무를 조절하는건 어떻까요. 서로 부닺히지 않게요.
공용으로 사용하는 기본 class는 일반적으로 많지 않으므로 각기능(서비스)별로 분리하시고
해당파트를 맡는겁니다.

그리고 모든 내용을 팀장을 통해서 주고 받도록 하는걸 제안해보세요.
어떤 부분이 안되면
가령 무슨 모듈을 받았는데 작동이 안되더라...
모든 내용을 자연스럽게 알릴수 있는 방법이죠 나쁜놈(? 사실 피해자죠 ㅎㅎ)도 안되요.
팀장한테 메일을 보내서 해당 내용을 알리고 팀장이 수정하도록 이야기 하세요.
팀장이 배를 같이 탔으니 같이 가야된다고 말했으니 팀장에게 이정도 부탁은 해보세요.

아울러 팀장이 설계부분을 피하는건 자신도 자세히 어떻게 해야될지 모를 가능성이 높아요.
즉, 기술성팀장이 아닌 영업성 팀장일가능성이 높네요...
경험풍부한 개발자가 필요한 시점이네요.

체스맨의 그림

팀장이 코딩

팀장이 코딩 안하거나, 코딩을 모르는 분인가요...?

아무튼 글 내용 상으론 프로젝트 결과는 실패이겠군요. 차라리 예상되는 결과에 맞춰서 앞으로 행동을 결정하시는 게 현명할 것 같습니다.

윗 분들 말씀처럼 문서화나 계획이 아주 중요하긴 하지만, 말씀하신 팀 규모에서 그런 체계를 갖추기란 쉽지 않아서, 대개 그런 경우는 프로젝트 성공 여부가 참여한 개발자의 개인기에 달려있다고 봐도 과언이 아닐 겁니다.

그 팀원을 뽑고, 그 팀원을 조율하지 못한 팀장 책임이 가장 큽니다. 물론 프로젝트가 실패했을때 그 분이 선뜻 책임을 질지는 의문입니다만.

제가 그 상황이라면 차라리 현재의 프로젝트 상황에 대한 분석 문서를 작성해서 다 까발리고 자폭을 각오할 것 같습니다만. -_-

하지만...
경력에 누가 되는 일은 되도록 피하세요...

저는 개발자는

저는 개발자는 아닙니다만... 아무튼 형상관리가 뭔지 모릅니다. 소스를 버젼별로 관리 하고 그러는 건가요? TODO리시트, 소스코드의 버젼, Bug리스트 등등.. 그런거 관리하고 Trace하고 그러는 것이... 형상 관리인가요? 음.
----
Lee Yeosong(이여송 사도요한)
E-Mail: yeosong@gmail.com
MSN: ysnglee2000@hotmail.com
----
웃음... 행복... 평화... (진정한...) 희망... 사랑... 이 세상 모든것이 그렇다면 얼마나 좋을까...(꿈 속의 바램일 뿐인가...)

CEO를 향하여

이글에 댓글다신분들 모두 CEO가 됩시다.
죽기살기로 일해서 여기댓글다신분들 모두 CEO되면 울나라 정보통신 강국될꺼라 믿습니다.

제가 항상생각해왔던건데, IT조직은 기술쪽보다 인사쪽 힘이 쎄다는거입니다.
근데, 인사과는 사람의 학력이나 됨됨이나 보고 기술력에대해서 전혀 의심치 않다는거 입니다.
또한 의심을할래야, 인사과쪽사람들이 머 아는게 있어야 의심을 하겠죵..

우리 엔지니어들이 CEO가되야 정보통신 강국 만들어갈수 있을꺼십니다.!
우리 노력하십시다!!

lacovnk의 그림

집 부근에

집 부근에 배팅볼(?)이라고 해야 하나요.. 야구공 치는 게 좀 전에 생겼습니다.

처음 그걸 봤을 때는 좀 멋쩍어서 안들어갔는데.. 요즘은 자주 갑니다. 시원시원하더군요 ㅎㅎㅎㅎ

그나저나, 커뮤니케이션은 정말 참 어려운 것 같습니다. 아아~

저는 메일로 모든 것을 해결하(려)는 것 보고 많이 당황스러웠습니다. 어허라~

저만 그런게 아니었군요..

제가 몇년전에 부푼 가슴을 안고 정부에서 추진하는 프로젝트를 따온 업체에서 잠시 알바?로 참여한적이 있습니다만.
참...기대가 우르르 무너지두만요..DB부터web까지 매일 코딩하고 매일 바뀌고...일관성..전혀 없고..비효율적이고..프로세스요?그런건 아예 생각도 안합디다...감리 나오면...접대하기 바쁘고...감리하시는분 나왔는데..마우스클릭도 제대로 못하더이다...연세가 꽤 있으셔도..임무가 감리면 좀 배우고 나와야 하지 않겠습니까? 당연히 검색 하나도 안되고...말해서 뭐합니까?그래도 잘 마무리된거 보면 평가는 잘 나온것 같더군요..흠흠;그곳만 그런줄 알았더니..제대로 안된곳이 꽤 있군요..놀랍습니다.....
일부 그런 몰지각한 기업에서의 팀프로젝트는 모든게 문제지만 젤 문제는 아마도 피드백의 문제라고 봅니다..전혀 피드백을 받아들일 생각을 안하더라구요...동료등..부하직원이듯...의견수렴은 없고...까라면 까...뭐 이런거 있잖습니까?참 많은걸 느꼈습니다...내가 생각했던 고수들은 다 어디 있을까?.창업생각했습니다..제 인생에 처음으로 더럽고 치사해서...돈 더달라는것도 아니고 처우 개선해달라는것도 아니고 제대로 좀 해보자는건데.....차라리 임시직이여서 얼마나 다행이었는지 모릅니다....정직원이었다면 아마 미쳐버렸을겁니다..결국엔 CVS 는 아니더라도.비스므리하게 해서 작업했습니다..공동작업인데..무슨 컴퓨터간에 공유도 안되어있고...최소한으로 버전쓰고 유저쓰고..그러니까 조금씩 진도가 나가더이다..6개월짜리 1년만에 했으니...이 무슨 국민들 세금으로 장난칩니까?....몇년전일임에도 확~ 오르는군요....별로 드릴수 있는 말이 없군요...힘내라고 하기도 참 뭐하고..그만두라고 하기도 거시기 하고...

CVS를 했어야하는데..이제서야..

안녕하세요. 초보 리눅서입니다
잘부탁해요 ^^

지금 진행중인 프로젝트는 현재 윈도에서 작업하지만 Unix계열에 포팅되는시간도 포함돼있는데요, 뭐 간단하게, '우리 ansi C/C++을 벗어나는 함수는 사용하지말자!' 이러고 시작했습니다. 정확히 툴은 VS6.0을 쓰는데 요게 C99표준은 커녕 기존은 C95표준보다도 약간 더 느슨하게,좀 여유있게 받아주고 있는듯하는데요, 프로젝트 막바지에 우리가 말로만 C/C++표준함수로 만들자 하고 만든 코드가 Unix계열에서 컴파일이나 될지 무척이나 걱정입니다.(무언가 크게 엉켜있을꺼라 예상됩니다.ㅋ)

더군다나 프로젝트 초기에 여러분이 다수 지적하신 CVS 도입건이 나왔었는데 그때 적극적으로 하자고 했어야지..하는 후회가 새삼드네요. 실제 코드를 만드는 인원은 2이기에,,없어도 돼겠지..한
착각이 이제와 낭패를 불러오고있네요.

결정적으로 무심하고 능력부족인 제탓이 많기에..부끄러울따름입니다.

일단 출근은 했으니 그래도 뭐라도 해야죠.^^
삼각김밥하나 먹고 시작해봅니다. 즐거운 한주되시길!

GUI가 아니라면

GUI가 아니라면 몇몇부분(process, thread관련함수중 일부)를 제외하고는 거의 호환됩니다.
생각보다 고칠거 별로 없어요.

tinywolf의 그림

버전 관리는 혼자라도 시작을..

학생 때부터 개인적으로 cvs을 설치하고 사용해 보았는데
사용할 때마다 정말 편리함을 느꼈었습니다.
졸업하고 나서는 svn을 써보고 훨씬 개선된 기능에 감동 받았었구요.

레포트나 중간중간 메모하는 텍스트들, 혹은 내문서를 통채로!!
버전 관리라는 것을 경험해 본다면 얼마나 편리한가를 다들 알 수 있죠.
사용하는 것을 보여준다거나 레포지토리를 나눠줘서 사용해 보라고 추천하면 같은 세계로 이끌기 쉽지요..

Posted by 노을삼킨별
,

출처 : http://cafe.naver.com/do/134

------------------ 개발자 3종셋트 ------------------


Posted by 노을삼킨별
,

MultiByteToWideChar

게임 개발 2006. 5. 24. 16:30

출처 : http://blog.naver.com/kjhun1201/20022971657

API를 이용하는 유니코드와 ANSI 문자열간의 변환 방법

API를 이용해서 유니코드와 ANSI 문자열간의 변환은 어떻게 수행합니까 ?

Visual C++에서 유니코드 문자열은 BSTR이란 타입으로 표시됩니다. 또 유니코드와 ANSI 문자열간의 변환을 위해서 윈도우 시스템에는 MultiByteToWideCharWideCharToMultiByte라는 API가 존재합니다. MFC에서의 BSTR 타입 변환방법이나 ATL로 하는 BSTR 타입 변환도 참고하시기 바랍니다.

ANSI 문자열에서 유니코드로의 변환 방법 
// sTime이란 ANSI 문자열을 bstr이란 이름의 유니코드(BSTR 타입) 변수로 변환
char sTime[] = "유니코드 변환 예제";
BSTR bstr;
// sTime을 유니코드로 변환하기에 앞서 먼저 그 길이를 알아야 한다.
int nLen = MultiByteToWideChar(CP_ACP, 0, sTime, lstrlen(sTime), NULL, NULL);
// 얻어낸 길이만큼 메모리를 할당한다.
bstr = SysAllocStringLen(NULL, nLen);
// 이제 변환을 수행한다.
MultiByteToWideChar(CP_ACP, 0, sTime, lstrlen(sTime), bstr, nLen);
// 필요없어지면 제거한다.
SysFreeString(bstr);

  • 유니코드에서 ANSI 문자열로의 변환 방법
     // newVal이란 BSTR 타입에 있는 유니코드 문자열을 sTime이라는 ANSI 문자열로 변환
     char *sTime;
     int nLen = WideCharToMultiByte(CP_ACP, 0, newVal, -1, sTime, 0, NULL, NULL);
     sTime = malloc(nLen+1);
     WideCharToMultiByte(CP_ACP, 0, newVal, -1, sTime, 128, NULL, NULL);
     // 필요없으면 메모리를 제거한다.
     free(sTime);
  • 유니코드 문자열을 UTF-8으로 변환하기 
     WideCharToMultiByte 함수를 호출할 때 첫 번째 인자로 CP_UTF8을 지정하면 된다.
     UTF-8은 유니코드의 인코딩 스킴 중의 하나로 쉽게 말하자면 문자열 스트림에서 0을 빼고
     표현하는 방법이라고 볼 수 있다

  • Posted by 노을삼킨별
    ,

    Visual Studio 2005 Express Edition Beta 버전을 아래의 MS 사이트에서 다운 받아서 설치해 보았다.

    http://msdn.microsoft.com/vstudio/

    역시나 생각했던 것처럼 .NET 을 많이 닮은 꼴이였다.

    실제로 개발 속도 향상이나 컴파일/링킹 부분의 속도 향상도 있는지에 대해선 테스트 해보질 못했다.

    이쁜(?) 아이콘 및 그래픽 리소스에 MS 의 전략이 눈에 띄였지만... 그 부분이 정작 중요한걸 모두 포함하고 있는지에 대해선 의문이다.

    VC 6과 비교해서 편리함을 보자면 [ class / fuction / struct ] 등등에 있어서 각각 접었다가 펼칠수 있다는 부분은 꽤 유용한 부분으로 보였다.

    계속 사용해서 익숙해지면 정말 좋을꺼 같다는 생각도 들었고, 다양한 폰트도 맘에 들었다.

    기존 VC 6 에 있는 폰트는 fixedsys 만 사용하다보니 단순해서 좋긴 했었지만 다양하지 못한 폰트에 지루함도 느꼈던게 사실이다. 암튼 그래픽 적인 부분은 멋지다 ^^

    WndTabs 를 인스톨하지 않아도 자체에서 제공되는 WndTabs 의 기능과

    Visual Assist 역시 인스톨하지 않아도 제공되는 부분은 장점중의 하나다.

    익숙해 지려고 노력해도 좋을듯한 ^^

    인스톨 하자마자 지울 생각으로 깔아서 테스트 해본 결과로는 나에게 좋은 점수를 얻은거 같다.

    적어도 아직은 지울 생각이 없기 때문이다. ㅎㅎ

    또한 .NET 의 무지막지한 인스톨 시간에 비해서 아직 베타 버전이라서 그런진 모르지만 상당히 빨랐던 것으로 느낀다.

    암튼 현재로서는 대 만족 ^_^;;

    '게임 개발' 카테고리의 다른 글

    개발자 3종세트 한번 웃자 ㅋㅋ  (0) 2007.08.07
    MultiByteToWideChar  (0) 2006.05.24
    CVS대체 SVN + Eclipse 통합  (0) 2005.11.02
    코드 최적화에 대한 Tip  (0) 2005.10.28
    풀화면에서 Dialog띠우기 팁 입니다. (DX9.0)  (0) 2005.10.27
    Posted by 노을삼킨별
    ,

    BSP를 이용한 3D Game Programming

     

    신용우

     

     

    강좌 1. BSP의 이해

     

    장면 관리(Scene Management)

            실제 게임에 사용하는 폴리곤의 개수는 갈수록 늘어가는 추세이며 이는 하드웨어의 발달에 힘입은 바가 크다. 최신의 비디오 카드들은 CPU를 능가하는 GPU(Graphics Processing Unit)을 탑재하고 있으며 이는 초당 수백만 폴리곤을 화면에 무리없이 그려낸다. 그럼에도 불구하고 3차원 게임 개발이 어려운 이유는 무엇인가? 역설적일지는 모르지만 개발자의 입장에서 보면 하드웨어가 게임을 모두 정석대로 소화하기엔 여전히 느리기 때문이다. 모든 개발자들은 자신이 만든 게임이 시스템 사양과 관계없이 초당 30프레임 이상으로 잘 동작하기를 바란다. 이를 위해 필연적으로 CPU와 GPU의 연산을 줄이는 특별한 방법(어떤 면에서는 trick에 가까운)이 필요하다. 개발자들은 이러한 방법들을 추상화 하여 쉽게 개발하기 위해 게임 엔진을 설계한다.

            개발자의 입장에서 게임 시나리오가 확정된 이후 3차원 게임을 개발을 시작하려고 할 때 처음 해야하는 일은 게임 엔진의 기초를 확립하는 것이다. 개발하려는 게임의 특성에 따라 각기 차이점은 있겠지만 엔진은 기본적으로 복잡한 장면(Complex Scene)을 관리할 수 있어야 한다. 장면(Scene)은 크게 정적 객체(Static Object)와 동적 객체(Dynamic Object)로 구분할 수 있다. 정적 객체란 게임의 실행시 한번 로딩한 이후 변하지 않는 객체, 즉 정적 게임 맵(Static Game Map)을 의미한다. 그러나 움직이는 문이나 동적 광원, 캐릭터, 아이템은 모두 동적 객체에 속한다. 그러나 장면 관리를 제어하기 위한 게임 엔진의 설계는 말처럼 쉽지는 않다. 많은 개발자들은 보다 뛰어난 장면 관리를 위한 방법들을 고안하였으며 이중  대표적인 것이 퀘이크(Quake)에서 사용한 BSP 기반 게임 엔진이다.

     

    퀘이크 게임 엔진

            둠 시리즈로 유명한 ID소프트웨어의 존 칼막(John Calmak)은 1995년도에 완전한 3D 환경의 게임인 퀘이크를 출시하였는데 이는 BSP, PVS, Light Map등 그 당시로서는 매우 획기적인 기술들을 도입한 놀라울만한 게임이었다. 이후 많은 개발자들이 퀘이크와 유사한 게임 엔진을 개발하기 위해 부단히 노력하였으며 이는 퀘이크 장르의 게임들이 쏟아져 나오는 계기가 되었다. 저자 또한 퀘이크 게임 엔진의 분석을 통해 많은 것을 배울 수 있었다. 이 문서 또한 그와 유사한 게임 엔진을 제작하는 기법에 대한 방법을 다룰 것이다.

     

     

    [그림 1]. Quake (ID Software)

     

            스크린샷이 최신 게임들에 비해 초라해 보이는가? 그러나 최신 게임들 조차도 이 게임에 적용된 모든 기술들을 아직도 복습해서 사용하고 있다. 그럼 이와 같은 게임을 만들려면 어떻게 해야 하는가? 간단하게 설명하면 다음과 같다.

    1. 게임 맵 데이터를 바탕으로 하여 BSP 트리를 구축한다.

    2. 이 트리 구조를 응용하여 PVS를 생성한다.

    3. 동적 객체에 대한 Object PVS를 생성한다.

    4. 라이트맵(Light Map)을 생성한다.

    이게 무슨말인지 모른다고 해서 걱정할 필요는 없다. 만약 여러분이 위의 내용을 다 알고 있다면 이 문서를 볼 이유가 없다. 이제 차근차근 도표와 예제를 통해 설명해 나갈 것이다.

     

    사전 지식

            이 글은 독자들이 다음과 같은 사전 지식이 있다고 가정한다. 만약 자신이 부족하다고 생각한다면 다른 책들을 참고하길 바란다.

    1. Standard C & C++ 프로그래밍

    2. STL (Standard Template Library)

    3. Visual C++을 이용한 Win32 프로그래밍

    4. OpenGL

    5. 3차원 그래픽스에 대한 기초 수학 (특히 벡터, 행렬)

            글은 되도록 쉽게 쓰려고 노력하였으나 글재주가 엉망이라 내가 봐도 좀 한심한 부분이 있다. 똑똑한 사람일수록 글을 쉽게 쓴다는 말이 일리가 있는 것 같다. 부족한 점이 있더라도 이쁘게 봐주길 바란다.

     

    BSP의 개념

            BSP(Binary Space Partitioning)이란 공간을 분할하는 정보를 담고있는 2진 트리를 의미한다. BSP는 원래 은면 제거(Hidden Surface Removal)을 목적으로 고안하였으나 BSP의 공간 분할에 대한 특성으로 인해 그 응용 범위는 넓게 확장되었다. 이 장에서는 고전적인 BSP의 제작 방법을 다룰것이다. 여기서 고전적이란 의미는 일반적으로 그래픽스에서 사용하는 BSP를 의미한다. 고전적 BSP는 실제 게임에서 사용하는 BSP와는 약간 틀린점이 있지만 본질적으로 개념은 동일하다. 게임에서 사용하는 BSP는 고전적인 BSP를 변형한 Solid Leaf BSP를 주로 사용하는데 이는 공간을 개발자들이 관리할 수 있는 형태로 분할하는데 도움을 준다. 또한 적절히 분할한 공간을 이용하여 PVS(Potential Visiblity Set)를 구성할 수 있는 기반으로 사용할 수 있다.

    그럼 어떻게 BSP를 생성할 것인가? 폴리곤으로 구성된 입체를 BSP 트리 형태로 표현하는 방법은 다음과 같다.

    1. 입체를 구성하는 폴리곤 리스트에서 하나를 선택하여 기준으로 삼는다.

    2. 새로운 BSP 노드를 생성하여 선택한 폴리곤을 노드에 추가한다.

    3. 선택한 폴리곤의 평면의 방정식을 구한 후에 나머지 폴리곤을 모두 테스트하여 평면의 앞에 있는 폴리곤과 뒤에 있는 폴리곤을 분류하여 리스트를 만든다. 즉, 앞쪽 리스트와 뒤쪽 리스트를 완성한다.

    4. 앞쪽 리스트에서 하나의 폴리곤을 선택하여 기준으로 삼는다. 선택한 폴리곤은 이전에 선택한 폴리곤의 하위 Front 노드에 저장한다. 리스트에 남는 폴리곤이 없을 때 까지 2의 과정을 재귀적으로 반복한다.

    5. 뒤쪽 리스트에서 하나의 폴리곤을 선택하여 기준으로 삼는다. 선택한 폴리곤은 이전에 선택한 폴리곤의 하위 Back 노드에 저장한다. 리스트에 남는 폴리곤이 없을 때 까지 2의 과정을 재귀적으로 반복한다.

    위의 내용이 잘 이해가 되는가? 무슨 말인지 모르겠다면 당신은 정상이다. 그럼 예를 들어 살펴보자.


    BSP 트리 구성의 기초

            게임 맵은 폴리곤의 집합이다. 이러한 폴리곤은 최소 세개의 정점(Vertex)을 가지고 있으며 이들 정점들은 하나의 평면을 결정한다. 따라서 모든 폴리곤은 자신이 속한 평면의 방정식을 얻을 수 있다. [그림 2]는 하나의 폴리곤이 하나의 평면에 속해 있음을 보여준다. 그럼 이러한 평면을 어떻게 구할 것인지 알아보자.

    [그림 2] 삼각 폴리곤 ABC가 하나의 평면을 결정하고 있음

     

            그렇다면 어떻게 폴리곤의 정보를 이용하여 폴리곤이 속한 평면을 구할 수 있을까? 다 알고 있겠지만 초보자들을 위해 간단히 설명하겠다. 일반적으로 평면의 방정식은 다음과 같다.

    ax + by + cz + d = 0

    (x, y, z는 변수이고 a, b, c, d는 상수)

    이중 a, b, c는 평면의 방향벡터(Normal Vector)이므로 벡터 AB와 BC의 Cross Product를 얻으면 그 값은 a, b, c와 일치한다.

    Vector(a, b, c) = AB CrossProduct BC

    만약 폴리곤의 회전 방향에 대한 표현법이 CW(Clock Wise) 방식이라면 Vector(a, b, c)는 평면의 방향벡터와 일치할 것이다. 그러나 폴리곤의 회전방향이 CCW(Clock Counter Wise)라면 평면의 방향벡터와 반대방향의 값을 얻는다. 이점에 주의하라.

    참고 - CW란 시점에서 폴리곤을 바라볼때 폴리곤을 구성하는 정점의 순서가 시계 방향으로 돌아갈 경우 평면이 시점에 대하여 앞면을 향한다고 정의하는 방법이다. 반대로 CCW는 정점의 순서가 반시계 방향으로 돌아갈때 평면이 시점에 대하여 앞면을 향한다고 정의한다. 일반적으로 OpenGL에서는 CW를 기본값으로 사용하며 D3D 에서는 CCW를 사용한다.

    이제 a, b, c의 값을 알고 있으므로 d의 값은 다음과 같다.

    d = -(ax + by + cz)

    폴리곤의 정점은 평면 내부에 위치하기 때문에 x, y, z에 대입하면 성립한다. 따라서 x, y, z에 폴리곤의 정점 중 하나를 선택하여 대입하면 d의 값을 쉽게 얻을 수 있다. 폴리곤이 평면을 결정하는 방법은 BSP를 제작하는데 자주 사용할 것이다. 이제 폴리곤과 평면의 차이를 이해하였으면 다음으로 그림의 표현법에 대해 알아보자.

    [그림 3]을 보면 이 맵은 4개의 폴리곤으로 이루어져 있다. 이 그림은 3차원적으로 폴리곤을 표현하고 있지만 [그림 4]는 동일한 내용을 2차원적으로 표현하고 있다. 앞으로는[그림 4]와 같은 형태로 폴리곤의 배치를 표현할 것이다.

     

    [그림 3]

     

     

    [그림 4]

     

            [그림 4]에서 화살표는 평면의 방향을 의미한다. 그럼 이를 바탕으로 BSP를 직접 생성해 보자. 먼저 BSP는 이진 트리 구조(Binary Tree)이다. 이진 트리 구조란 하나의 노드가 2개의 하위 노드를 가짐을 의미한다. BSP의 첫번째 하위 노드에는 자신을 기준으로 앞쪽에 위치한 폴리곤을 저장하며, 두번째 하위 노드에는 뒤쪽에 위치시키는 것을 규칙으로 한다. 먼저 최상위 루트(root) 노드로 B를 선택하자.

    [그림 5]

     

            왜 하필 B를 루트 노드로 선택했을까? 지금으로선 별 의미 없다. 아무거나 선택해도 상관없다. 이제 트리 구조의 루트에 B가 위치할 것이다. [그림 5]를 보면 루트에  B가 위치함을 알 수 있다. B를 기준으로 하위 노드 2개가 있음을 알 수 있는데 이는 각각 자신을 기준으로 앞쪽에 위치한 폴리곤을 가리키는 Front 노드와 뒤쪽을 가리키는 Back 노드를 가지고 있다. 현재는 Front와 Back노드 모두 비어있는 상태이다.

            이제 A를 선택하자. [그림 4]을 보면 B를 기준으로 볼 때 A는 B의 뒤에 위치함을 알 수 있다. 루트에는 이미 B가 위치하고 있으므로 B의 하위 Front 노드에 A를 추가한다.

     

     

    [그림 6]

     

    그런데 좀 이상하지 않은가? 확실히 A노드는 B의 뒤에 위치하는가? [그림 7]와 [그림 8]을 비교해 보라.

     

    [그림 7]

     

    [그림 8]

     

            [그림 7]와 [그림 8]은 A의 방향 벡터가 반대 방향으로 위치해 있다. 그럼에도 불구하고 두 경우 모두 B를 기준으로 A는 뒤에 위치한다고 판단한다. 왜 이런 결과를 얻는가? 폴리곤 A를 구성하는 모든 정점은 폴리곤 B의 뒤에 위치하기 때문에 결국 A는 B의 뒤에 위치한다는 것을 알 수 있다. 다시 말하면 기준이 되는 B의 방향성만 의미가 있을 뿐 A의 방향성은 무시한다. 따라서 [그림 7]과 [그림 8]은 모두 [그림 6]의 형태로 배치함을 원칙으로 한다.

            그렇다면 A를 기준으로 선택한다면 어떻게 될까? [그림 7]의 경우 폴리곤 B는 A에 대해 뒤쪽에 위치한다. [그림 8]의 경우 폴리곤 B는 A에 대해 앞쪽에 위치한다.

            다음으로 남은 폴리곤 C, D중에서 D를 먼저 선택하자. D를 트리에 넣기 위해 먼저 루트 노드 B와 비교를 한다. D는 B의 앞쪽에 위치하므로 B의 하위 Front 노드에 저장한다. [그림 9]

            이제 마지막으로 남은 폴리곤 C를 트리에 넣는다. C를 B와 비교해 보니 B의 앞에 위치한다. 따라서 C를 B의 하위 Front 노드에 추가하면 트리는 [그림 10]와 같은 형태를 이룬다. 하위 Front 노드에는 C, D 두개의폴리곤을 저장하고 있으므로 다음엔 C와 D를 위의 요령으로 다시 분할하자. 이번에는 D를 기준 폴리곤으로 잡으면 D의 뒤에 C가 위치하므로 D의 하위 Back 노드에 C를 보낸다. 이제 BSP 트리를 완성하였다. [그림 11]

     

    2진 트리구조와 효율성

            위의 예제에서 폴리곤 A, B, C, D에 대하여 B-A-D-C의 순서로 BSP 트리를 생성하였다. 그런데 어떠한 폴리곤을 먼저 선택하느냐에 따라 여러가지 트리 형태가 나타날 수 있다. 결국 트리 형태는 폴리곤의 선택 순서에 달린 것이다. 만약 폴리곤을 D-C-B-A의 순서로 선택하여 트리를 구성한다면 어떻게 될까? [그림 12]와 같은 형태를 이룬다.

     

            [그림 12]가 [그림 11]에 비해 효율적인 트리라고 말할 수 있는가? 그렇지 않다. [그림 11]의 경우 트리의 깊이가 3인데 반해 [그림 12]는 4이다. 따라서 트리를 탐색하려 할 경우 [그림 11]의 경우가 더 유리하다고 할 수 있다. 따라서 BSP를 생성할 때 기준 폴리곤의 선택을 최적화하여 트리의 깊이를 최소화할 필요성이 있다.

     

     

    동일 평면상의 폴리곤

            BSP는 특정 폴리곤이 다른 폴리곤에 대하여 앞쪽에 있는가 뒤쪽에 있는가를 판단하는 근거를 제공한다. 그러기 위해서 특정 폴리곤을 선택하여 이를 기준으로 삼아 나머지 폴리곤들을 재배치(Classify)하였다. 그런데 선택한 기준 폴리곤의 평면에 대하여 동일한 평면에 위치하는 폴리곤은 어떻게 처리할 것인가? 이때에는 기준 폴리곤을 포함하는 노드에 같이 추가한다.

     

            위의 그림에서 A를 기준 폴리곤으로 선택하였다 가정하자. 나머지 폴리곤 B, C, D를 A의 평면에 관해 분류하려고 보니 모두 동일 평면에 위치하고 있다. 게다가 C와 같은 경우 동일 평면상에 위치하고 있음에도 불구하고 반대 방향을 향하고 있다. 이 경우 어떻게 할 것인가? 정답은 B, C, D를 A를 포함하는 노드에 그냥 추가하는 것이다. BSP 노드는 2개의 연결 리스트(Linked List)를 가지고 있는데 그중 하나는 동일 평면상에 위치하며 동일한 방향성을 가지는 폴리곤을 저장하고, 나머지 하나는 동일 평면상에 위치하지만 반대 방향성을 가지는 폴리곤을 저장한다.

    이와 같은 정보를 저장하기 위한 BSP 노드의 클래스를 정의하면 다음과 같다.

     

    class CBspNode

    {

    public:

    float PlaneEquation[4];                 // 기준 폴리곤에서 얻은 평면의 방정식

    LinkedList SamePolyList;             // 동일 평면, 동일 방향의 폴리곤 저장

    LinkedList OppositePolyList;         // 동일 평면, 반대 방향의 폴리곤 저장

    CBspNode *pFrontNode; // 하위 Front 노드

    CBspNode *pBackNode; // 하위 Back 노드

    };

     

     

    [그림 14]

     

            [그림 14]에서 기준 폴리곤 A는 폴리곤 B를 가로지르고 있다. 폴리곤 B의 일부는 A의 앞에 있고 일부는 뒤에 있다. 이러한 경우 폴리곤 B를 두 조각으로 분할하여 각기 저장한다. [그림 15] 을 보면 A를 포함하는 평면에 대해 B가 B1과 B2로 분할된 것을 볼 수 있다. 여기서 B1은 A의 앞쪽이 있고 B2는 뒤쪽에 있으므로 각각 A의 하위 Front 노드와 하위 Back 노드에 추가한다.

     

    예제

            지금까지 다룬 내용이 BSP 트리를 구축하기 위해 필요한 모든 내용이다. 위의 내용을 정확하게 알 수 있는지 자신이 없다면 다음 문제를 보며 연습하길 바란다. [그림 16]에 좀 더 많은 숫자의 폴리곤을 배치하였다.  그림에서 보듯이 폴리곤 A, K, L은 동일 평면에 위치하고 폴리곤 B는 폴리곤 E를 분할함에 주의해서 스스로 BSP를 분할해 보고 결과를 비교해 보자. 폴리곤의 선택 순서에 따라 결과가 달라짐에 주의하라.

     

    [그림 16]

     

    1. A를 기준 폴리곤으로 선택한다. K와 L이 동일 평면에 위치하므로 A를 포함하는 노드에 추가한 후에 하위 Front와 하위 Back노드를 추가한다

     

     

    2. 하위 Front 노드를 구성하는 B, C, D, E, F, G중에서 B를 기준 폴리곤으로 선택하여 다시 분류한다. 이때 B는 E를 분할(Subdiv)하여 앞쪽에 위치한 E1과 뒤쪽에 위치한 E2를 얻은 후에 각각의 하위 노드에 저장한다.

    3. 나머지 폴리곤들도 위의 요령으로 재귀적으로 구성한다. 결과는 다음과 같다.

     

            자, 대충 이해했는가? 다음 강좌에서는 실제적으로 이러한 BSP를 C++을 이용해 구현하는 법에 대해 알아볼 것이다. 지금 다루는 내용은 고전적인 BSP이고 실제 게임에서 사용하는 BSP와는 조금 다르다는것을 기억하고 다음 강좌를 기대하길 바란다.


    Posted by 노을삼킨별
    ,

    출처 : http://blog.naver.com/vane77/20000744655

    GLUT Tutorial

    GLUT 설정

    by Antonio

    원문 : http://www.lighthouse3d.com/opengl/glut/index.php3?1

    GLUT 는 OpenGL 을 위한 표준 유틸리티 툴킷입니다. 즉 OpenGL 용 어플리케이션의 개발을 편하게 할 수 있도록 도와주는 도구로 생각하면 됩니다. Mark J. Kilgard 씨가 GLUT 를 만들었는데, 그 이유는 특정 윈도우 시스템들을 알지 못해도 OpenGL 용 어플리케이션을 만들 수 있도록 하기 위해서 였죠. 너무나 고마운 일 아닙니까? Mark J. Kilgard 씨와 GLUT 에 고마워합시다~ :) GLUT 를 사용하면 X 윈도우 시스템이나 마이크로소프트의 윈도우 시스템에 대해서 배우지 않고도 OpenGL 용 어플리케이션을 만들 수 있습니다. Kilgard 씨가 X 윈도우용의 GLUT 를 만들었고 나중에 Nate Robins 씨가 마이크로소프트 윈도우즈용의 GLUT 를 만들었답니다. 우리 모두 이 두사람의 위대한 업적에 갈채를 보냅시다!

    이 강좌는 GLUT 를 사용해서 어플리케이션을 만드는 방법을 설명합니다. 단, 예제의 코드를 가능한 간단하게 만들기 위해서 화려한 시각 효과 같은건 만들지 않겠습니다.

    무엇이 필요한가요?

    GLUT 를 이용해서 어플리케이션을 만들려면 우선 최신버전의 GLUT 가 필요해요. 당연한 얘기인가요 ;) 이 글을 쓸 때, GLUT 의 최신버전은 3.7 이었습니다. GLUT 배포판은 아주 많은 예제를 포함하고 있기 때문에 이 강좌를 다 보고 난 다음에 예제를 분석해 보는 것이 좋겠죠? 당연한 얘기입니다! :) GLUT 가 없거나 GLUT 에 대해서 궁금한 것이 있으면 GLUTs 웹페이지를 살펴보세요.

    GLUT 를 사용해서 C 언어로 어플리케이션을 만들려면 3 개의 파일이 필요합니다. :

    • glut.h - 이 파일은 어플리케이션의 소스코드에 항상 포함해야하는 파일입니다. 이 파일은 대개 여러분이 사용하는 개발툴 시스템의 include 폴더 아래에 있는 gl 폴더에 들어있습니다.
    • glut.lib ( SGI 의 윈도우즈 버전 ) 과 glut32.lib ( 마이크로소프트 버전 ) - 이 파일은 glut 를 이용하는 어플리케이션이라면 반드시 링크해야 합니다. 대개 개발툴 시스템의 lib 폴더에 들어있죠.
    • glut.dll ( SGI 의 윈도우즈 버전 ) 또는 glut32.dll ( 마이크로소프트 버전 ) - OpenGL 을 사용하기 위해서 둘 중 하나만 선택하면 됩니다. 마이크로소프트 버전의 glut 를 사용하려면 glut32.dll 파일을 선택하세요. 이 파일은 운영체제의 system 폴더에 있어야합니다.

    Visual C/C++ 6.0 환경 설정하기

    Visual C/C++ 로 프로젝트를 만들려면 두가지를 설정해줘야 합니다. 하나는 콘솔 프로그램으로 만들 것인지 아니면 Win32 프로그램으로 만들 것인지 정해야합니다. 콘솔로 만들게 되면 어플리케이션은 두 개의 창을 갖게 됩니다. 하나는 콘솔창이고 다른 하나의 OpenGL 창이랍니다. Win32 를 선택했을 때 GLUT 를 사용하면 Win32 로 어플리케이션을 만들 때 만나게 되는 '프로그래머 혼란스럽게 하기' 란 장애물을 피해갈 수 있습니다. :) 이를 위해서 아래의 과정을 따라 하나만 바꿔주세요.

    1. 주메뉴의 Project->Settings 를 선택하세요.
    2. 대화상자에서 "Link" 탭을 선택하세요.
    3. 콤보박스의 "Category" 에서 "Output" 을 선택하세요.
    4. "Entry-point symbol" 에디트박스에 "mainCRTStartup" 이라고 입력하세요.

    이미 만든 콘솔 프로젝트를 Win32 어플리케이션 프로젝트로 만들려면 아래의 과정을 따라 설정해주면 됩니다. 콘솔에서 Win32 로 바꾸는 것은 콘솔창을 만들지 않기 위해서겠죠?

    1. 위의 과정을 따라서 entry-point symbol 을 추가합니다.
    2. "Project Options" 에디트박스에서 "subsystem:console" 을 "subsystem:windows" 로 바꿔줍니다.

    위의 과정을 일일이 다 해주기 귀찮다면 소스코드의 시작부분에 아래의 코드를 입력해주세요. 위의 과정과 똑같이 프로젝트를 설정해줍니다.

    #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

    프로젝트를 위의 과정에 따라 올바르게 설정했다면 콘솔창은 없고 OpenGL 창만 있는 어플리케이션이 만들어집니다. 두번째 설정은 GLUT 를 어플리케이션에 링크해주는 것인데 Visual C/C++ 을 사용한다면 아래의 과정을 따라 설정하면 됩니다.

    1. 주메뉴의 Project->Settings 를 선택하세요.
    2. 대화상자에서 "Link" 탭을 선택하세요.
    3. "Object/library modules" 에디트박스에 "opengl32.lib glut32.lib glu32.lib" 을 입력합니다.

    주목 : glu32.lib 과 opengl32.lib 을 추가했습니다. 이 두개의 라이브러리 파일은 OpenGL 의 표준 라이브러리입니다. GLU 는 OpenGL 이 배포하는 표준 API 입니다.

    모든 설정이 끝났나요? 잘 끝냈기를 바랍니다 :) 그럼 이제 GLUT 를 이용해서 어플리케이션을 만들어봅시다. 이 강좌에서 확실하지 않거나 궁금한 점이 있으면 연락해 주세요. 성실하게 답해드릴께요. 이런 강좌는 여러분들의 참여가 아주 중요하거든요.

    이 강좌가 여러분들에게 도움이 되길 바랍니다. - Antonio -


    좋은 팁!

    출처: Grafix3d.net

    Posted by 노을삼킨별
    ,

    출처 : http://blog.naver.com/eclipse4j/120012435008

    - SVN + Eclipse Subclipse
     

    1. Subversion 설치

    우선 Subversion을 다운로드 합니다.

    http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91

    다운종료 후, 실행

     

    모든 옵션은 디폴트로 넘어가도 됩니다. Install!!

     

    환경변수에 자동으로 추가 됩니다. 안되면 추가.

     

    설치 종료.

     

    2. 저장소 설치

    우선 원하는 위치에 저장폴더를 생성합니다.

    C:\>mkdir mysubvsn

    C:\mysubvsn\>

     

    저장소를 생성합니다.

    C:\mysubvsn\> svnadmin create --fs-type fsfs mysvn

     

    저장소가 생성되었습니다. 이제 저장소 환경설정을 합니다. 위의 명령을 실행하면 현재폴더 밑에 mysvn이라는 폴더가 생깁니다. 해당 폴더로 들어가면 다음과 같은 구조가 보이죠.

     

    ..\conf\svnserve.conf 파일을 엽니다.

     

    파일의 내용은 위와 같고, 화살표로 표시된 부분의 주석을 제거합니다.

     

    anon-access 는 일반유저의 접근권한 auth-access는 계정사용자의 접근권한입니다.

    Password-db = passwd 는 사용할 계정의 파일명입니다. Conf 폴더에 ‘passwd’ 라는 파일을 만들어 다음 문구를 입력 후 저장합니다.

    # User

    [users]

    eclipse4j = eclipse4j

    이렇게 하면 설정은 끝납니다.

     

    3. 데몬실행.

    Apache file, svn svn으로 접속.

    C:\mysubvsn\mysvn>svnserve -d -r c:\mysubvsn\mysvn

    간단하죵. 접속테스트는 다음처럼.

    C:\>svn checkout svn://127.0.0.1

    그럼 C\>폴더에 127.0.0.1폴더가 생기죠. 확인되면 사정없이 지우셔도 됩니다.

     

     

    4. eclipse plugin설치.

     

     

    Help -> Software Updates -> Find and Install 에서

    Search for new features to install을 선택.

    다음화면에서 New Remote Site : http://subclipse.tigris.org/update 를 입력.

    생성된 사이트의 체크박스에 체크 후 finish. 그러면 자동으로 update manager 가 실행되고 결과 창이 다음과 같이 나옵니다.

     

     

    체크 후 플러그인을 다운받고 eclipse 리스타트가 되면 설치가 종료 된겁니다.

     

    5. SVN 공유.

     

    정상적으로 설치가 되었다면, 위와 같이 SVN Perspective 가 추가된 것이 보입니다. 해당 Perspective를 열고 CVS와 같이 New->Repository Loca…!


     

    접속정보를 입력합니다. 이것으로 설치와 접속은 종료되었습니다. 나머지는 CVS에서 처럼 프로젝트를 만들고 팀/공유 하고, 저장소 타입을 SVN으로 지정하시고 사용하시면 됩니다.

     

     

     

    아직까지는 CVS를 쓰고 있지만 조만간 SVN으로 넘어가지 않을까 합니다. CVS의 대체라고 하니까

     

    kldp : http://wiki.kldp.org/wiki.php/SubversionBook/

    Posted by 노을삼킨별
    ,