작업물2011. 10. 17. 17:46

서브버전(Subversion, 소프트웨어 버전 관리 시스템)

원래 CVS 를 사용했으나 디렉토리의 이동이나 이름 변경 등과 같은 한계점 때문에 SVN 이라는 개량 시스템이 나오게 되었다.
한 프로젝트의 소스 코드를 하나의 중앙 저장소(서버)에 위치하고, 해당 저장소는 포함하고 있는 파일과 디렉토리의 모든 변경 사항을 기억하고 있게 된다. 이러한 변경 사항에 대해 예전으로 되돌리거나 어떻게 변화했는지에 대한 이력을 확인하는 등 다양한 관리를 할 수 있다.
서브버전은 여러 컴퓨터에서 네트워크를 통해 접근할 수 있으며 (권한에 따른) 다양한 사람들이 파일을 수정할 수 있도록 하여 협업이 가능케 한다. 모든 작업에 자동으로 버전이 매겨지므로 만일 잘못된 수정이 가해졌더라도 쉽게 되돌릴 수 있다.

 

가장 원시적인 형태의 Versioning Model은 파일의 직접 공유이다.
A 와 B 가 임의의 저장소에서 동일한 파일을 참조하여 작업할 때, A 가 수정한 내용과 B 가 수정한 내용은 동시에 반영/보존될 수 없다.

 

이러한 한계를 극복한 것으로 Lock-Modify-Unlock Model 이 있는데 이는 수정자 A가 수정할 파일을 다른 수정자 B가 수정할 수 없도록 잠그고(Lock) 수정(Modify) 완료 후 잠금해제(Unlock)하는 형태이다. 하지만 수정자 A 가 수정하는 동안에는 다른 수정자들은 해당 파일을 읽기 밖에(Read Only) 할 수 없고, 수정자 A 가 잠금 해제할 수 없는 상황이 되어 버리면 누구도 해당 파일에 손댈 수 없으며, 수정자 A, B 가 각각 서로를 참조하는 파일 1, 2 를 잠그고 수정하는 경우 참조의 균일성이 깨어질 위험이 있다.

 

서브버전은 Copy-Modify-Merge 모델을 사용한다.
각각의 수정자는 서버 저장소에서 개인적인 작업 복사본을 만들어 작업하며 수정이 완료된 시점에 저장소에 변경사항을 반영한다. 이 때 변경 대상에 대해 다른 수정자에 의한 변경사항이 존재한다면 이를 통지 받고 자신의 복사/수정본과 병합할 수 있다. 병합 시 새로운 변경사항 중 자신이 수정한 부분과 충돌이 일어나는 부분에 대해서는 수정자가 다른 수정자와의 의견 교환 후 수동으로 선택한다.

 

버전관리를 사용하는 이유

  • 여러 사람이 한 프로젝트의 소스 코드를 관리하기 위해
  • 소스 코드의 변경 사항을 추적 (누가 수정했는지, 어떻게 수정했는지) 하기 위해
  • 프로젝트의 영향을 최소화 하면서 새로운 부분 개발 (Branch) 하기 위해
  • 새롭게 개발한 부분의 검증 후 프로젝트에 적용 (Merge) 하기 위해
  • 대규모 수정 작업을 더욱 안전하게 진행하기 위해

 

SVN 의 일반적인 흐름

  1. 프로젝트 P 에 대해 SVN 을 사용하기 위해 Repository 에 최초 자료를 Import 한다.
  2. 사용자 A 는 Repository 에 접속하여 수정하려는 파일을 CheckOut 한다.
  3. 수정완료 후 Commit 을 통해 수정 내용을 저장소에 반영하기 전, 수정 대상에 대한 변경내용이 있다면 Update 한다.
  4. Commit 하여 저장소에 수정 내용을 반영한다.

 

SVN 의 기본 용어 설명

Repository       : 서버 저장소
Working Copy  : Repository 에서 받은 개인적인 작업 복사본
Import             : 최초로 Repository 에 자료를 올리는 행위
Export             : Repository 에서 자료를 내려 받는 행위, 버전 관리 정보 제외
CheckOut        : Repository 에서 자료를 내려 받는 행위, 버전 관리 정보 포함
Commit           : 개인 작업 영역에서의 변경내역을 Repository 에 반영
Revision          : 갱신 번호. 저장소에서의 수정이 발생할 때 마다 자동으로 증가
Trunk              : 개발 가지들 중에 가장 중심이 되는 줄기
Branch            : 특정 버전으로의 뻗어나가기
Tag                 : 개발 버전의 스냅샷

 

Branch

한 프로젝트가 특정 시점의 버전부터 둘 이상의 독립적인 프로젝트로 분기될 때 이를 Branch 라 한다.
Branch 는 언제나 특정 시점의 데이터의 복사본으로부터 생성되어 그 자신만의 히스토리를 시작한다. 서브버전은 복사된 새 Branch 에 대해 원본의 어떤 데이터(Trunk)와 관련이 있는지 기억하며 한 쪽의 변경사항을 다른 쪽에 복사하는 것과 같은 개발 부분의 혼합/매치를 가능하게 한다.
Branch 는 이러한 독립적인 새 프로젝트를 위한 경우 외에도 한 수정자의 '오랜 시간이 걸리거나 프로젝트의 많은 부분이 변경되는 수정 작업' 의 경우에도 사용될 수 있다.

 

Merge

Merge 는 두 저장소의 트리를 비교하고 그 차이점을 작업본에 적용한다. 임의의 Branch 에서 수정 작업의 완료 후 이를 Trunk 에 반영하고 싶을 때에는 먼저 해당 Branch 를 최신 Trunk HEAD 로 Update 해야 한다. 이 후에 Branch 와 Trunk 를 Merge 해야 Branch 와 Trunk 사이에 오직 수정자가 Branch 에 가한 수정사항 만큼만 Merge 할 수 있다. 즉, 내 Branch 의 변경사항이 일어나는 동안 변화한 Trunk 의 상태를 내 Branch 에 먼저 반영하고 그 이후에 내 Branch 의 변경사항을 Trunk 와 Merge 해야 한다는 의미이다.

아래는 KLDPWiki 에 나와있는 일부 내용을 그대로 옮긴 것이다.

 

개발자의 브랜치 사용패턴

대부분의 소프트웨어는 전형적인 라이프사이클 - 코딩, 테스트, 릴리즈, 반복 - 이 있는데 여기에는 두 가지 문제점이 있습니다. 우선, 개발자는 품질 인증팀이 릴리즈된 제품을 검사할 동안 기다려야만 합니다. 둘째 대부분의 팀은 구 버전과 릴리즈된 버전을 함께 서포트해야 합니다. 만일 최근에 버그가 발견되었다면 릴리즈된 제품에도 버그가 존재할것인데 사용자는 새로운 릴리즈를 기다리지 않고 즉시 버그가 수정되기를 바랄것입니다. 이때 버전관리가 필요한데 전형적인 프로세스는 다음과 같습니다:

 

  1. 개발자는 트렁크에 모든 새 작업을 올려놓는다. 매일 매일 수정사항이 트렁크에 커밋된다. 새 기능, 버그픽스 등등······.
  2. 트렁크를 릴리즈 브랜치로 카피한다. 개발팀이 생각하기에 제품을 릴리즈할 준비가 되었다고 생각할 때 트렁크를 브랜치로 카피한다. 예를 들어 /branches/1.0가 될것이다.
  3. 팀은 이와 병행해서 작업을 계속한다. 한 팀이 릴리즈 브랜치의 테스트를 할 때 , 다른 팀은 트렁크에서 계속 작업을 할 수 있다. 어느 쪽에서든 버그가 발견되면 버그픽스가 왔다갔다 할것이다. 하지만 어느 시점이 되면, 그런 프로세스는 멈추고 브랜치는 릴리즈 바로 직전의 최후 테스트 버전으로 고정될 것이다.
  4. 브랜치는 태그되고(tagged) 릴리즈된다. 테스트가 끝나면 /branches/1.0은 레퍼런스 스냅샷인 /tags/1.0.0으로 카피된다. 이 태그는 패키지화 되어 고객에게 릴리즈된다.
  5. 브랜치는 항상 유지 보수된다. 트렁크에서는 2.0버전의 작업이 계속된다해도, 버그픽스는 트렁크에서 /branches/1.0으로 계속 포팅된다. 일정량의 버그픽스가 쌓이면, 버전 1.0.1을 릴리즈하기로 결정한다. /branches/1.0/tags/1.0.1로 복사되고 태그는 또다시 패키지화 되어 고객에게 릴리즈된다.

이 모든 과정이 소프트웨어 개발에서 반복되는데, 2.0버전의 개발이 완료되면, 새로운 2.0버전 릴리즈 브랜치가 만들어지고, 테스트되고, 태그된 후 릴리즈 됩니다. 몇 년 후 저장소는 유지 보수되는 릴리즈 브랜치 여러 개와 최종 버전인 태그 여러 개가 남아있을 것입니다.

 

Tag

Tag 는 특정 시기의 프로젝트의 스냅샷을 의미한다. 보통 새로운 버전의 release 와 같은 의미 있는 시점에 사람들은 revision 번호 외에 직관적인 이름을 붙이길 원한다. 이 때 사용하는 것이 Tag 이다. 이렇듯 분류만 다를 뿐 시스템 안에서의 개념은 Branch 나 별 차이가 없다.

 

참고

서브버전 - 위키백과
CVS - 위키백과
서브버전 기초 매뉴얼

Posted by cloim
작업물2011. 6. 22. 10:32

Button Messages(CommandButtons, RadioButtons, StaticTexts, Pictures, PictureButtons, CheckBoxes)    

PowerBuilder Event ID   Message #
BM_GETCHECK     pbm_bmgetcheck  see windows.h
BM_GETSTATE      pbm_bmgetstate  "
BM_SETCHECK     pbm_bmsetcheck  "
BM_SETSTATE      pbm_bmsetstate  "
BM_SETSTYLE      pbm_bmsetstyle  "

 

Button Notification Codes(CommandButtons, RadioButtons, StaticTexts, Pictures, PictureButtons, CheckBoxes)  
PowerBuilder Event ID   Message #
BN_CLICKED              * pbm_bnclicked (Clicked)       see windows.h
BN_DISABLE                pbm_bndisable   "
BN_DOUBLECLICKED    pbm_bndoubleclicked     "
BN_HILITE                    pbm_hilite      "
BN_PAINT                     pbm_bnpaint     "
BN_UNHILITE                pbm_bnunhilite  "
PowerBuilder Specific   * pbm_bndragdrop (Dragdrop)     PRIVATE
PowerBuilder Specific   * pbm_bndragenter (Dragenter)   PRIVATE
PowerBuilder Specific   * pbm_bndragleave (Dragleave)   PRIVATE
PowerBuilder Specific   * pbm_bndragwithin (Dragwithin) PRIVATE
PowerBuilder Specific   * pbm_bnkillfocus (Losefocus)   PRIVATE
PowerBuilder Specific   * pbm_bnsetfocus (Getfocus)     PRIVATE

 

DropDownListBox Messages (Combo Boxes)  
PowerBuilder Event ID   Message #
CB_ADDSTRING          pbm_cbaddstring see windows.h
CB_DELETESTRING    pbm_cbdeletestring      "
CB_DIR                      pbm_cbdir       "
CB_FINDSTRING          pbm_cbfindstring        "
PowerBuilder Specific  pbm_cbfindstringexact   PRIVATE
CB_GETCOUNT           pbm_cbgetcount  see windows.h
CB_GETCURSEL         pbm_cbgetcursel "
CB_GETDROPPEDCONTROLRECT        pbm_cbgetdroppedcontrolrect     "
CB_GETDROPPEDSTATE      pbm_cbgetdroppedstate   "
CB_GETEDITSEL         pbm_cbgeteditsel        "
CB_GETEXTENDEDUI  pbm_cbgetextendui       "
CB_GETITEMDATA      pbm_cbgetitemdata       "
CB_GETITEMHEIGHT   pbm_cbgetitemheight     "
CB_GETLBTEXT    pbm_cbgetlbtext "
CB_GETLBTEXTLEN pbm_cbgetlbtextlen      "
CB_INSERTSTRING pbm_cbinsertstring      "
CB_LIMITTEXT    pbm_cblimittext "
CB_RESETCONTENT pbm_cbresetcontent      "
CB_SELECTSTRING pbm_cbselectstring      "
CB_SETCURSEL    pbm_cbsetcursel "
CB_SETEDITSEL   pbm_cbseteditsel        "
CB_SETEXTENDEDUI        pbm_cbsetextendui       "
CB_SETITEMDATA  pbm_cbsetitemdata       "
CB_SETITEMHEIGHT        pbm_cbsetitemheight     "
CB_SHOWDROPDOWN pbm_cbshowdropdown      "

 

DropDownListBox Notification Codes (Combo Boxes)        
PowerBuilder Event ID   Message #
CBN_CLOSEUP     pbm_cbncloseup  see windows.h
CBN_DBLCLCK     * pbm_cbndblclk (Doubleclicked) "
CBN_DROPDOWN    pbm_cbndropdown "
CBN_EDITCHANGE  pbm_cbneditchange       "
CBN_EDITUPDATE  pbm_cbneditupdate       "
CBN_ERRSPACE    pbm_cbnerrspace "

CBN_KILLFOCUS   * pbm_cbnkillfocus (Losefocus)  "
PowerBuilder Specific   * pbm_cbnmodified (Modified)    PRIVATE
CBN_SELCHANGE   * pbm_cbnselchange (Selectionchanged)   see windows.h
PowerBuilder Specific   pbm_cbnselendcancel     PRIVATE
PowerBuilder Specific   pbm_cbnselendok PRIVATE
CBN_SETFOCUS    * pbm_cbnsetfocus (Getfocus)    see windows.h
PowerBuilder Specific   * pbm_cbndragdrop (Dragdrop)    PRIVATE
PowerBuilder Specific   * pbm_cbndragenter (Dragenter)  PRIVATE
PowerBuilder Specific   * pbm_cbndragleave (Dragleave)  PRIVATE
PowerBuilder Specific   * pbm_cbndragwithin (Dragwithin)        PRIVATE

 

Edit Control Messages (SingleLineEdits and MultiLineEdits)      
PowerBuilder Event ID   Message #
EM_CANUNDO      pbm_emcanundo   see windows.h
EM_EMPTYUNDOBUFFER      pbm_ememptyundobuffer   "
EM_FMTLINES     pbm_emfmtlines  "
EM_GETFIRSTVISIBLE      pbm_emgetfirstvisibleline       "
EM_GETHANDLE    pbm_emgethandle "
EM_GETLINE      pbm_emgetline   "
EM_GETLINECOUNT pbm_emgetlinecount      "
EM_GETMODIFY    pbm_emgetmodify "
PowerBuilder Specific   pbm_emgetpasswordchar   PRIVATE
EM_GETRECT      pbm_emgetrect   see windows.h
EM_GETSEL       pbm_emgetsel    "
EM_GETTHUMB     pbm_emgetthumb  "
PowerBuilder Specific   pbm_emgetwordbreakproc  PRIVATE
EM_LIMITTEXT    pbm_emlimittext see windows.h
EM_LINEFROMCHAR pbm_emlinefromchar      "
EM_LINEINDEX    pbm_emlineindex "
EM_LINELENGTH   pbm_emlinelength        "
EM_LINESCROLL   pbm_emlinescroll        "
EM_REPLACESEL   pbm_emreplacesel        "
PowerBuilder Specific   pbm_emsetfont   PRIVATE
EM_SETHANDLE    pbm_emsethandle see windows.h
EM_SETMODIFY    pbm_emsetmodify "
EM_SETPASSWORDCHAR      pbm_emsetpasswordchar   "
PowerBuilder Specific   pbm_emsetreadonly       PRIVATE
EM_SETRECT      pbm_emsetrect   "
PowerBuilder Specific   pbm_emsetrectup PRIVATE
EM_SETSEL       pbm_emsetsel    see windows.h
PowerBuilder Specific   pbm_emsettabstops       PRIVATE
EM_SETWORDBREAK pbm_emsetwordbreak      see windows.h
EM_UNDO pbm_emundo      "

 

Edit Control Notification Codes (SingleLineEdits and MultiLineEdits)    
PowerBuilder Event ID   Message #
EN_CHANGE       pbm_enchange    see windows.h
EN_ERRSPACE     pbm_enerrspace  "
EN_HSCROLL      pbm_enhscroll   "
EN_KILLFOCUS    * pbm_enkillfocus (Losefocus)   "
EN_MAXTEXT      pbm_enmaxtext   "
EN_SETFOCUS     * pbm_ensetfocus (Getfocus)     "
EN_UPDATE       pbm_enupdate    "
EN_VSCROLL      pbm_envscroll   "
PowerBuilder Specific   * pbm_endragdrop (Dragdrop)     PRIVATE
PowerBuilder Specific   * pbm_endragenter (Dragenter)   PRIVATE
PowerBuilder Specific   * pbm_endragleave (Dragleave)   PRIVATE
PowerBuilder Specific   * pbm_endragwithin (Dragwithin) PRIVATE
PowerBuilder Specific   * pbm_enmodified (Modified)     PRIVATE

List Box Messages (ListBoxes)

PowerBuilder Event ID   Message #
LB_ADDSTRING    pbm_lbaddstring see windows.h
LB_DELETESTRING pbm_lbdeletestring      "
LB_DIR  pbm_lbdir       "
LB_FINDSTRING   pbm_lbfindstring        "
PowerBuilder Specific   pbm_lbfindstringexact   PRIVATE
LB_GETCARETINDEX        pbm_lbgetcaretindex     see windows.h
LB_GETCOUNT     pbm_lbgetcount  "
LB_GETCURSEL    pbm_lbgetcursel "
LB_GETHORIZONTALEXTENT  pbm_lbgethorizontalextent       "
LB_GETITEMDATA  pbm_lbgetitemdata       "
LB_GETITEMHEIGHT        pbm_lbgetitemheight     "
LB_GETITEMRECT  pbm_lbgetitemrect       "
LB_GETSEL       pbm_lbgetsel    "
LB_GETSELCOUNT  pbm_lbgetselcount       "
LB_GETSELITEMS  pbm_lbgetselitems       "
LB_GETTEXT      pbm_lbgettext   "
LB_GETTEXTLEN   pbm_lbgettextlen        "
LB_GETTOPINDEX  pbm_lbgettopindex       "
LB_INSERTSTRING pbm_lbinsertstring      "
LB_RESETCONTENT pbm_lbresetcontent      "
LB_SELECTSTRING pbm_lbselectstring      "
LB_SELITEMRANGE pbm_lbselitemrange      "
LB_SETCARETINDEX        pbm_lbsetcaretindex     "
LB_SETCOLUMNWIDTH       pbm_lbsetcolumnwidth    "
LB_SETCURSEL    pbm_lbsetcursel "
LB_SETHORIZONTALEXTENT  pbm_lbsethorizontalextent       "
LB_SETITEMDATA  pbm_lbsetitemdata       "
LB_SETITEMHEIGHT        pbm_lbsetitemheight     "
LB_SETSEL       pbm_lbsetsel    "
LB_SETTABSTOPS  pbm_lbsettabstops       "
LB_SETTOPINDEX  pbm_lbsettopindex       "

 

List Box Notification Codes (ListBoxes)
PowerBuilder Event ID   Message #
LBN_DBLCLK      pbm_lbndblclk   see windows.h
LBN_ERRSPACE    pbm_lbnerrspace "
LBN_KILLFOCUS   * pbm_lbnkillfocus (Losefocus)  "
LBN_SELCANCEL   pbm_lbnselcancel        "
LBN_SELCHANGE   * pbm_lbnselchange (Selectionchanged)   "
LBN_SETFOCUS    * pbm_lbnsetfocus (Getfocus)    "
PowerBuilder Specific   * pbm_lbndragdrop (Dragdrop)    PRIVATE
PowerBuilder Specific   * pbm_lbndragenter (Dragenter)  PRIVATE
PowerBuilder Specific   * pbm_lbndragleave (Dragleave)  PRIVATE
PowerBuilder Specific   * pbm_lbndragwithin (Dragwithin)        PRIVATE

 

Scrollbar Notification Codes (Windows and Scrollbars)  
PowerBuilder Event ID   Message #
WM_HSCROLL      pbm_hscroll     see windows.h
WM_VSCROLL      pbm_vscroll     "
SB_TOP  pbm_sbntop      "
SB_BOTTOM       pbm_sbnbottom   "
SB_ENDSCROLL.   pbm_sbnendscroll        "
SB_THUMBPOSITION        pbm_sbnthumbposition    "
SB_LINEDOWN     * pbm_sbnlinedown (Linedown)    "
SB_LINEUP       * pbm_sbnlineup (Lineup)        "
SB_LINELEFT     * pbm_sbnlineup (Lineleft)      "
SB_LINERIGHT    * pbm_sbnlinedown (Lineright)   "
SB_PAGEUP       * pbm_sbnpageup (Pageup)        "
SB_PAGELEFT     * pbm_sbnpageleft (Pageleft)    "
SB_PAGEDOWN     * pbm_sbnpagedown (Pagedown)    "
SB_PAGERIGHT    * pbm_sbnpageright  (Pageright) "
SB_THUMBTRACK   * pbm_sbnthumbtrack (Moved)     "
PowerBuilder Specific   * pbm_sbndragdrop (Dragdrop)    PRIVATE
PowerBuilder Specific   * pbm_sbndragleave (Dragleave)  PRIVATE
PowerBuilder Specific   * pbm_sbndragwithin (Dragwithin)        PRIVATE
PowerBuilder Specific   * pbm_sbndragenter (Dragenter)  PRIVATE
PowerBuilder Specific   * pbm_sbnsetfocus (Getfocus)    PRIVATE
PowerBuilder Specific   * pbm_sbnkillfocus (Losefocus)  PRIVATE

 

Window Messages
PowerBuilder Event ID   Message #
WM_ACTIVATE     * pbm_activate (Activate)       see windows.h
WM_ACTIVATEAPP  pbm_activateapp "
WM_ASKCBFORMATNAME      pbm_askcbformatname     "
WM_CANCELMODE   pbm_cancelmode  "
WM_CHANGECBCHAIN        pbm_changecbchain       "
WM_CHAR pbm_char        "
WM_CHARTOITEM   pbm_chartoitem  "
WM_CHILDACTIVATE        pbm_childactivate       "
WM_CLEAR        pbm_clear       "
WM_CLOSE        * pbm_close (Close)     "
PowerBuilder Specific   * pbm_closequery (Closequery)   PRIVATE
PowerBuilder Specific   pbm_command     PRIVATE
WM_COMMAND      pbm_command     see windows.h
WM_COMPACTING   pbm_compacting  "
WM_COMPAREITEM  pbm_compareitem "
PowerBuilder Specific   pbm_constructor PRIVATE
WM_COPY pbm_copy        see windows.h
WM_CREATE        * pbm_create (Open)    "
WM_CTLCOLOR     pbm_ctlcolor    "
WM_CUT  pbm_cut "
WM_DEACTIVATE   pbm_deactivate  "
WM_DEADCHAR     pbm_deadchar    "
WM_DELETEITEM   pbm_deleteitem  "
WM_DESTROY      pbm_destroy     "
WM_DESTROYCLIPBOARD     pbm_destroyclipboard    "
PowerBuilder Specific   pbm_destructor  PRIVATE
WM_DEVMODECHANGE        pbm_devmodechange       see windows.h
WM_DRAWCLIPBOARD        pbm_drawclipboard       "
WM_DRAWITEM     pbm_drawitem    "
WM_DROPFILES    pbm_dropfiles   "
WM_ENABLE       pbm_enable      "
WM_ENDSESSION   pbm_endsession  "
WM_ENTERIDLE    pbm_enteridle   "
WM_ERASEBKGND   pbm_erasebkgnd  "
WM_FONTCHANGE   pbm_fontchange  "
WM_GETDLGCODE   pbm_getdlgcode  "
WM_GETFONT      pbm_getfont     "
WM_GETMINMAXINFO        pbm_getminmaxinfo       "
WM_GETTEXT      pbm_gettext     "
WM_GETTEXTLENGTH        pbm_gettextlength       "
PowerBuilder Specific   pbm_globalrcchange      PRIVATE
PowerBuilder Specific   pbm_heditcl     PRIVATE
PowerBuilder Specific   pbm_hidewindow  PRIVATE
PowerBuilder Specific   pbm_hookrcresult        PRIVATE
WM_HSCROLL      pbm_hscroll     see windows.h
WM_HSCROLLCLIPBOARD     pbm_hscrollclipboard    "
WM_ICONERASEBKGND       pbm_iconerasebkgnd      "
WM_INITDIALOG   pbm_initdialog  "
WM_KEYDOWN      * pbm_keydown (Key)     "
WM_KEYUP        pbm_keyup       "
WM_KILLFOCUS    pbm_killfocus   "
WM_LBUTTONCLK   * pbm_lbuttonclk (Clicked)      "
WM_LBUTTONDBLCLK        * pbm_lbuttondblclk (Doubleclicked)     "
WM_LBUTTONDOWN  * pbm_lbuttondown (Mousedown)   "
WM_LBUTTONUP    * pbm_lbuttonup (Mouseup)       "
WM_MBUTTONDBLCLK        pbm_mbuttondblclk       "
WM_MBUTTONDOWN  pbm_mbuttondown "
WM_MBUTTONUP    pbm_mbuttonup   "
WM_MDIACTIVATE  pbm_mdiactivate "
WM_MDICASCADE   pbm_mdicascade  "
WM_MDICREATE    pbm_mdicreate   "
WM_MDIDESTROY   pbm_mdidestroy  "
WM_MDIGETACTIVE pbm_mdigetactive        "
WM_MDIICONARRANGE       pbm_mdiiconarrange      "
WM_MDIMAXIMIZE  pbm_mdimaximize "
WM_MDINEXT      pbm_mdinext     "
WM_MDIRESTORE   pbm_mdirestore  "
WM_MDISETMENU   pbm_mdisetmenu  "
WM_MDITILE      pbm_mditile     "
WM_MEASUREITEM  pbm_measureitem "
WM_MOUSEACTIVATE        pbm_mouseactivate       "
WM_MOUSEMOVE    * pbm_mousemove (Mousemove)     "
WM_MOVE pbm_move        "
WM_NCACTIVATE   pbm_ncactivate  "
WM_NCCALCSIZE   pbm_nccalcsize  "
WM_NCCREATE     pbm_nccreate    "
WM_NCDESTROY    pbm_ncdestroy   "
WM_NCHITEST     pbm_nchitest    "
WM_NCLBUTTONDBLCLK      pbm_nclbuttondblclk     "
WM_NCLBUTTONDOWN        pbm_nclbuttondown       "
WM_NCLBUTTONUP  pbm_nclbuttonup "
WM_NCMBUTTONDBLCLK      pbm_ncmbuttondblclk     "
WM_NCMBUTTONDOWN        pbm_ncmbuttondown       "
WM_NCMBUTTONUP  pbm_ncmbuttonup "
WM_NCMOUSEMOVE  pbm_ncmousemove "
WM_NCPAINT      pbm_ncpaint     "
WM_NCRBUTTONDBLCLK      pbm_ncrbuttondblclk     "
WM_NCRBUTTONDOWN        pbm_ncrbuttondown       "
WM_NCRBUTTONUP  pbm_ncrbuttonup "
WM_NEXTDLGCTL   pbm_nextdlgctl  "
WM_NULL Not Yet Available (use Other)   "
WM_PAINT        pbm_paint       "
WM_PAINTCLIPBOARD       pbm_paintclipboard      "
WM_PAINTICON    pbm_painticon   "
WM_PALETTECHANGED       pbm_palettechanged      "
WM_PALETTEISCHANGING    pbm_paletteischanging   "
WM_PARENTNOTIFY pbm_parentnotify        "
WM_PASTE        pbm_paste       "
WM_QUERYDRAGICON        pbm_querydragicon       "
WM_QUERYENDSESSION      pbm_queryendsession     "
WM_QUERYNEWPALETTE      pbm_querynewpalette     "
WM_QUERYOPEN    pbm_queryopen   "
WM_QUEUESYNC    pbm_queuesync   "
WM_QUIT pbm_quit        "
WM_RBUTTONDBLCLK        pbm_rbuttondblclk       "
WM_RBUTTONDOWN  pbm_rbuttondown "
WM_RBUTTONUP    pbm_rbuttonup   "
PowerBuilder Specific   pbm_rcresult    "
WM_RENDERALLFORMATS     pbm_renderallformats    "
WM_RENDERFORMAT pbm_renderformat        "
WM_SETCURSOR    pbm_setcursor   "
WM_SETFOCUS     pbm_setfocus    "
WM_SETFONT      pbm_setfont     "
WM_SETREDRAW    pbm_setredraw   "
WM_SETTEXT      pbm_settext     "
WM_SHOWWINDOW   * pbm_showwindow (Show) "
WM_SIZE * pbm_size (Resize)     "
WM_SIZECLIPBOARD        pbm_sizeclipboard       "
PowerBuilder Specific   pbm_skb "
WM_SPOOLERSTATUS        pbm_spoolerstatus       "
WM_SYSCHAR      pbm_syschar     "
WM_SYSCOLORCHANGE       pbm_syscolorchange      "
WM_SYSCOMMAND   pbm_syscommand  "
WM_SYSDEADCHAR  pbm_sysdeadchar "
WM_SYSKEYDOWN   * pbm_syskeydown (Systemkey)    "
WM_SYSKEYUP     pbm_syskeyup    "
PowerBuilder Specific   pbm_systemerror "
WM_TIMECHANGE   pbm_timechange  "
WM_TIMER        * pbm_timer (Timer)     "
WM_UNDO pbm_undo        "
WM_USER pbm_custom01    "
WM_VKEYTOITEM   pbm_vkeytoitem  "
WM_VSCROLL      pbm_vscroll     "
WM_VSCROLLCLIPBOARD     pbm_vscrollclipboard    "
WM_WINDOWPOSCHANGED     pbm_windowposchanged    "
WM_WINDOWPOSCHANGING    pbm_windowposchanging   "
WM_WININICHANGE pbm_wininichange        "

 

DDE Messages    
PowerBuilder Event ID   Message #
WM_DDE_ACK      pbm_ddeack      see windows.h
WM_DDE_ADVISE   * pbm_ddeadvise (Remotehotlinkstart)    "
WM_DDE_DATA     pbm_ddedata     "
WM_DDE_EXECUTE  * pbm_ddeexecute (Remoteexec)   "
WM_DDE_INITIATE pbm_ddeinitiate "
WM_DDE_POKE     * pbm_ddepoke (Remotesend)      "
WM_DDE_REQUEST  * pbm_dderequest (Remoterequest)        "
WM_DDE_TERMINATE        pbm_ddeterminate        "
WM_DDE_UNADVISE * pbm_ddeunadvise (Remotehotlinkstop)   "

 

DataWindow Messages    
PowerBuilder Event ID   Message #
PowerBuilder Specific   pbm_dwclosedropdown     PRIVATE
PowerBuilder Specific   pbm_dwescape    PRIVATE
PowerBuilder Specific   pbm_dwscrollend PRIVATE
PowerBuilder Specific   pbm_dwscrollhome        PRIVATE
PowerBuilder Specific   pbm_dwscrolllineend     PRIVATE
PowerBuilder Specific   pbm_dwscrolllinehome    PRIVATE

 

DataWindow Notification Codes  
PowerBuilder Event ID   Message #
PowerBuilder Specific   pbm_dwnbacktabout       PRIVATE
PowerBuilder Specific   * pbm_dwnchanging (Editchanged) PRIVATE
PowerBuilder Specific   * pbm_dwndberror (Dberror)      PRIVATE
PowerBuilder Specific   * pbm_dwndragdrop (Dragdrop)    PRIVATE
PowerBuilder Specific   * pbm_dwndragenter (Dragenter)  PRIVATE
PowerBuilder Specific   * pbm_dwndragleave (Dragleave)  PRIVATE
PowerBuilder Specific   * pbm_dwndragwithin (Dragwithin)        PRIVATE
PowerBuilder Specific   pbm_dwndropdown PRIVATE
PowerBuilder Specific   pbm_dwngraphcreate      PRIVATE
PowerBuilder Specific   * pbm_dwnhscroll (Scrollhorizontal)     PRIVATE
PowerBuilder Specific   * pbm_dwnitemchange (Itemchanged)       PRIVATE
PowerBuilder Specific   * pbm_dwnitemchangefocus (Itemfocuschanged)     PRIVATE
PowerBuilder Specific   * pbm_dwnitemvalidationerror (Itemerror)        PRIVATE
PowerBuilder Specific   pbm_dwnkey      PRIVATE
PowerBuilder Specific   * pbm_dwnkillfocus (Losefocus)  PRIVATE
PowerBuilder Specific   * pbm_dwnlbuttonclk (Clicked)   PRIVATE
PowerBuilder Specific   * pbm_dwnlbuttondblclk (Doubleclicked)  PRIVATE
PowerBuilder Specific   pbm_dwnlbuttondown      PRIVATE
PowerBuilder Specific   pbm_dwnlbuttonup        PRIVATE
PowerBuilder Specific   pbm_dwnmbuttonclk       PRIVATE
PowerBuilder Specific   pbm_dwnmbuttondblclk    PRIVATE
PowerBuilder Specific   pbm_dwnmousemove        PRIVATE
PowerBuilder Specific   * pbm_dwnprintend (Printend)    PRIVATE
PowerBuilder Specific   * pbm_dwnprintpage (Printpage)  PRIVATE
PowerBuilder Specific   * pbm_dwnprintstart (Printstart)        PRIVATE
PowerBuilder Specific   pbm_dwnprocessenter     PRIVATE
PowerBuilder Specific   pbm_dwnrbuttonclk       PRIVATE
PowerBuilder Specific   pbm_dwnrbuttondblclk    PRIVATE
PowerBuilder Specific   pbm_dwnrbuttondown      PRIVATE
PowerBuilder Specific   pbm_dwnrbuttonup        PRIVATE
PowerBuilder Specific   * pbm_dwnresize (Resize)        PRIVATE
PowerBuilder Specific   * pbm_dwnretrieveend (Retrieveend)      PRIVATE
PowerBuilder Specific   * pbm_dwnretrieverow (Retrieverow)      PRIVATE
PowerBuilder Specific   * pbm_dwnretrievestart (Retrievestart)  PRIVATE
PowerBuilder Specific   * pbm_dwnrowchange (Rowfocuschanged)    PRIVATE
PowerBuilder Specific   * pbm_dwnsetfocus (Getfocus)    PRIVATE
PowerBuilder Specific   * pbm_dwnsql (SQLPreview)       PRIVATE
PowerBuilder Specific   pbm_dwntabdownout       PRIVATE
PowerBuilder Specific   pbm_dwntabout   PRIVATE
PowerBuilder Specific   pbm_dwntabupout PRIVATE
PowerBuilder Specific   * pbm_dwnupdateend (Updateend)  PRIVATE
PowerBuilder Specific   * pbm_dwnupdatestart (Updatestart)      PRIVATE
PowerBuilder Specific   * pbm_dwnvscroll (Scrollvertical)       PRIVATE

Menu-Related Window Messages    


PowerBuilder Event ID   Message #
WM_INITMENU     pbm_initmenu    see windows.h
WM_INITMENUPOPUP        pbm_initmenupopup       "
WM_MENUCHAR     pbm_menuchar    "
WM_MENUSELECT   pbm_menuselect  "

 

User-Defined Events    
PowerBuilder Event ID   Message #
WM_USER pbm_custom01    see windows.h         .       .         .       .
WM_USER + 74    pbm_custom75    "

 

Custom User Object Control User-Defined Events  
PowerBuilder Event ID   Message #
PowerBuilder Specific   * pbm_uondragdrop (Dragdrop)    PRIVATE
PowerBuilder Specific   * pbm_uondragenter (Dragenter)  PRIVATE
PowerBuilder Specific   * pbm_uondragleave (Dragleave)  PRIVATE
PowerBuilder Specific   * pbm_uondragwithin (Dragwithin)        PRIVATE
pbm_uonexternal01       0
pbm_uonexternal25       24


네이버 카페 : 파워빌더 모임 오와조(owajo)님 글 펌

http://cafe.naver.com/pentaeduclub/16379

Posted by cloim
작업물2011. 6. 15. 14:22
내비게이션 바 아래에 동적으로 늘어나는 옵션 메뉴 넣기 from xguru in twitter

OAuth
 
페이스북, 트워터, 구글 리더 등에서 글, 그림, URL, 파일등을 공유하는 라이브러리
 
네이트 Open API 라이브러리
 
페이스북 연동 라이브러리
 
TCP, UDP Socket Class 라이브러리
 
기본 클래스를 확장한 라이브러리
 
iPhotoDiary, 육아일기 어플리케이션
 
DropBox를 통한 파일 공유 API 사용 예제 소스
 
JSON ----------------------------------------------------------------------------
JSONKit
 
SBJSON
 
TouchJSON
 
XML Parser ------------------------------------------------------------------------------
 
zip/unzip ------------------------------------------------------------------------------
 
AVPlayer (LGPL로 FFmpeg, SoundTouch를 사용)
 
무인코딩 동영상 플레이어 VLC iPhone, iPad
 
web server
 
bar code, QR code
 

http://cocoadev.tistory.com/#recentTrackback에서 공개한 내용임.
      *  이미지 편집 함수 모음( 스케일, 회전, crop 등)
  • 다양한 UI 구현
  • 테이블뷰셀 커스터마이징
  • HTTP GET/POST 요청
  • XML 파싱
  • 사진 앨범, 카메라, 지도 이미지 접근
  • 맵뷰 및 위치정보
  • 푸시 노티피케이션

여러 UI 모음 : photo viewer, etc
http://github.com/facebook/three20 (초기에는 facebook 어플이었으나 현재는 여러 UI 모음으로 바뀜 )

map

E-mail
 
 
달력


계산기

트위터 클라이언트

facebook

rss reader

ebook reader

blog

백업, 동기화
구글 리더 동기화 http://code.google.com/p/gris/

time tracking

게임
http://www.joystiq.com/2009/03/24/carmack-releases-open-source-wolfenstein-for-iphone/

google toolbox

http://code.google.com/p/google-toolbox-for-mac/

택배


이미지 프로세싱
http://code.google.com/p/simple-iphone-image-processing/


증강현실

coverflow 대체 구현

정규표현식 라이브러리

라이브러리 : JSON, DOM XML, Google Data APIs, Twitter, Flick, Game Engines, Unit Testr

기타


맥부기 어플 개발 네이버 카페 http://cafe.naver.com/mcbugi/30423
낙수(taeyeung2) 님 게시글 펌


Posted by cloim
작업물2011. 3. 16. 11:54

Xcode 를 실행하여 Window-based Application 템플릿으로 새 프로젝트를 생성한다.



프로젝트 명은 HelloiPhone 으로, Core Data 사용여부 체크는 해제한다.


HelloiPhoneAppDelegate.h : 헤더, 클래스 정의

HelloiPhoneAppDelegate.m : 모듈, 클래스 구현

MainWindow.xib : 인터페이스 정의


이렇게 세 파일이 만들어졌다.

 

HelloiPhoneAppDelegate.h 파일에서 아래와 같이 코딩.

#import <UIKit/UIKit.h>


@interface HelloiPhoneAppDelegate : NSObject <UIApplicationDelegate> {
    UILabel *myText;
    BOOL txtState;
}


@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UILabel *myText;
@property BOOL txtState;


- (IBAction)changeText:(id)sender;

@end 


HelloiPhoneAppDelegate.m 파일에서 아래와 같이 코딩.

#import "HelloiPhoneAppDelegate.h"


@implementation HelloiPhoneAppDelegate


@synthesize window=_window;
@synthesize myText, txtState;


- (IBAction)changeText:(id)sender{
    if(txtState){
        myText.text = @"Hello, World";
        txtState = NO;
    } else {
        myText.text = @"Hello, iPhone";
        txtState = YES;
    }
}


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    [self.window makeKeyAndVisible];
    return YES;
}

… 이후 생략 

 

MainWindow.xib 에서 그림과 같이 객체 생성




Hello, World 는 UILabel 을, Change Text 는 UIButton 객체이다.

 

Connections Inspector 에서 HelloiPhone App Delegate 를 선택, Outlet 과 Action 을 연결한다.


 


myText 와 Label 을, changeText 와 Button 의 Touch Up Inside 를 연결.

 

모두 저장하고 Build And Run.



change Text 버튼을 누를 때 마다 Label 의 글이 변하는 것을 확인할 수 있다.


아이폰 프로그래밍 (객체 지향 프로그래밍) 을 위해서는 MVC 패턴에 대해 이해할 필요가 있다.



MVC 패턴?

MVC (Model-View-Controller) 패턴을 사용하면 사용자 인터페이스로부터 비즈니스 로직을 분리하여 애플리케이션의 시각적 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향없이 쉽게 고칠 수 있는 애플리케이션을 만들 수 있다 (@위키백과;모델-뷰-컨트롤러).

 

MVC 패턴의 예

예를 들자면 이런 상황에서

  • 더러워진 옷이 있다.

(세탁을 하기로 한) 더러워진 옷 = 빨랫감

세탁기에게 빨래를 시키기 위해서 세탁기의 기능 버튼을 이용한다 (물 높낮이, 강약, 탈수 등).

세탁기는 주어진 빨래와 주어진 기능을 토대로 빨래를 하고 끝나면 세탁된 옷을 돌려준다.


더러워진 옷은 그 종류가 다양하며 그 자체로는 (더러워졌으므로) 사용할 수 없다. 고로, 더러워진 옷은 세탁이라는 행위를 통해서 사용가능한 의류가 된다. 프로그래밍의 관점에서 더러워진 옷은 일종의 데이터 ( = Model) 라고 볼 수 있다.

기능 버튼은 사람과 세탁기의 중간 역할을 한다. 세탁기 스스로는 어떤 행위도 할 수 없고 사람 또한 임의로 전기신호나 다른 물리력을 통해 세탁기를 움직이게 할 수 없다. 기능 버튼은 사용자 인터페이스 ( = View) 라고 할 수 있다.

세탁기는 어떤 종류의 더러워진 옷이 주어져도 빨래를 해야한다. 고로, 옷에 독립적이어야 한다. 세탁기는 일을 수행하는 입장에서 비즈니스 로직 ( = Controller = Class) 이라고 볼 수 있다.

 

MVC 패턴의 이점

M, V, C 가 각각 어떤 것들인지 감을 잡았으니 이런 생각을 해보자.

더러워진 옷은 세탁이라는 행위 말고도 그냥 버린다던지 걸레로 만든다던지 하는 다른 차원의 일을 할 수 있다. = 프로그램 상에서 가공하고자 하는 데이터는 프로그램이 참조/변환할 수 있지만 프로그램 자체에 종속적이지는 않다.

기능 부분의 남은 세탁 시간을 표시하는 부분의 패널은 경우에 따라 냉장고의 온도를 표시하거나 저울의 중량을 표시하는 데에 사용될 수도 있다. = 뷰는 사용자에게 가장 밀접하며 MVC 패턴 중 가장 상호 의존도가 높은 편이며 재사용의 범위가 다른 것들에 비해 좁다. 따라서 새로운 프로그램을 만들 때 가장 높은 빈도로 신규 생성되는 패턴이다.

세탁기를 만드는 공장에서 매년 새 제품을 개발해 판매할 때 모든 제품의 기능 버튼을 동일하게 만들 수는 없다. 하지만 궁극적으로 세탁은 ‘물을 넣고-통을 돌리고-탈수 한다’ 라는 공통의 행위를 만족시켜야 한다. 세탁기 제조 회사에서는 이러한 공통행위를 위한 부품을 미리 만들어 놓고 새로운 제품을 개발할 때 마다 기능 버튼만 바꿔서 세탁기를 만드는 것이 훨씬 효율적일 것이다. = 특정 기능을 하는 클래스를 만들어 둔다면 그 기능을 사용하는 모든 프로그램은 해당 클래스를 그냥 가져다 씀으로써 개발 비용을 절감할 수 있다.

 

MVC 의 측면에서 본 우리가 만든 앱

Hello, World – Hello, iPhone 프로그램은 MVC 패턴을 제대로 적용하기에는 그 단위가 너무 작지만 (굳이 지정해야 한다면) 모델은 Hello, World / Hello, iPhone 이라는 문자열, 뷰는 xib 파일, 컨트롤러는 클래스 파일로 볼 수 있다.

 

IBOutlet, IBAction – Connection 에 관하여

인터페이스 빌더에서 생성한 Label 객체에 IBOutlet 으로 선언해 둔 myText 를, Button 객체에 changeText 메소드를 연결하는 행위는 뷰와 컨트롤러의 접점을 만들어 줌 으로써 각각의 패턴에서 서로를 인식할 수 있도록 하기 위함이다. 이렇게 함으로써 클래스 파일 (=컨트롤러)은 다른 모양의 xib 파일에 적용해도 IBOutlet 과 IBAction 을 적절히 연결하기만 하면 얼마든지 재사용 가능하다. 

IBOutlet 은 인터페이스 상의 특정 객체와 클래스 내 객체변수의 연결 고리가 된다. 클래스 내에서 인터페이스 상의 객체를 가르키기 위해서는 인테페이스 상의 객체를 식별할 수 있는 객체변수가 있어야 하는데 이 객체변수를 IBOutlet 이라는 키워드로 정의해 두는 것이다.

IBAction 은 IBOutlet 과 비슷한 개념으로 인터페이스 상의 특정 객체의 상태/동작에 반응하는 메소드를 선언하는 키워드 이다.

 

@property 와 @synthesize

클래스 내에서 사용되는 객체 변수는 getter/setter 라는 방식을 통해 그 값을 참조/할당 한다. Objective-C 2.0 이전까지는 이러한 접근자 메소드를 직접 만들어 주었어야 했는데 2.0 부터는 @property 키워드를 통해 해당 객체 변수가 접근자 메소드를 이용해 값의 참조/할당이 이루어진다고 지정할 수 있다. @synthesize 키워드는 이러한 접근자 메소드가 모듈 내에서 자동적으로 생성됨을 알리는 역할을 한다. 즉, 두 키워드를 이용하고 컴파일을 하면 바이너리 단 에서는 프로그래머가 일일이 입력하지 않은 접근자 메소드들이 자동으로 프로그램에 합성된다.

 

@property 의 용법

@property 키워드를 보면 nonatomic, retain 과 같은 속성들과 함께 사용됨을 알 수 있는데 그 속성의 종류는 아래와 같다 (@Outsider's Dev Story).

  • getter=getterName - getter의 이름을 getterName로 지정
  • setter=setterName - setter의 이름을 setterName로 지정
  • readwrite - 기본동작으로 getter와 setter를 모두 생성
  • readonly - getter만 생성. 값을 할당하려고 하면 컴파일 오류 발생
  • assign - 기본동작이며 setter가 간단한 할당을 사용. (예 location = where;) 객체를 소유할 필요가 없을때 사용.
  • retain - assign과 비슷하지만 레퍼런스 카운트를 증가시킴. 포인터객체를 할당할 경우에 외부에서 객체가 릴리즈되어 파괴된 객체를 참조하는 문제를 막기 위해 클래스가 멤버객체를 소유하도록 레퍼런스 카운트를 증가시킨다.(이전 값은 release)
  • copy - 할당하는데 객체의 복사본을 사용. 포인터 객체의 경우 레퍼런스의 값이 바뀌어 프로퍼티의 값이 바뀌는 걸 막기 위해 setter에서 복사본을 만들어서 할당
  • nonatomic - atomic이 기본동작. 멀티 스레드 환경에서 동시에 여러 스레드에서 하나의 프로퍼티에 접근하려면 문제가 생기는데 이를 보호하기 위해 atomic 을 사용. 단일 스레드 환경에서는 nonatomic 을 사용


Posted by cloim
작업물2011. 3. 9. 10:25


iRDesktop 은 RDP 를 이용해 윈도우의 터미널 서비스를 이용할 수 있게 해주는 iPhone 앱이다.

GNU GPL 에 의거 오픈소스 프리웨어 이며 소스를 다운로드 받아 빌드하기 위해선 OpenSSL 이 필요하다.

단순히 소스를 받아 컴파일을 시도하면 OpenSSL 라이브러리를 찾을 수 없다는 에러가 나는데 래와 같은 방법으로 정상적으로 빌드 할 수 있다.

이 내용은 네이버 카페 ‘맥부기 애플(iOS,Mac) 개발자모임’ 의 쑤근쑤근(juncon) 님의 게시글 (원문 : 오픈소스 RDP iRdesktop 빌드하기) 를 참고하여 작성한 것이다.


  • 준비물

당연히 맥, Xcode.

iRDesktop 의 소스 (이 문서에서는 현재 가장 최신 버전인 1.0.5 를 사용한다)

 

  • OpenSSL 빌드 하기

iRDesktop 소스를 다운받아 압축을 적당한 곳에 해제하면 소스 폴더 내 ‘OpenSSL-DownloadAndBuild.command’ 와 ‘OpenSSL-Thinstuff.diff’ 파일이 있는것을 확인할 수 있다.

OpenSSL-DownloadAndBuild.command 파일은 OpenSSL 라이브러리 소스코드를 다운로드하여 언패킹하고 이를 OpenSSL-Thinstuff.diff 파일을 이용해 코드 패치한 다음 빌드하는 배치파일이다.

해당 파일을 파인더에서 더블클릭하여 실행하면 /Users/사용자이름/ 경로에 파일이 다운받아지고 진행되기 때문에 터미널에서 타이핑하여 실행해야 한다.

터미널을 열고 iRDesktop 소스가 다운받아진 경로로 이동한 뒤 아래와 같이 입력한다.


irdesktop-src-1.0.5 cloim$ ./OpenSSL-DownloadAndBuild.command


소스 다운 – 언패킹 - 패치하는 과정이 지나고 빌드를 시작하는데 i386 버전 (시뮬레이터 용) 은 정상적으로 빌드되지만 armv6 버전 (iPhone 용) 은 libcrypto.a 와 libssl.a 를 찾을 수 없다는 메세지를 표시하며 제대로 빌드되지 않은것을 확인할 수 있다 (iPhone SDK 4.1 이 설치되어있다면 나타나지 않는다).

이를 해결하려면 먼저 어떤 버전의 SDK 가 설치되어있는지 확인해야 하는데 이는 Xcode 를 실행하여 메뉴의 About Xcode – More Info, 시스템 정보 보기 – 소프트웨어 – Developer 에서 iPhone OS 부분을 확인하면 알 수 있다. 현재 나의 SDK 버전은 4.2 이다.

이제 OpenSSL-Thinstuff.diff 파일을 적당한 편집기로 연 다음 ‘4.1’ 로 찾기를 해서 해당 부분을 자신의 버전에 맞게 수정하고 저장한 다음 다시 command 파일을 터미널에서 실행하면 이제 정상적으로 모두 컴파일 되는것을 확인할 수 있다.

 

  • iRDesktop 빌드 하기

이제 Xcode 에서 iRDesktop 의 프로젝트 파일을 열고 Base SDK 를 자신의 SDK 버전으로 변경한 뒤 Build And Run 을 해보자.


/Users/cloim/Documents/iRdesktop-src-1.0.5/NIBs/PropertyEditorResolution.xib:21:0 Pattern colors are not supported by the iPhone SDK for iOS versions prior to 3.0.


과 같은 에러가 난다. xib 파일의 패턴 컬러가 iOS 3.0 이전 버전에서는 지원되지 않는다는 얘기인 듯 하다.

무언가 속성 중에 3.0 이전버전으로 셋팅되어 있다는 얘기.

오류메세지를 더블 클릭해보면 인터페이스 빌더가 열리고 다시 인터페이스 빌더의 에러표시를 클릭해보면 PropertyEditorResolution.xib Info 창이 뜨며 Deployment Target 부분에 iOS 2.0 으로 되어있는것을 확인할 수 있다.

이를 3.0 으로 변경한뒤 저장하자.

다시 Build And Run 을 눌러보면 아무 에러없이 깔끔하게 빌드되고 시뮬레이터에서 정상적으로 동작하는 앱을 확인할 수 있다. :D


Posted by cloim
작업물2011. 3. 8. 20:14

환경준비

맥, Xcode

 

Objective-C

C 에 기반, Smalltalk 에서 Java 와 Objective-c 로 갈라져 나왔다

@문자를 사용한 추가적 문법

@property 키워드를 이용해 get/set 처리

 

클래스 선언 (헤더, .h)

@interface 클래스명 : 슈퍼클래스 {

    인스턴스 변수 선언

}

- (리턴타입)인스턴스 메소드 명:매개변수 선언

@end

 

클래스 구현 (모듈, .m)

@implementation 클래스

~ 헤더에서 선언한 것들을 구현 ~

- (리턴타입)인스턴스 메소드 명:매개변수 선언

{

    내용

}

@end


기본문법

[object message:parameter];

 

IBAction, IBOutlet

IBAction : Interface Builder 에서 그려준 객체 중 동작을 처리하는 객체들에 대해 사용자의 인터랙션에 따라 메소드를 정의하는 키워드

IBOutlet : Interface Builder 에서 그려준 객체를 소스상에서 판별 할수있게 하는 키워드, IB – Xcode 로의 접점

 

액션 메소드의 일반적인 형태

- (IBAction) 메소드명:(id)sender;

 

아웃렛의 일반적인 형태

@property (nonatomic, retain) IBOutlet 객체클래스명 *객체명;

 

Outlet 을 연결하는 방법

객체의 connection 에서 App Delegate 로,

App Delegate 의 connection 에서 객체로

아웃렛은 App Delegate 에서 컨트롤 드래그하여 객체로

액션은 객체에서 App Delegate 로 컨트롤 드래그

 

Object 의 생성과 소멸

alloc : 메모리에 자리 잡게한다, init : 초기화 –> retain count : 1

retain count 가 0 이상이면 메모리 상에 살아있고 0 이 되면 소멸된다.

retain   :  –> retain count : 2

release :  –> retain count : 1

 

SandBox

어플리케이션은 보호된 영역 내에서만 리소스에 접근할 수 있다.

Posted by cloim
작업물2011. 3. 4. 21:00

OpenSSL 은 네트워크를 통한 데이터 통신에 쓰이는 보안 프로토콜인 TLS (Transport Layer Security, 전송계층 보안) 와 SSL (Secure Socket Layer, 보안 소켓 계층) 의 오픈소스 구현판이다 (@위키피디아).

TLS 는 넷스케이프 사에서 전자상거래 등의 보안을 위해 개발한 SSL 이 이후 IETF 에서 표준화 되면서 바뀐 이름이며 때문에 먼저 TLS 에 대해 간략하게 알아본다.

 

TLS (@IBM Developer Networks - OpenSSL API를 이용한 보안 프로그래밍, Part 1: API의 개요 (한글))

C/S 응용 프로그램이 네트워크로 통신하는 과정에서 도청, 간섭, 위조당하는 것을 방지하기 위해 설계되었다. 암호화를 통해 최종단의 인증, 통신 기밀성을 유지시켜 주기도 한다.

 

TLS 의 3단계 기본 절차

  1. 지원 가능한 알고리듬 서로 교환 : C/S 가 암호 Suite 를 교환, 키 교환 및 인증에 사용될 암호화 방법, 메시지 인증 코드 (MAC) 가 결정된다.
  2. 키 교환, 인증
  3. 대칭키 암호로 암호화하고 메시지 인증

 

왜 OpenSSL 인가?

SSL 툴킷의 종류에는 OpenSSL 말고도 GNU General Public License 하에 배포되는 GNU TLS 와 Mozilla Network Security Services (NSS) 도 있다고 한다. 그럼에도 불구하고 OpenSSL 이 많이 쓰이는 이유는 라이센싱이나 상위버전에 대한 지원, 외부 라이브러리 종속성 등 때문이라고 한다.

 

OpenSSL 을 사용하기 위해 필요한 것

  • 최신버전의 OpenSSL : OpenSSL 의 공식 사이트 에서 최신 버전 (혹은 버전별) 소스 코드를 다운 받을 수 있다. 이 소스 코드를 다운 받을 경우 라이브러리를 사용하기 위해서 직접 컴파일을 해야한다. 다른 방법으로 서드 파티가 컴파일하여 배포하는 바이너리 라이브러리를 사용해도 되며 이때는 물론 컴파일 하는 수고를 할 필요가 없다.
Posted by cloim
작업물2011. 3. 2. 16:30
* 참 조 : dwoX

1. 라이브러리 헤더 블럭 (512 (1024) Byte, 괄호안은 유니코드)

시작 위치 끝 위치

Type

정보

1

4

Char(4) HDR*

5

18 (32)

String ‘PowerBuilder’ + 0x00 + 0x00

19 (33)

22 (40)

Char(4) PBL 포맷 버전 (0400 / 0500 / 0600)

23 (41)

26 (44)

Long 생성일자 (GMT +/- 0:00)

29 (45)

FF

String 라이브러리 코멘트

285 (559)

288 (562)

Long 첫 SCC Data Block 의 오프셋

289 (563)

292 (566)

Long SCC Data 의 Net 사이즈

 

2. 비트맵 블럭 (512 Byte)

시작 위치 끝 위치

Type

정보

1

4

Char(4) FRE*

5

8

Long 다음 블럭의 오프셋, 혹은 0

9

512

Bit(504) 비트맵, 각 Bit 는 하나의 블럭에 해당

(512 - 8) * 8 = 4032 Blocks are referenced


3. 노드 블럭 (3072 Byte)

시작 위치 끝 위치

Type

정보

1

4

Char(4) NOD*

5

8

Long 다음 좌변 블럭의 오프셋, 혹은 0

9

12

Long 상위 블럭의 오프셋, 혹은 0

13

16

Long 다음 우변 블럭의 오프셋, 혹은 0

17

18

Integer 블럭 내 남은 공간 (기본 3040 Byte 중)

19

20

Integer 현재 블럭 내 알파벳 순 첫 객체명

21

22

Integer 노드 내 엔트리 갯수

23

24

Integer 현재 블럭 내 알파벳 순 마지막 객체명

33

FF

Chunks ENT* 부분


4. 엔트리 (가변 길이, 괄호안은 유니코드)

시작 위치 끝 위치

Type

정보

1

4

Char(4) ENT*

5

8 (12)

Char(4) (CharW(4)) PBL 버전 (0400 / 0500 / 0600)

9 (13)

12 (16)

Long 첫번째 데이터 블럭의 오프셋

13 (17)

16 (20)

Long 객체 크기 (Net 사이즈)

17 (21)

20 (24)

Long 수정일자 (GMT +/- 0:00)

21 (25)

22 (26)

Integer 코멘트 길이

23 (27)

24 (28)

Integer 객체명 길이

25 (29)

FF

String (StringW) 객체명


5. 데이터 블럭 (512 Byte)

시작 위치 끝 위치

Type

정보

1

4

Char(4) DAT*

5

8

Long 다음 블럭의 오프셋, 혹은 0

9

10

Integer 데이터 블럭 길이

11

XXX

Blob{} 데이터 (최대 길이는 502 Byte)


6. 트레일러 블럭 (in DLL/EXE), 항상 마지막 블럭 (512 Byte)

시작 위치 끝 위치

Type

정보

1

4

Char(4) TRL*

5

8

Long 라이브러리 헤더 (HDR*) 의 오프셋

이후 SCC DATA, PB6/7 Status Flags, SCC DATA Chunk 에 관한 내용은 내가 쓰는 PowerBuilder 7 버전에서는 확인되지 않아서 생략.

 

위의 내용을 토대로 PBL 파일 내 객체, 각 객체의 소스, 검색 기능 등을 구현한 프로그램을 AutoIt 으로 작성해 보았다.

다운은 여기

Posted by cloim
작업물2011. 2. 19. 10:43

1. WAC SDK 실행 후 File - New - WAC 1.0 Widget Project 을 선택하여 뜨는 프로젝트 생성 창에 프로젝트 명을 입력 한 뒤 Finish 버튼을 누른다.


2. Package Explorer 에 생성된 프로젝트의 명을 우클릭 - Run As - Widget Application 을 누른다.

3. 동작 확인
; Android 에뮬레이터의 속도가 매우 느리므로 수시로 개발/수정 후 실행하려면 답답할 수 있다. 이는 에뮬레이터의 최초 실행 시 OS 인스톨 및 Core Library 의 인스톨 등의 전과정을 거치기 때문인데 최초 AVD 를 구동시킨 뒤 종료하지 말고 소스의 업데이트 후 테스트할 때 Run As 만 눌러서 실행하면 이러한 과정을 거치지 않아 보다 빨리 테스트 해 볼 수 있다.

Posted by cloim
작업물2011. 2. 19. 10:40

1. WAC SDK (eclipse) 종료
; 현재 구동하고 있는 모든 WAC SDK (eclipse) 를 종료한다.

2. 시스템 등록 정보 - 고급 - 환경변수

; emulator: ERROR: unknown virtual device name: 'android' 와 같이 에뮬레이터가 가상 디바이스를 찾을 수 없다고 나오는 이유는 에뮬레이터가 android SDK 의 경로를 제대로 참조하지 못해서 생기는 에러이다. 환경변수 상에 해당 경로를 지정해 주는 것으로 해결할 수 있다.

2. 시스템 변수에 '변수 이름 : ANDROID_SDK_HOME, 값 : WAC SDK 가 설치된 경로 내 tools 폴더' 지정
; 시스템 변수 쪽에 'ANDROID_SDK_HOME' 이라는 이름으로 새 변수를 생성한다. 이때 변수 값은 WAC SDK 가 설치된 경로 내의 tools 폴더 (WAC SDK 를 기본값으로 설치한 경우 C:\wac_sdk_1.0\tools) 로 지정하고 확인.


3. WAC SDK (eclipse) 실행, Android ADK and AVD Manager 실행

WAC SDK 를 실행하여 상단 메뉴 중 Android ADK and AVD Manager 를 실행한다.

4. 존재하는 모든 AVD 를 삭제하고 New 를 눌러서 새 AVD 생성
; 설치 기본값으로 지정된 AVD 및 임의로 추가한 AVD 가 있다면 모두 삭제한 뒤 새 AVD 를 생성한다.
AVD 의 이름은 원하는대로, Target 은 Android 2.2 - API Level 8, SD Card 의 사이즈는 원하는대로 (최소 9 MB) 지정한 뒤 Create AVD 를 눌러 생성한다.

5. 생성한 AVD 를 선택 후 Start 를 눌러 구동
제대로 AVD 가 생성되었는지 확인을 위해 생성된 AVD 를 선택한 후 Start - Launch 를 눌러 에뮬레이터를 구동한다.

6. 성공적으로 에뮬레이터가 실행하는지 확인
; 에뮬레이터가 그림과 같이 구동하였다면 성공!

Posted by cloim