며칠 OSX 공부를 중단하고 "토비의 스프링"을 보고 있다. 현재 5장까지 본 상태인데, 샘플로 제공하는 예제 코드도 모두 제대로 돌아가고 진행되는 것에 대한 설명이 자세하게 되어 있어 책의 두께에 비해서 진도는 빨리 나갈 수 있는 교제이다. 샘플 타이핑 치는 시간을 제외하고는 소설책 읽듯이 술술 넘어간다.
대체 왜! 자바에서 Spring으로 통일되었는지 궁금했는데, 5장까지만 보아도 답이 보인다.
5장까지 보고 내린 결론은 Spring은 디자인 패턴 사용을 강제하고 있다는 것이다. 물론 디자인 패턴이고 나발이고 사용할 생각이 없는 상태에서 Spring을 적용할 수도 있지만, 이건 Spring을 사용하는 게 아니라, 그냥 Spring의 jar 파일만 포함해 둔 것이지 아닐까 한다.
PHP의 CI를 보면서 아주 단기간의 학습으로 나름 괜찮은 퀄리티가 나오는 코드를 만들수 있다는 것에 충격을 받았는데, CI는 Spring에 비한다면 정말 '세발의 피' 라고 보여진다. "토비의 스프링"이라는 책이 아주 좋은 교재 인 것도 있지만, 그 동안 개발해 오면서 고민하던 것들에 대해 책을 보면 볼 수록 명쾌하게 답변을 제시 하고 있다. 근 3년간 HTML5 기술에 묻혀서 놀고 있었다는 생각이 많이 든다. 아까운 3년의 시간!
아무튼 5장 까지 보고 난 다음 하고 싶은 말은
"대체 Spring Framework 개발자들은 뭘 만들어 놓은 거야? 이런걸 공짜로 푼다고?"
위의 한마디 이다.
2013년 12월 18일 수요일
10장(아카이브)
10장은 데이터 저장기능에 관련된 챕터이다. 10장의 내용을 한줄로 줄인다면,
어플리케이션에서 생성한 데이터를 파일로 저장/불러오기 하기 위해서 object 를 아카이브(serialize) 하는 방법을 설명 하고 있다.
아카이브(serialize)는 자바나 기타 언어에서도 사용하고 있는 방법이기 때문에, 이해하는데 특별한 어려움은 없다. 다만 Cocoa 프레임워크의 저장/불러오기 관련 함수가 어떤 것들이 있는지 구경 해 보는 의미가 있다. 역시 추후에 기능 사용시 다시 돌아와서 봐야 할 내용으로 생각 된다.
내일 다시 11장 진도를 나가 보도록 하자. 오늘 여기까지...
어플리케이션에서 생성한 데이터를 파일로 저장/불러오기 하기 위해서 object 를 아카이브(serialize) 하는 방법을 설명 하고 있다.
아카이브(serialize)는 자바나 기타 언어에서도 사용하고 있는 방법이기 때문에, 이해하는데 특별한 어려움은 없다. 다만 Cocoa 프레임워크의 저장/불러오기 관련 함수가 어떤 것들이 있는지 구경 해 보는 의미가 있다. 역시 추후에 기능 사용시 다시 돌아와서 봐야 할 내용으로 생각 된다.
내일 다시 11장 진도를 나가 보도록 하자. 오늘 여기까지...
bash shell로 파일 삭제 cronjob
find mdate 를 이용하여 백업 파일 삭제하는 cronjob 을 걸어 두었는데, find mdate 의 결과가 장비마다 이상하게 나오는 원인 파악 불명인 이상한 현상이 보여서, 그냥 ls, awk 를 이용해서 만들었다. find mdate 의 결과가 왜 이상하게 나오는지 정말 궁금하다???
#!/bin/bash #_yyyymmddhhMM.tar.gz 형식의 파일을 run time 기준으로 삭제 한다. # 원래는 find -mdate 로 만들었으나, find -mdate 의 결과가 ls -al 로 테스트 했을때 # 장비별로 다르게 나오는 파악하기 힘든 원인으로 인해 ls, awk 를 이용하여 삭제 하는 것을 만들었음 # # 추후 _yyyymmddhhMM.tar.gz 파일 형식이면 SRC_DIR 만 수정하여 그대로 사용하면 된다. # (실제로는 " _yyyymmddhhMM." 까지만 형식이 같으면 사용 가능하다.) # find mtime 으로 검색이 원하는데로 돌지 않아서, 파일명 매핑으로 변경 한다. #DAY_AGO=7 #/usr/bin/find /data/backup/fsp/src -mtime +$DAY_AGO -exec rm -rf {} \; # 파일을 삭제할 디렉토리 지정 SRC_DIR=/data/backup/fsp/src1 # SRC_DIR 이 존재하는 디렉토리 인지 체크 한다. if [ ! -d ${SRC_DIR} ]; then # cronjob 에서 /dev/null 2>&1 로 redirect 할 것이기 때문에 echo 는 넣어둔다. echo "${SRC_DIR} not exist target directory. terminate shell." exit fi # 파일 삭제할 기준을 설정(파일 이름에서 날짜가 스크립트 run 타임 기준으로 7일 이전) AGO_DAY=`date +%Y%m%d%H%M -d '7 day ago'` # ls를 이용하여 파일명을 가져온다. FILE_LIST=`ls ${SRC_DIR}` # 파일명으로 돌면서 조건 판단한다. for fname_full in ${FILE_LIST}; do # 파일명의 포맷이 aaa_yyyymmddhhMM.tar.gz 로 되어 있기 때문에 "." 으로 분리된 제일 처음을 가져온다 fname=`echo $fname_full | /bin/awk -F"." '{print $1}'` # 가져온 제일 처음 값에서 "_" 으로 분리된 날짜값을 가져온다. cdate=`echo $fname | /bin/awk -F"_" '{print $2}'` # 가져온 날짜값이 존재하는지 체크 한다. if [ "X"${cdate} != "X" ]; then # 가져온 날짜 값이 기준 시간 이전이면 if [ $cdate -le $AGO_DAY ]; then # 삭제 한다. cronjob 에서 /dev/null 2>&1 로 redirect 할 것이기 때문에 echo 는 넣어둔다. echo "/bin/rm -rf ${SRC_DIR}/${fname_full}" /bin/rm -rf ${SRC_DIR}/${fname_full} fi fi done
2013년 12월 15일 일요일
8장(NSArrayController)
8장은 정말 말이 나오지 않을 정도로 마법 같은 것을 알려 준다. Interface Builder를 이용하여 몇 번 클릭과 약간의 코딩으로 쓸만한 테이블뷰를 만든다. 지금 당장은 기억나지만, 앞으로 8장은 앞으로 계속 몇 번이고 다시 볼 것으로 예상한다.
8장의 내용 하나만 알아도 책값은 충분하다고 생각될 정도로 환상적인 결과를 보여주는 챕터이다.
Interface Builder와 코코아 내장 클래스를 이용한 코딩 하는 테크닉에 대해서 알려주는 것이어서 내용을 보고 직접 해 보는 것 외에는 설명할 게 없다.
마지막에 등장하는 연습 문제 2개는 내일 해 보기로 하고 오늘은 여기까지! 9장이 아주 기대 된다.
8장의 내용 하나만 알아도 책값은 충분하다고 생각될 정도로 환상적인 결과를 보여주는 챕터이다.
Interface Builder와 코코아 내장 클래스를 이용한 코딩 하는 테크닉에 대해서 알려주는 것이어서 내용을 보고 직접 해 보는 것 외에는 설명할 게 없다.
마지막에 등장하는 연습 문제 2개는 내일 해 보기로 하고 오늘은 여기까지! 9장이 아주 기대 된다.
Mysql 명령어 모음
sql문을 사용할때 마다 계속 찾곤 하는데, 추후 필요할지 몰라서 기록해 둔다. (현재 RasorSQL 을 사용하기 때문에 당장 필요는 없는데, 추후 어떻게 될지 모르니...)
1. 데이터 베이스 생성
mysql> CREATE DATABASE spring CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
2. user 생성
mysql> GRANT ALL PRIVILEGES ON spring.* TO '아이디'@'localhost' IDENTIFIED BY '패스워드';
1. 데이터 베이스 생성
mysql> CREATE DATABASE spring CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
2. user 생성
mysql> GRANT ALL PRIVILEGES ON spring.* TO '아이디'@'localhost' IDENTIFIED BY '패스워드';
나머지는 필요할때 마다 추가 하도록 하자.
2013년 12월 14일 토요일
Spring 개발툴 STS
자바 개발을 하지 않아서 맥북에 이클립스 조차 깔려 있지 않은 상태이다. Spring 공부를 위해서 이클립스를 인스톨 하려고 했는데, "토비의 스프링" 9장에 보니, STS 란 것을 소개 하고 있었다. 요즘은 이클립스에 여러 플러그인이 합쳐져서, 플러그인을 모아둔 특정 버전의 이클립스를 사용하는 가 보다. 세상 참 많이 변했다는...
STS 는 Spring.io 사이트에서 무료로 받을 수 있다. spring.io 에서 Spring Tool Suite 란으로 들어가면 된다. Java 이기 때문에 OSX 버전도 있다. 3.4.0.RELEASE 버전을 다운로드 받았다.
다운로드 받으면 친절하게 dmg 파일로 만들어져 있다.(spring-tool-suite-3.4.0.RELEASE-e4.3.1-macosx-cocoa-x86_64-installer.dmg) dmg 파일을 삽입하면 인스톨러 파일이 보인다.
인스톨러 파일을 실행하면 전형적인 인스톨 단계로 진행된다. 설치 디렉토리만 개발에서 사용하는 디렉토리로 바꿔 주었고 나머지는 디폴트로 인스톨 진행 하였다. 인스톨 완료하면 끝내면서 STS 를 실행 할지 물어 보는데, 실행하지 않게 해서 인스톨러 종료 했다.
STS 의 실행 파일은 설치된 디렉토리 하단에 sts-3.4.0.RELEASE/STS 로 존재한다.
STS 를 더블클릭해서 실행하면, workspace 디렉토리를 물어 보는데 원하는 디렉토리로 잡아 주면 된다. 그리고, Ok 하면 STS 가 처음으로 실행 된다.
실행되고 나면 나머지 설정은 추후에 하기로 하고, 가장 중요한 문서 인코딩 설정을 한다.
메뉴바에서 "Spring Tool Suite > 환경 설정" 으로 들어가서 "General > Workspace" 항목에서 "Text file encoding" 을 원하는 값으로 바꿔 주자. (역시 EUC-KR 이 디폴트로 되어 있는..) 편하게 사용하기 위해서 UTF-8 로 바꿔 줬다.
일단 여기까지 하고 사용해 보기로 하자. 자바를 하도 오랫만에 하고 Spring 을 모르니, 필요한 것은 차근 차근 설정 하기로 한다.
J2EE? JavaEE?
변명이지만 아주 오랫동안 자바를 하지 않아서 자바 진영에서 사용하는 단어도 헷갈린다.
그중에서 J2EE 와 JavaEE. 같은 것으로 알고 있었지만, 확실히 하기 위해서 찾아보았다.
검색 결과, 역시 위키. 위키에 다 나온다. (설명된 위키 페이지 바로 가기)
간단하게 설명하자면 J2EE 1.4 버전까지는 J2EE 라고 불렀지만, 다음 버전부터는 개명을 해서 JavaEE 라고 부른다. 즉, J2EE 1.4 다음은 JavaEE 5라는 것!
자바 버전명에 대해서 자세한 내용도 역시 다른 위키 페이지에 있다. 자바쪽은 이름 외우기도 힘들다. 버전에 대한 위키의 내용을 옮겨 왔다.
그중에서 J2EE 와 JavaEE. 같은 것으로 알고 있었지만, 확실히 하기 위해서 찾아보았다.
검색 결과, 역시 위키. 위키에 다 나온다. (설명된 위키 페이지 바로 가기)
간단하게 설명하자면 J2EE 1.4 버전까지는 J2EE 라고 불렀지만, 다음 버전부터는 개명을 해서 JavaEE 라고 부른다. 즉, J2EE 1.4 다음은 JavaEE 5라는 것!
자바 버전명에 대해서 자세한 내용도 역시 다른 위키 페이지에 있다. 자바쪽은 이름 외우기도 힘들다. 버전에 대한 위키의 내용을 옮겨 왔다.
자바의 버전은 보통 Java SE 또는 JDK/JRE의 버전으로 말한다.JDK(Java Development Kit)는 표준 라이브러리를 포함하며, JDK 버전이 바뀜에 따라 이 라이브러리가 확대되고 API가 바뀐다. 초기 1.0/1.1 버전에서 JDK/JRE의 명칭을 사용하다가 Java 1.2가 발표되면서 J2SDK/J2RE라고 개명하여 사용했으나 기존의 명칭으로 사용하는 사람들이 많아 현재는 다시 JDK/JRE의 명칭으로 돌아왔다. 또한 J2SE(Java2 Standard Edition)라는 명칭 또한 Java SE(Java Standard Edition)으로 변경되었다. [2]자바 버전 체계의 메이저 버전(소숫점 위)이 계속 1.x로 고정되어 마이너 업데이트로 여기는 경우들이 있어 1.5 버전부터 5.0(1.5), 6(1.6)의 형태로 제품 버전을 코드 버전과 별개로 발표하고 있다.[3]언어 자체는 자바 언어 명세(Java Language Specification, JLS)에서 정의되며, 판(edition)으로 구분한다. JDK가 확장되는 동안 언어는 2판에서 거의 변화가 없었으나, JDK 5와 함께 바뀐 JLS 3판에서 제네릭(generic) 타입, 애너테이션(annotation) 같은 기능이 도입되면서 상당히 바뀌었다.JDK 7에서는 자바 언어에 상당한 변화가 계획되어 있었으나 JDK 7로 예정되었던 변화가 JDK 7와 JDK 8으로 나눠지면서 JDK 7에는 상대적으로 사소한 언어 특성만이 추가되었다. 구체적으로 이진수 표기 추가, 가독성을 위해 수 표기에 밑줄(underscore)을 허용, 스위치 문(switch에서 문자열 사용, 제네릭 타입 객체 생성 시 타입 추론(type inference), 자동 자원 해제를 위한 try 문법, 여러 예외 타입을 동시에 잡도록 허용하는 문법 등이 추가되었다.
7장(키-벨류 코딩, 키-벨류 옵저빙)
7장을 보고 난 다음 든 생각은 "이런 것도 모르면서 iPhone 개발을 하려고 생각했었나?" 이다. stackoverflow 에서 "OSX 개발자는 대부분 이 책에서부터 시작했다"는 말이 맞을 정도로 interface builder를 사용하면서 가장 궁금한 부분을 알려 준다.
interface builder를 거의 사용하지 않았지만, 한 번씩 사용하면서 안타까웠던 게 "내가 생성한 변수를 여러 가지 UI component와 어떻게 연결 못 시키는가?" 였었다. 그런데 7장에서 이것을 알려 준다.
처음 키-벨류 코딩, 키-벨류 옵저빙이라고 해서 sqlite 인가했었는데, 말 그대로 변수에 바인드를 걸고, 특정 UI Component를 바인드된 변수에 옵저버로 등록하는 것이다. 이렇게 하려면 키-벨류 코딩이 필요하다.
그리고 setter와 getter를 쉽게 사용할 수 있게 만드는 프로퍼티에 대해서 설명하고 있다. 프로퍼티의 속성은 다른 책에서도 설명되어 있지만, 보기 좋게 정리되어 있어서 옮겨 본다.
interface builder를 거의 사용하지 않았지만, 한 번씩 사용하면서 안타까웠던 게 "내가 생성한 변수를 여러 가지 UI component와 어떻게 연결 못 시키는가?" 였었다. 그런데 7장에서 이것을 알려 준다.
처음 키-벨류 코딩, 키-벨류 옵저빙이라고 해서 sqlite 인가했었는데, 말 그대로 변수에 바인드를 걸고, 특정 UI Component를 바인드된 변수에 옵저버로 등록하는 것이다. 이렇게 하려면 키-벨류 코딩이 필요하다.
그리고 setter와 getter를 쉽게 사용할 수 있게 만드는 프로퍼티에 대해서 설명하고 있다. 프로퍼티의 속성은 다른 책에서도 설명되어 있지만, 보기 좋게 정리되어 있어서 옮겨 본다.
- assign : 단순히 대입만 한다. 포인터가 아닌 스칼라형(정수형이나 실수형)에 사용
- strong : 말 그대로 strong 하게 연관 관계를 맺는 것이다. strong으로 엮여 있는 것은 메모리에서 해제되는 것이 방지됨
- weak : strong의 반대. 메모리에서 해제되면 자동으로 nil 값으로 설정됨
- copy : 프로퍼티 대상이 문자열일 때나 뮤터블 서브클래스를 이용하는 클래스를 사용할 때 주로 이용
- nonatomic : getter, setter에 lock을 걸지 않음(스레드로 돌지 않을 때)
- atomic : getter, setter에 lock을 걸 때(스레드로 돌 때 접근 경쟁을 막기 위해서)
- readwrite : 기본값으로 설정되는 것. 프로퍼티가 read, write 모두 가능
- readonly : 프로퍼티가 read만 가능하게 만들 때(setter가 무시됨)
noatomic, atomic은 스레드 프로그램에서 필수인데, 프로퍼티의 속성으로 쉽게 처리 가능할 수 있게 만든 게 눈에 띈다.
마지막으로 키 경로(Key Paths) 에 대해서 설명하고 있는데, 이건 기억해 두면 추후 코딩량을 많이 줄이게 될 것으로 예상한다.
8장으로 넘어가 보도록 하자. 짧게 챕터가 구성되어 있으니 짬짬이 시간을 내 보는 처지에서 아주 좋다.
2013년 12월 13일 금요일
6장(도우미 객체)
6장은 Delegate와 도우미객체에 대해서 설명하고 있다. (그동안 도우미 객체와 Delegate가 같은 것으로 생각하고 있었는데, 잘못 알고 있었다. 기본 component들을 사용하지 않았으니, 잘못 알고 있었어도 이상 없이 코딩할 수 있었었다.)
한 번씩 샘플로 TableView를 사용 때, Delegate 외에 DataSource 라는 이상한 놈을 사용했는데, 이것이 도우미 객체이다. 자신과 특정한 일을 하는 것을 분리하는 패턴이 정말 유용하게 보인다.
그런데 책에 문제점이 눈에 띈다. 번역의 문제인지 원본의 문제인지 모르겠지만, 예제 코드가 책에 나온 데로 하면 제대로 돌지 않는다. iOS 개발도 하지 않고 OSX 개발을 전혀 하지 않은 경우는 좀 헤맬듯싶다. 대신 헤매다 보면 기능에 대해서 보다 정확하게 알 수 있다.
대신 6장 마지막에 나오는 연습 문제는 괜찮다. 2개의 연습 문제를 해결 할 수 있다면 protocol 사용하기 전의 Delegate 에 대해서 충분히 이해했다고 생각하면 된다.
6장은 좀 실망을 안고, 7장으로 고고싱~
한 번씩 샘플로 TableView를 사용 때, Delegate 외에 DataSource 라는 이상한 놈을 사용했는데, 이것이 도우미 객체이다. 자신과 특정한 일을 하는 것을 분리하는 패턴이 정말 유용하게 보인다.
그런데 책에 문제점이 눈에 띈다. 번역의 문제인지 원본의 문제인지 모르겠지만, 예제 코드가 책에 나온 데로 하면 제대로 돌지 않는다. iOS 개발도 하지 않고 OSX 개발을 전혀 하지 않은 경우는 좀 헤맬듯싶다. 대신 헤매다 보면 기능에 대해서 보다 정확하게 알 수 있다.
대신 6장 마지막에 나오는 연습 문제는 괜찮다. 2개의 연습 문제를 해결 할 수 있다면 protocol 사용하기 전의 Delegate 에 대해서 충분히 이해했다고 생각하면 된다.
6장은 좀 실망을 안고, 7장으로 고고싱~
5장(타깃/액션)
5장의 2장에 연속된 내용이다. 2장에서 간략하게 설명한 것에 대해서 5장에서 자세하게 설명하고, interface builder의 또 다른 사용법에 대해서 알려 준다.
interface builder의 또 다른 사용법인 Assistant Editor를 이용하는 것은 예전에 아주 감탄하면서 본 것이었는데, 그동안 까맣게 잊고 있었다.
디버깅의 한 방법으로 Zombie Object를 생성할 수 있는 것을 알려주는데, 앞으로 요긴하게 사용할 것으로 생각된다.
또한, 예제로 TTS를 이용한 것을 보여주는데 함수 호출 한 줄로 TTS가 되다니. 정말 간단하다. 근데 영어만 되어서 ㅜㅜ
마지막으로 연습 문제를 하나 제시하는데, 책만 제대로 보면 아주 쉽게 만들 수 있다. 5장까지 공부한 내용을 최종 정리하는 연습 문제 인 것 같은 느낌이 드는데, 6장부터는 보다 새로운 것을 알려 줄 것 같은 기대가 생긴다.
interface builder의 또 다른 사용법인 Assistant Editor를 이용하는 것은 예전에 아주 감탄하면서 본 것이었는데, 그동안 까맣게 잊고 있었다.
디버깅의 한 방법으로 Zombie Object를 생성할 수 있는 것을 알려주는데, 앞으로 요긴하게 사용할 것으로 생각된다.
또한, 예제로 TTS를 이용한 것을 보여주는데 함수 호출 한 줄로 TTS가 되다니. 정말 간단하다. 근데 영어만 되어서 ㅜㅜ
마지막으로 연습 문제를 하나 제시하는데, 책만 제대로 보면 아주 쉽게 만들 수 있다. 5장까지 공부한 내용을 최종 정리하는 연습 문제 인 것 같은 느낌이 드는데, 6장부터는 보다 새로운 것을 알려 줄 것 같은 기대가 생긴다.
2013년 12월 12일 목요일
스프링....토비의 스프링 3.1
내년 목표 중의 하나인 스프링을 공부하기 위해서 책을 샀다. (사실 Spring Framework 이 대체 뭐기에 요즘 Java 하면 Spring이라는 말밖에 나오지 않게 만들었는지가 많이 궁금했다. 얼마나 좋은 Framework 이길래.) 많은 분이 스프링의 교과서라고 불리는 "토비의 스프링".
그런데....그런데....
책을 받아 보고, 책 두께에 그냥 질려 버렸다. 1권, 2권 통틀어서 대략 1,700페이지 정도로 보이는데, 대체 이걸 어떻게 봐야 할지 난감하다. 책을 받아본 순간에, 20년도 더 된 고등학생 시절에 맨투맨 영어 참고서 처음 봤을 때와 같은 느낌을 받았다. 그때 맨투맨 영어 참고서가 6권짜리로 기억난다.
아무튼, 목표를 새웠으니 보긴 봐야 할 텐데, 쉬엄쉬엄 보자. 1권에서 책장 빠르게 넘겨 가면서 제목 정도만 훑어 봤지만, 내용은 알찬듯하다. 화이팅!
그런데....그런데....
책을 받아 보고, 책 두께에 그냥 질려 버렸다. 1권, 2권 통틀어서 대략 1,700페이지 정도로 보이는데, 대체 이걸 어떻게 봐야 할지 난감하다. 책을 받아본 순간에, 20년도 더 된 고등학생 시절에 맨투맨 영어 참고서 처음 봤을 때와 같은 느낌을 받았다. 그때 맨투맨 영어 참고서가 6권짜리로 기억난다.
아무튼, 목표를 새웠으니 보긴 봐야 할 텐데, 쉬엄쉬엄 보자. 1권에서 책장 빠르게 넘겨 가면서 제목 정도만 훑어 봤지만, 내용은 알찬듯하다. 화이팅!
4장(메모리 관리)
Objective-C도 C이기 때문에 메모리 관리가 중요하다. C 개발할 때부터 메모리 문제 발생하면 디버깅할 때 무진장 머리 아프다고 생각해서, 메모리 문제는 가장 중요하게 체크 하고 웬만하면 이런 상황을 만들지 않거나 최소화하려고 노력해 왔다. 때문에, 예전 Objective-C 책이나 iPhone 개발 책을 볼 때 가장 주의 깊게 본 부분이다.
그동안 iOS 개발을 하지 않아서 Objective-C에서 특징적인 메모리 관리 부분을 다 잊어버리고 있었는데, 4장에서 아주 쉽게 떠올릴 수 있게 도와주었다. 그리고 iOS5에서 ARC가 왜 필요한지에 대해서 이해하게 되었다. ARC 처음 볼 때는 좋은 점을 몰랐는데, 요즘 iOS WRT 급하게 만든 경험으로 ARC가 프로그램 구현에서 많은 부분을 도와주었다는 것을 깨닫게 되었다.
4장에서는 ARC 부터 시작 하지 않고, 예전 고전적인 메모리 할당, 해제 부터 시작하고 있는데 ARC 를 제대로 이해하기 위해서는 이 부분이 상당히 중요하다. ARC 란게 컴파일러가 자동으로 코드를 넣어 주는 것이기 때문에, 고전적인 메모리 관리에 대해서 알고 있어야 ARC 결과에 대해서 개발자가 상상을 할 수 있다.
예전에 공부한 것과 더불어 복습을 하자면 메모리 관리의 룰은 다음과 같다.
[reference count 가 증가 하는 경우]
그동안 iOS 개발을 하지 않아서 Objective-C에서 특징적인 메모리 관리 부분을 다 잊어버리고 있었는데, 4장에서 아주 쉽게 떠올릴 수 있게 도와주었다. 그리고 iOS5에서 ARC가 왜 필요한지에 대해서 이해하게 되었다. ARC 처음 볼 때는 좋은 점을 몰랐는데, 요즘 iOS WRT 급하게 만든 경험으로 ARC가 프로그램 구현에서 많은 부분을 도와주었다는 것을 깨닫게 되었다.
4장에서는 ARC 부터 시작 하지 않고, 예전 고전적인 메모리 할당, 해제 부터 시작하고 있는데 ARC 를 제대로 이해하기 위해서는 이 부분이 상당히 중요하다. ARC 란게 컴파일러가 자동으로 코드를 넣어 주는 것이기 때문에, 고전적인 메모리 관리에 대해서 알고 있어야 ARC 결과에 대해서 개발자가 상상을 할 수 있다.
예전에 공부한 것과 더불어 복습을 하자면 메모리 관리의 룰은 다음과 같다.
[reference count 가 증가 하는 경우]
- alloc
- new
- copy(mutableCopy 포함)
위의 세 가지 경우는 무조건 reference count 가 증가 한다. 또한 개발자가 강제로 reference count 를 증가 시키려면 retain 을 사용하면 된다.
reference count 가 증가한다면 반대로 reference count 를 감소 시켜 줘야 하는데, 이럴때 사용하는 것이 release 이다. 고전적인 메모리 관리는 위의 세 경우 일때는 쌍을 맞추어서 release 를 시켜 줘야 한다.
또한 NSArray object 와 같은 경우는 object 를 array 에 push 할때 자동으로 add 되는 object 를 retain 시키고, pop 할때 자동으로 release 시키게 된다.(NSDictionary 등 기본으로 제공되는 object set 인 경우는 언급 하지 않았지만, 동일하게 retain, release 하게 될 것으로 예상 된다)
autorelease 에 대해서, 이게 정말 제대로 이해가 되지 않았는데 이번에 어느 정도 이해하게 되었다.(주위에 OSX 개발자가 없어서 제대로 이해한 것인지 자신은 없지만, 추후 개발 할때 알게 될 것으로 생각하며 제대로 이해 했다고 그냥 생각 하자 ^^;)
autorelease 로 release 된 것은 release 예약이라고 볼 수 있는데, 예약 해 둔게 과연 어느 시점에 실행될지 정확하게 이해하지 못했는데, "이벤트 루프의 끝" 이라는 말에서 정확하게 이해 되었다.
java 에서는 object 의 메소드 호출이라고 말을 하는데, Objective-C 에서는 메소드 호출이 아니라 object 로 메시지를 보낸다고 말을 한다. 결국 object 로 메시지 이벤트를 발생 시키는 것으로 보여진다. 즉, "이벤트 루프의 끝" 이란 것은 object 로 메시지 보낸 것이 완료 되었을때 라는 말과 동일한 것이 아닐까 한다.
그리고 임의로 autorelease pool 을 사용하는 이유는 개발자가 임의로 autorelease pool 을 만들고, 임의로 생성된 autorelease pool 에 autorelease 를 예약하고 이벤트 루프가 끝나기 전에 예약된 release 를 실행 시키기 위해서라고 보여 진다.
마지막으로 ARC 에 대해서...iOS 개발에 대해서 제대로 공부 하기 시작 했을때가 iOS5 때 부터 였다. ARC 가 최초로 적용 될때 인데, 그때 다른 개발자의 블로그를 보면 "이해하기 힘들다", "사용하기 힘들다", "코드가 상상이 안간다" 등등의 이유로 ARC 를 사용하지 않고 개발을 한다는 말이 많았는데, 물론 라이브러리 들이 ARC 로 되어 있지 않다는 것도 큰 이유 중의 하나 였다.
그런데, 그 당시 그냥 스치고 지나간 말인 ARC 를 사용하므로 인해 reference count 보다는 "객체의 관계" 에 더욱 신경 쓸 수 있다는 말이 있었다. reference count 는 그냥 프로그램 코딩상의 관점이고, "객체의 관계"는 좀 더 고차원적인 설계의 문제이다.(어떻게 보면 같을 수 있지만......^^;) 아무튼 좀 더 폭 넗게 생각해서 프로그램을 할 수 있게 되었다는게 중요하다.
아무튼 4장도 다시 공부를 시작하는 입장에서 예전 기억을 떠올리는 많은 도움이 되었다.
타임캡슐(2013년형) 3TB 설치기
예전에 회사에서 프린터를 구입 할때, 네트웍 카드가 없는 프린터(HP LaserJet P3010)를 구입해서 그 동안 MS윈도우 PC 하나에 USB 로 프린터를 붙여서 사용하고 있었다.
그런데, MS윈도우 서버가 필요해서 프린터가 붙어 있는 컴퓨터의 MS윈도우 버전을 올리고 난 다음 부터 프린터가 되었다 안 되었다...지 마음대로 돌고 있는 상태 였다. 내가 사용하는 맥북에서도 프린터기를 이용할 수 없는 상태 ㅜㅜ
마침 회사에서 장비 살수 있는 기회가 있어서 3TB 짜리 애플 타임캡슐과 맥미니 서버 풀 옵션으로 구입하게 되었다. 그런데, 안 좋은 소리 들어 가면서 이렇게 구입 하게 만들어 놨더니, 다른 사람이 중간에 쏙 끼어 들어 구입한 장비를 가져 가는 사태가 발생 했다. 짜증 이빠이 되어서 타임 캡슐 까지 던져 줬는데....설치 못한다고 한마디 하고 케이스 뜯지도 않고 있는 상황을 보다 못해서, 그냥 내가 설치 하기로 하였다. 아오~ 욕나오는....
아무튼, 회사 네트웍 구성 때문에 타임 캡슐을 무선랜 기능 끄고 설치 해야 해서 약간 헤맷다. 더더군다나 나도 처음 사용하는 것이 었기 때문에.....
그럭저럭 설치해서 타임 캡슐 잡히고 프린터 까지 이젠 정상적으로 동작하게 되었다.
타임 캡슐 설정은 다음과 같다. 혹시 동일하게 사용하는 사람 있으면 참조 하면 된다.
1번 그림에서 흰색의 타임캡슐을 클릭하면 설정 할수 있는 팝업이 뜬다.
일렬 번호는 삭제 했다....^^;
편집 버튼을 누르면 타임캡슐의 설정 화면이 나온다. 총 5개 탭메뉴로 구성 되어 있다.
베이스 스테이션 설정에서 타임 캡슐의 이름을 주고, 패스워드 설정을 한다.
타임 캡슐 설치 메뉴얼을 보면 WAN 포트에 LAN 선을 꼽아라고 되어 있는데, 타임 캡슐을 공유기 모드로 사용하지 않아야 하기 때문에 WAN 포트에 랜선을 꼽지 않고 일반 랜 포트(타임 캡슐 뒷면 구멍중 가장 위의 구멍)에 랜선을 꼽았다. Fig4 는 회사 공유기로 부터 IP 받아온 상태 화면이다.
무선은 그냥 죽였다. 주위 다른 사무실, 회사 내부 등등 워낙 WI-FI 가 많아서 신호 방해 하지 않기 위해서 그냥 죽였다. 휴대기기에서 프린터 사용하려고 하면 그때 생각 해보기로 했다. 또한, 무선 끄더라도 동일망 내라면 휴대기기에서도 프린터 사용 가능 할 것으로 생각 된다.
무선을 끄면 자동으로 라우터 모드가 "끔(브리지 모드)" 로 바뀐다. 그냥 그대로 두면 된다.
마지막으로 디스크...파일 공유 활성화 시키고, 공유 디스크 보안은 "계정 사용" 으로 바꿨다. 3TB 짜리라도 아무나 접속해서 막 쓰면 관리하기도 힘드니....
맥에서야 아무런 문제 없이 잘 사용되는데, 이젠 MS 윈도우 에서 프린터 할 수 있게 한번 해 보도록 하자.
MS 윈도우는 Bonjour 프린터 마법사 프로그램 설치가 필요하다. 다음 사이트로 가서 다운로드 가능하다.
개인적으로 하나 사서 집에 있는 iptime 있는 자리를 대신하고 싶은데, 이러면 와이프에게 엄청난 소리 들을것 같은 불길한 예감이 흐흐흐...내년에 생각해 보도록 하자!
그런데, MS윈도우 서버가 필요해서 프린터가 붙어 있는 컴퓨터의 MS윈도우 버전을 올리고 난 다음 부터 프린터가 되었다 안 되었다...지 마음대로 돌고 있는 상태 였다. 내가 사용하는 맥북에서도 프린터기를 이용할 수 없는 상태 ㅜㅜ
마침 회사에서 장비 살수 있는 기회가 있어서 3TB 짜리 애플 타임캡슐과 맥미니 서버 풀 옵션으로 구입하게 되었다. 그런데, 안 좋은 소리 들어 가면서 이렇게 구입 하게 만들어 놨더니, 다른 사람이 중간에 쏙 끼어 들어 구입한 장비를 가져 가는 사태가 발생 했다. 짜증 이빠이 되어서 타임 캡슐 까지 던져 줬는데....설치 못한다고 한마디 하고 케이스 뜯지도 않고 있는 상황을 보다 못해서, 그냥 내가 설치 하기로 하였다. 아오~ 욕나오는....
아무튼, 회사 네트웍 구성 때문에 타임 캡슐을 무선랜 기능 끄고 설치 해야 해서 약간 헤맷다. 더더군다나 나도 처음 사용하는 것이 었기 때문에.....
그럭저럭 설치해서 타임 캡슐 잡히고 프린터 까지 이젠 정상적으로 동작하게 되었다.
타임 캡슐 설정은 다음과 같다. 혹시 동일하게 사용하는 사람 있으면 참조 하면 된다.
<Fig1. 맥북에서 본 AirPort 유틸리티 화면> |
1번 그림에서 흰색의 타임캡슐을 클릭하면 설정 할수 있는 팝업이 뜬다.
<Fig2. 설정 들어가기 직전> |
편집 버튼을 누르면 타임캡슐의 설정 화면이 나온다. 총 5개 탭메뉴로 구성 되어 있다.
<Fig3. 베이스 스테이션 설정> |
<Fig4. 인터넷 설정> |
<Fig5. 무선 설정> |
<Fig6. 네트워크 설정> |
<Fig7. 디스크> |
맥에서야 아무런 문제 없이 잘 사용되는데, 이젠 MS 윈도우 에서 프린터 할 수 있게 한번 해 보도록 하자.
MS 윈도우는 Bonjour 프린터 마법사 프로그램 설치가 필요하다. 다음 사이트로 가서 다운로드 가능하다.
다운로드 받은 것을 설치하면(바탕 화면에 아이콘 생성 하도록 최종 선택), 바탕화면에 Bonjour 프린터 마법사 아이콘이 보인다. 아이콘 클릭해서 실행 시키면, 프린터기가 보일 것이다.
선택해서 설치하면 되는데, 프린터 드라이버를 물어 본다. 이건 상황에 맞게 선택 하면 된다.(회사 프린터기는 HP LaserJet P3010 이어서 "HP LaserJet P3011/P3015 PCL6 Class Driver" 을 선택 했다)
프린터기 설치 이후, 제어판으로 가면 설치된 프린터기가 보일 것이다.(만일 안 보이면 당연히 제대로 설치가 안된 것.....해결 방법? 이렇게 발생하지 않어서 아직 모른다는 흐흐...)
개인적으로 하나 사서 집에 있는 iptime 있는 자리를 대신하고 싶은데, 이러면 와이프에게 엄청난 소리 들을것 같은 불길한 예감이 흐흐흐...내년에 생각해 보도록 하자!
3장(Objective-C)
3장쯤 되면 objective-c 문법 설명에 대해서 대부분의 책들이 나오는데, 이건 좀 틀리다. 솔직히 objective-c 는 동일한 책에서 세트로 묶어서 보는 것 보다는 다른 교재로 공부 하는 것이 훨씬 낮다.
그런 면에서 3장에서는 Objective-C 문법 이런것 보다는 네이밍룰이나 기본구조에 대해서 설명을 하고 있다. 마지막 부분에 디버거 사용법에 대해서 약간 언급 한 것도 괜찮았다.
그동안 디버그창의 버튼들을 사용하지 않고, gdb 명령어로 사용 했었는데, 버튼들이 명령어와 동일하다는 것을 알게 해 주었다. 물론 100% 대체는 불가능 하지만, 가장 많이 사용되는 next, step in, step out 정도를 타이핑 치지 않고 클릭으로 할 수 있는 것이 어디냐~
또한 예전에는 알았는데, 지금 다 까먹은 Analyze 에 대해서 언급을 하여 다시 기억을 떠 올리게 만들어 준것도 좋다.
마지막으로 Selector 가 클래스 메서드를 색인화 하고, 객체를 생성하는 클래스 구조체를 가리키는 포인터인 isa 에 대해서 설명 해 둔게 정말 꿀정보이다. 이런 것들이 정말 중요한데, 알려주는 교제들이 드물거나 아니면 이해 못하게 비비꼬아 설명 하고 있으니.....
아무튼 3장 제목만 보고 그냥 건너 뛸려고 했는데, 건너 뛰지 않은게 다행이다.
그럼 4장으로 고고씽~
2013년 12월 11일 수요일
2장(시작해보자!)
iOS WRT 개발시에는 interface builder 를 사용하지 않고 했기 때문에, iOS 공부시 이 부분을 대충 넘어 갔었는데, 2장을 보면서 interface builder 사용법에 대해서 다시 한번 상기 시키는 계기가 되었다. 그리고 대충 넘어간 부분에 대해서도 확실하게 이해가 되었다.
확실 하게 이해하기 된 부분은 다음과 같다. 맞게 이해 한건지 ㅜㅜ
[단어정의]
[인터페이스 빌드를 위한 형타입]
인터페이스 빌더를 위해서 사용되는 타입들
그리고, 2장 마지막에 이벤트에 대한 그림이 2장 있는데, 이벤트 처리 되는 방식에 대해서 단순 명료하게 바로 이해 할 수 있는 그림이다.
확실 하게 이해하기 된 부분은 다음과 같다. 맞게 이해 한건지 ㅜㅜ
[단어정의]
- 애플리케이션(Application) : 윈도우를 만드는 프로그램
- 툴(Tool) : GUI 가 없는 프로그램. 명령행 유틸리티나 daemon이 전형적인 예.
- 번들(Bundle) 또는 프레임워크(Framework) : 애플리케이션이나 도구에 쓰이는 자원이 들어 있는 디렉토리. 애플리케이션은 실행될 때 번들을 동적으로 불러온다. 일반적으로 애플리케이션은 컴파일될 때 프레임워크와 링크 된다.
[XIB 와 NIB 의 차이점]
예전에 iOS 책 보면서 NIB, XIB 파일이 같다는 글을 본 기억이 있는데, 틀린 말이 었다.(아니면 iOS 는 같은 건지...?)
- XIB : 사용자 인터페이스 객체들과 이들의 연결 정보를 나타내는 XML
- NIB : 애플리케이션을 빌드할 때 XIB 파일은 NIB 파일로 컴파일 됨.
즉 최종적으로 애플리케이션은 NIB 파일을 사용하게 된다.
[단어정의]
- 아웃렛(outlet) : 객체를 가리키는 인스턴스 변수(즉, 인터페이스 빌더에서 생성한 객체를 가르키는 인스턴스 변수). 텍스트필드 아웃렛 등등
- 액션(action) : 사용자 인터페이스 객체가 호출하는 메서드(버튼 눌렀을 때 호출되는 메서드가 액션)
[인터페이스 빌드를 위한 형타입]
인터페이스 빌더를 위해서 사용되는 타입들
- IBOutlet : 아무것도 하지 않는 매크로
- IBAction : void 와 같다.
그리고, 2장 마지막에 이벤트에 대한 그림이 2장 있는데, 이벤트 처리 되는 방식에 대해서 단순 명료하게 바로 이해 할 수 있는 그림이다.
OSX 프로그램 처음 공부하는 초보자가 보기에는 정말 좋은 책인듯 싶다....굿!
2013년 12월 10일 화요일
1장(코코아:그게 뭐야?)
마공서가 아닌듯 싶다. 만족 한다. 하긴 4판 까지 나올 정도이니...
그 동안 그냥 무시하고 지나간 내용을 1장을 보고 알게 되었다. 다음과 같은 내용이다. 가장 기초 인거 같은데..흐...
그 동안 그냥 무시하고 지나간 내용을 1장을 보고 알게 되었다. 다음과 같은 내용이다. 가장 기초 인거 같은데..흐...
- 프레임워크 : 여러 클래스 가운데 함께 사용할 수 있는 클래스를 모아놓은 집합
정확하게 알지는 못했는데, 프로그램 하다 보니 OSX 에서 말하는 프레임워크가 평소에 말하는 프레임워크와는 틀리게 라이브러리 인걸로 유추 했었는데, 과연 그랬다.
그리고, 다음 중요한 한가지...
코코아는 다음 세 가지 프레임워크로 이루어져 있다고 한다.
- 파운데이션(Foundation) - 객체지향형 프로그래밍 언어는 모두 표준 값에 관련된 클래스, 컬렉션 클래스, 유틸리티 클래스가 필요하다. 문자열, 날짜, 리스트, 스레드, 타이머 등이 파운데이션 프레임워크에 내장되어 있다.
- 앱킷(AppKit) - 사용자 인터페이스에 관련된 모든 것은 앱킷 프레임워크에 있다. 윈도, 버튼, 텍스트 필드, 이벤트, 화면 표시 클래스 등이 그것이다. 이 프레임워크는 애플리케이션킷(ApplicationKit)이라고도 한다.
- 코어데이터(Core Data) - 코어 데이터는 객체들을 파일에 저장하거나 파일로 저장한 객체를 메모리로 손쉽게 불러올 수 있도록 돕는다. 우리는 코어 데이터를 퍼시스턴스 프레임워크(Persistence Framework) 라고 부른다.
위의 3가지만 잘 사용하더라도 기본적인 어플리케이션은 만들 수 있을 것으로 유추 된다. 나머지는 특정 상황에 불러다 사용하면 되는 것이니...많은 것도 아니고 3가지 뿐이니 왠지 희망이 생기지 않은가? ㅋㅋㅋ
계속 2장으로 진행해 보도록 하자.
OSX Cocoa 공부 시작
OSX Cocoa 는 그냥 취미 삼아서 공부 할 예정이다. iOS 개발하면서 XCode 이용한 개발이 상당히 재미있었다. 결국 일반 맥용 어플을 만들어 보자는 생각 까지 미치어서 시도 해 보기로 한다.
구글링으로 교제를 찾아 보니, iOS 개발에 관련된 교제는 무진장 많은데 정작 OSX Cocoa 용 교제는 별로 없었다. 그러다가 한권 발견 한 것이 이것이다.
책의 목차만 보았는데, 가장 기본은 배울수 있을 거 같아서 회사를 통해서 구입 했다.
앞으로 공부 열심히 해서 개인적으로 필요한 어플 좀 만들어 보기로 하자. 파이팅!
구글링으로 교제를 찾아 보니, iOS 개발에 관련된 교제는 무진장 많은데 정작 OSX Cocoa 용 교제는 별로 없었다. 그러다가 한권 발견 한 것이 이것이다.
책의 목차만 보았는데, 가장 기본은 배울수 있을 거 같아서 회사를 통해서 구입 했다.
앞으로 공부 열심히 해서 개인적으로 필요한 어플 좀 만들어 보기로 하자. 파이팅!
2013년 11월 26일 화요일
macbook(매버릭스)에 sqldeveloper 설치
sqldeveloper 를 다운로드 받아서 그냥 실행하면 실행이 안되는데 다음 단계를 거치면 된다.
실행 안되서 당황 하지 말고 쉬우니 그냥 따라 하면 된다.
SUN 에서 배포하는 jdk 가 없어도 실행이 가능 하지만, 안전빵으로 sun 에서 배포하는 jdk 부터 설치 하도록 한다.
1, http://java.sun.com 에서 jdk 7u45 버전을 받는다.(2013년11월26일 현재 가장 최신 버전)
mac osX 용이 있기 때문에 이것을 받으면 된다.
2. 다운받은 dmg 파일을 실행하면 인스톨 파일이 있기 때문에 더블클릭
3. 설치된 디렉토리는 다음과 같다.
/Library/java/JavaVirtualMachines/jdk1.7.0_45.jdk
4. sqldeveloper 사이트 에서 sqldeveloper 를 다운 받는다.(2013년11월26일 최신 버전 다운로드 받았음)
5. 다운 받은 gz 파일을 풀면 패키지 파일이 나온다.
6. 응용 프로그램 안으로 옮기고 난 다음, 바로 실행하지 말고 “패키지 오픈” 을 한다.
그냥 실행하면 제대로 실행 안될 것임.
7. 터미널로 sqldevloper 패치지 안으로 들어간다.
Contents/Resources/sqldeveloper/sqldeveloper/bin 디렉토리로 들어가면 됨.
8. sqldeveloper 파일을 실행 한다.
파일 실행하면 "Type the full pathname of a J2SE installation (or Ctrl-C to quit), the path will be stored in ~/.sqldeveloper/jdk”
이런 설명으로 j2se 경로를 넣으라고 하면 위에서 설치된 경로를 넣는다.(bin 디렉토리 바로 위까지)
"/Library/java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home” 이것을 넣으면 된다.
9. 경로를 넣고 엔터 치면 sqldeveloper 실행 되고, 추후는 그냥 아이콘 클릭 하면 된다.
그나 저나 sqldeveloper 실행하면 미친듯이 쿨링팬 돌아가는 싸구려 회사 macbook...
요즘 회사에서 장비 문제 때문에 말이 많은데, 내년에는 내가 회사에서 받은 노트북 던져버리고
더러워서 그냥 내가 mackbook 하나 사서 사용한다....젠장
근데, 저기까지 가면 회사 옮길 준비 끝인데...ㅋㅋㅋ
실행 안되서 당황 하지 말고 쉬우니 그냥 따라 하면 된다.
SUN 에서 배포하는 jdk 가 없어도 실행이 가능 하지만, 안전빵으로 sun 에서 배포하는 jdk 부터 설치 하도록 한다.
1, http://java.sun.com 에서 jdk 7u45 버전을 받는다.(2013년11월26일 현재 가장 최신 버전)
mac osX 용이 있기 때문에 이것을 받으면 된다.
2. 다운받은 dmg 파일을 실행하면 인스톨 파일이 있기 때문에 더블클릭
3. 설치된 디렉토리는 다음과 같다.
/Library/java/JavaVirtualMachines/jdk1.7.0_45.jdk
4. sqldeveloper 사이트 에서 sqldeveloper 를 다운 받는다.(2013년11월26일 최신 버전 다운로드 받았음)
5. 다운 받은 gz 파일을 풀면 패키지 파일이 나온다.
6. 응용 프로그램 안으로 옮기고 난 다음, 바로 실행하지 말고 “패키지 오픈” 을 한다.
그냥 실행하면 제대로 실행 안될 것임.
7. 터미널로 sqldevloper 패치지 안으로 들어간다.
Contents/Resources/sqldeveloper/sqldeveloper/bin 디렉토리로 들어가면 됨.
8. sqldeveloper 파일을 실행 한다.
파일 실행하면 "Type the full pathname of a J2SE installation (or Ctrl-C to quit), the path will be stored in ~/.sqldeveloper/jdk”
이런 설명으로 j2se 경로를 넣으라고 하면 위에서 설치된 경로를 넣는다.(bin 디렉토리 바로 위까지)
"/Library/java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home” 이것을 넣으면 된다.
9. 경로를 넣고 엔터 치면 sqldeveloper 실행 되고, 추후는 그냥 아이콘 클릭 하면 된다.
그나 저나 sqldeveloper 실행하면 미친듯이 쿨링팬 돌아가는 싸구려 회사 macbook...
요즘 회사에서 장비 문제 때문에 말이 많은데, 내년에는 내가 회사에서 받은 노트북 던져버리고
더러워서 그냥 내가 mackbook 하나 사서 사용한다....젠장
근데, 저기까지 가면 회사 옮길 준비 끝인데...ㅋㅋㅋ
2013년 6월 14일 금요일
Request Payload 와 Form Data ??
맥북에 아파치 설정하고 테스트를 하니 기존에 생각하지도 못하고 그냥 지나가던 문제를 발견 했다. 후...이것 때문에 한 시간 삽질 한듯...
크롬의 개발자 디버그툴에서 request 시 네트웍 결과를 보면 POST 요청시에 넘겨주는 데이터가 어떤 때는 Form data 로 나오고 어떤때는 Request Payload(REST Client 를 사용하면 종종 이렇게 된다) 로 나온 걸로 기억이 난다.
그런데!
Request 시에 Content-Type 이 application/x-www-form-urlencoded 이 아니면 Post 데이터가 Request Payload 여서 현재 맥북 아파치설정에서 POST 데이터를 막고 있는듯 하다. 보안 때문에 그런듯...
이전에 ajax 로 post 데이터를 던졌는데, 특정 서버에서 데이터를 못 받았던게 기억이 나는데, 지금 보니 이게 원인으로 생각 된다.
REST Client 를 사용하려면 이거 풀어 줘야 할듯 한데....막막하다 ㅜㅜ
일단 Fetcher 라는 툴로 Content-Type 을 강제로 설정하고 진행을 하도록 하자. 시간 나면 아파치 설정 찾아 보도록 하자.(설마 아파치 설정이 맞겠지?)
추가1)
크롬의 개발자 디버그툴에서 request 시 네트웍 결과를 보면 POST 요청시에 넘겨주는 데이터가 어떤 때는 Form data 로 나오고 어떤때는 Request Payload(REST Client 를 사용하면 종종 이렇게 된다) 로 나온 걸로 기억이 난다.
그런데!
Request 시에 Content-Type 이 application/x-www-form-urlencoded 이 아니면 Post 데이터가 Request Payload 여서 현재 맥북 아파치설정에서 POST 데이터를 막고 있는듯 하다. 보안 때문에 그런듯...
이전에 ajax 로 post 데이터를 던졌는데, 특정 서버에서 데이터를 못 받았던게 기억이 나는데, 지금 보니 이게 원인으로 생각 된다.
REST Client 를 사용하려면 이거 풀어 줘야 할듯 한데....막막하다 ㅜㅜ
일단 Fetcher 라는 툴로 Content-Type 을 강제로 설정하고 진행을 하도록 하자. 시간 나면 아파치 설정 찾아 보도록 하자.(설마 아파치 설정이 맞겠지?)
추가1)
일단 아파치 설정으로 풀지 않고 php 에서 자체적으로 풀수 있는데, $request_body = file_get_contents('php://input'); 위의 코드를 사용하면 request payload 값을 가져 올 수 있다.
mysql foreign key 지정
출처: http://wory.tistory.com/181
Mysql은 3.23.43 이후 버전부터 지원.
테이블을 생성시 type=innodb 옵션을 주어야 한다. 그러기 위해서는 Mysql 자체에서 innodb를 지원하는지 확인한다.
부모 테이블 생성( type=innodb 옵션을 부여)
create table user_info(
no int not null auto_increment,
name varchar(20) not null,
primary key(no)
)engine=innodb; # 또는 type=innodb;
자식 테이블 생성(type=innodb 옵션 부여 및,, index 및 외래키 설정)
/* 이용자 교육 접수 관리 */
create table user_education(no int not null auto_increment,
user_no int not null,finish int default '1',
finish_no varchar(50),
want text,
index (user_no), #외래키로 지정할 컬럼을 index로 지정한다.
foreign key(user_no) references user_info(no)
on delete cascade
on update cascade,
primary key(no)
)TYPE=innodb; #또는 engine=innodb;
Mysql 5.x 버전대에서는 외래키로 지정할 컬럼이 index로 지정이 안되어도 테이블 생성이 되나 그 아래 버전은 인덱스를 지정해야만 외래키로 사용할 수 있다.
*외래키 옵션
on delete cascade : 부모의 해당키가 삭제되면 자동으로 삭제가 된다.
on delete set null : 부모의 해당키가 삭제되면 자동으로 null로 만든다.
on update cascade : 부모의 해당키가 갱신되면 자동으로 갱신된다.
외래키를 사용하여 테이블을 생성하다보면, 부모가 항상 먼저 생성이 되어 있어야 한다거나 참조 무결성등 외래키 제약 조건을 검사한 후에 문제가 없을 시 자식 테이블을 생성하게 되어 있다.
하지만 다음과 같이 하면 외래키 검사를 하지 않고 생성이 된다.(물론 테이블 구조 및 참조 무결성이 확인된다는 100% 보장이 있다면 사용해야 겟지??)
mysql>set foreign_key_checks=0; #외래키 검사를 하지 않는 옵션
... 외래키 수행하는 테이블 생성 및 수정 작업 등등등....
mysql>set foreign_key_checks=1; #검사를 하는 옵션..
* 오류해결
ERROR 1216 (00000): Cannot add or update a child row: a foreign key constraint fails
: 자식 테이블에 외래키로 지정된 컬럼의 값이, 부모에게 없는 값일 때 (참조 무결성 제약 조건)
- 해결 방법 : 외래키 검사를 하지 않거나, 부모에게 없는 값을 갖는 자식 테이블의 컬럼값을 변경 또는 제거하면 된다.
Mysql은 3.23.43 이후 버전부터 지원.
테이블을 생성시 type=innodb 옵션을 주어야 한다. 그러기 위해서는 Mysql 자체에서 innodb를 지원하는지 확인한다.
mysql> show variables like 'have%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_bdb | YES |
| have_crypt | YES |
| have_innodb | YES |
| have_isam | YES |
| have_openssl | NO |
| have_query_cache | YES |
| have_raid | YES |
| have_symlink | YES |
+------------------+-------+
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_bdb | YES |
| have_crypt | YES |
| have_innodb | YES |
| have_isam | YES |
| have_openssl | NO |
| have_query_cache | YES |
| have_raid | YES |
| have_symlink | YES |
+------------------+-------+
부모 테이블 생성( type=innodb 옵션을 부여)
create table user_info(
no int not null auto_increment,
name varchar(20) not null,
primary key(no)
)engine=innodb; # 또는 type=innodb;
자식 테이블 생성(type=innodb 옵션 부여 및,, index 및 외래키 설정)
/* 이용자 교육 접수 관리 */
create table user_education(no int not null auto_increment,
user_no int not null,finish int default '1',
finish_no varchar(50),
want text,
index (user_no), #외래키로 지정할 컬럼을 index로 지정한다.
foreign key(user_no) references user_info(no)
on delete cascade
on update cascade,
primary key(no)
)TYPE=innodb; #또는 engine=innodb;
Mysql 5.x 버전대에서는 외래키로 지정할 컬럼이 index로 지정이 안되어도 테이블 생성이 되나 그 아래 버전은 인덱스를 지정해야만 외래키로 사용할 수 있다.
*외래키 옵션
on delete cascade : 부모의 해당키가 삭제되면 자동으로 삭제가 된다.
on delete set null : 부모의 해당키가 삭제되면 자동으로 null로 만든다.
on update cascade : 부모의 해당키가 갱신되면 자동으로 갱신된다.
외래키를 사용하여 테이블을 생성하다보면, 부모가 항상 먼저 생성이 되어 있어야 한다거나 참조 무결성등 외래키 제약 조건을 검사한 후에 문제가 없을 시 자식 테이블을 생성하게 되어 있다.
하지만 다음과 같이 하면 외래키 검사를 하지 않고 생성이 된다.(물론 테이블 구조 및 참조 무결성이 확인된다는 100% 보장이 있다면 사용해야 겟지??)
mysql>set foreign_key_checks=0; #외래키 검사를 하지 않는 옵션
... 외래키 수행하는 테이블 생성 및 수정 작업 등등등....
mysql>set foreign_key_checks=1; #검사를 하는 옵션..
* 오류해결
ERROR 1216 (00000): Cannot add or update a child row: a foreign key constraint fails
: 자식 테이블에 외래키로 지정된 컬럼의 값이, 부모에게 없는 값일 때 (참조 무결성 제약 조건)
- 해결 방법 : 외래키 검사를 하지 않거나, 부모에게 없는 값을 갖는 자식 테이블의 컬럼값을 변경 또는 제거하면 된다.
2013년 5월 25일 토요일
엘더스크롤5 스카이림
출시된지는 오래 되었지만, 그 동안 말로만 듣던 엘더스크롤5 스카이림을 요즘 플레이 중이다. 얼마전에 툼레이더 리붓 구경 할때 느낀 감탄을 플레이를 하는 내내 느끼고 있다. 진짜 요즘 게임 기술 발달이 대단하다는...
모드 맞추느라 게임을 열 댓번 재시작 한 거 같은데, 이렇게 들인 노력이 아깝지 않을 정도로 흥미로운 게임이다. 게임 자체로도 재미있는데, 돌아다니면서 게임 그래픽 구경하는 것도 나름 재미 있다.
게임을 돌리는 환경이 작년에 구입한 싸구려 노트북인데, 노트북에서 캡쳐 한 것과 같은 그래픽 퀄리티를 뽑아내는거 보면, 개발자들 정말 존경 스러울 정도이다.
가장 처음 시작하는 마을이 리버우드 인데, 안개 낀 느낌을 저렇게 잘 표현하다니 정말 우와 한마디 밖에 나오지 않는다는...적극 추천인 게임이다.
조금 진행 해 보니 느긋하게 플레이 하면 무진장 많은 시간이 드는 게임으로 보여지지만, 3-4달 잡고 엔딩을 보려고 노력중이다.
<비오는 화이트런> |
모드 맞추느라 게임을 열 댓번 재시작 한 거 같은데, 이렇게 들인 노력이 아깝지 않을 정도로 흥미로운 게임이다. 게임 자체로도 재미있는데, 돌아다니면서 게임 그래픽 구경하는 것도 나름 재미 있다.
<화이트런 나오는 입구> |
<리버우드 재재소 옆> |
조금 진행 해 보니 느긋하게 플레이 하면 무진장 많은 시간이 드는 게임으로 보여지지만, 3-4달 잡고 엔딩을 보려고 노력중이다.
2013년 5월 24일 금요일
xcode 에서 c++ 컴파일
출처: http://hanjw8410.egloos.com/5081069
작년 초반까지 별 다른 변경 없이, obj-c, c++, c 가 오류 없이 컴파일이 되었는데, xcode 가 업데이트 되고 어느 순간 부터 아무런 오류 없던 c++ 이 오류가 발생하는 경우가 발생 했었다.
이것 때문에 여러번 구글링 했는데, 앞으로 생각 날때 마다 찾아다니지 않기 위해서 적어 두자.
c++ 컴파일 관련해서 기본이 파일명을 기준으로 해서 하도록 되어 있는데, 이것 관련해서 문서 찾아 보기도 귀찮고 하니, "Compile Source As" 부분을 "According to File Type" 에서 "Objective-C++" 로 바꾸면 예전과 마찬가지로 사용해도 아무런 에러가 발생하지 않는다.
참고 하도록 하자.
작년 초반까지 별 다른 변경 없이, obj-c, c++, c 가 오류 없이 컴파일이 되었는데, xcode 가 업데이트 되고 어느 순간 부터 아무런 오류 없던 c++ 이 오류가 발생하는 경우가 발생 했었다.
이것 때문에 여러번 구글링 했는데, 앞으로 생각 날때 마다 찾아다니지 않기 위해서 적어 두자.
c++ 컴파일 관련해서 기본이 파일명을 기준으로 해서 하도록 되어 있는데, 이것 관련해서 문서 찾아 보기도 귀찮고 하니, "Compile Source As" 부분을 "According to File Type" 에서 "Objective-C++" 로 바꾸면 예전과 마찬가지로 사용해도 아무런 에러가 발생하지 않는다.
참고 하도록 하자.
2013년 5월 22일 수요일
phpmyadmin 설치
mysql 은 브라우저로 데이터베이스 관리 할 수 있는 phpmyadmin 이라는 툴이 존재한다. 물론 터미널로 붙어서 관리 하는 것도 좋은 방법이지만, 요즘들어 타이핑 치기 싫은 귀차니즘으로 phpmyadmin 을 많이 사용하고 있다.
설치 하는 방법은 다음과 같다.
1. phpmyadmin 다운로드
phpmyadmin 사이트 에서 무료로 다운로드 가능하다. 현재 최신 버전이 4.0.1 이어서 phpMyAdmin-4.0.1-all-languages.zip 파일을 다운로드 받았다.
2. 압축 해제
다운로드 파일을 압축 해제 후, 사용하기 편하도록 디렉토리 명을 적당한 이름(phpmyadmin) 으로 변경 한다.
3. mac book 의 httpd 디렉토리로 이동
압축 해제한 phpmyadmin 디렉토리를 mac book 의 Site 디렉토리로 이동.
4. phpmyadmin 페이지 접속
root 로 접속하면 위의 화면 같이 나온다.
화면 아래쪽에 분홍색도 보이고, 설치 어쩌고 저쩌고...하는 왠지 제대로 되지 않았다는 느낌이 팍팍 풍기는 안내 문구 들이 보인다. 내용이 무시 해도 될 것 같기도 하지만, 메시지가 보기 싫어서 해 달라는데로 해 주기로 한다.
6. phpMyAdmin 용 database, table 생성
phpMyAdmin 디렉토리에 보면 examples 라는 디렉토리가 보인다. 들어가 보면, create_tables.sql 이 존재한다. 이것으로 phpMyAdmin 용 테이블을 생성한다.
터미널로 mysql 접속하여 다음과 같이 하면 테이블 생성된다.
path 에는 phpMyAdmin 이 설치 되어 있는 경로이다.
아니면 create_tables.sql 파일 내용이 얼마 안되기 때문에, 명령어 복사하여 그대로 실행 해도 된다.
7. phpmyadmin 에서 사용하는 mysql account 생성
테이블이 생성 되었으니 phpMyAdmin 에서 사용하는 mysql account 를 생성한다. 터미널로 해도 되지만, 이미 phpMyAdmin 을 사용 할 수 있기 때문에, 이것을 이용하여 생성한다.
상단 메뉴 탭에서 "사용자" 를 선택해서 들어간 후, 기본 정보를 넣고 account 를 생성한다.
(일단 권한은 건드리지 말자...하나씩 차근 차근)
"사용자 추가" 까지 완료하면 사용자는 추가 되었는데, 6번 단계에서 만든 phpMyAdmin 용 database 를 사용할 권한은 아직까지 없다. 이젠 권한을 추가 하도록 하자.
다시 "사용자" 메뉴로 들어가면 추가한 account 가 보인다. "권한 설정" 을 선택하여 권한 설정 메뉴로 이동 한 후, "데이터 베이스에 관한 권한" 에서 phpmyadmin 을 선택하여 실행 버튼을 누른다.
드디어 phpmyadmin 데이터 베이스 에 대한 생성한 계정의 권한 설정으로 들어 왔다.
테이블 별로 권한을 줄 필요가 없기 때문에 다음과 같이 관리 권한만 빼고 모든 권한을 설정한다.(관리 권한은 필요 없겠지 아마도...)
이제 실행을 눌러서 권한 설정을 완료 한다.
8. phpMyAdmin 의 config 파일 추가/수정
phpMyAdmin 디렉토리를 보면 config.sample.inc.php 라는 파일이 존재한다. 이 파일을 config.inc.php 이름으로 복사하여 phpMyAdmin 디렉토리에 둔다.
아래 내용이 주석으로 막혀 있는 코드들을 모두 풀어 준다.
그리고, 'controlhost', 'controluser', 'controlpass' 에 mysql account 생성에서 사용한 값으로 변경 한다. 변경 후 다음과 같이 될 것이다.
파일 저장 후, 웹 브라우저에서 phpMyAdmin 페이지를 다시 로그인 하면, 화면 하단의 안내 메시지들이 사라져 있다.(translation 관련 메시지는 보이는데, 이건 그냥 무시!)
9. 기타
이런 훌륭한 application 을 무료로 배포하는 것에 감사하며 phpMyAdmin 에 $1 라도 Donate !
설치 하는 방법은 다음과 같다.
1. phpmyadmin 다운로드
phpmyadmin 사이트 에서 무료로 다운로드 가능하다. 현재 최신 버전이 4.0.1 이어서 phpMyAdmin-4.0.1-all-languages.zip 파일을 다운로드 받았다.
2. 압축 해제
다운로드 파일을 압축 해제 후, 사용하기 편하도록 디렉토리 명을 적당한 이름(phpmyadmin) 으로 변경 한다.
3. mac book 의 httpd 디렉토리로 이동
압축 해제한 phpmyadmin 디렉토리를 mac book 의 Site 디렉토리로 이동.
4. phpmyadmin 페이지 접속
웹 브라우저에서 http://localhost/~dhkim/phpMyAdmin/ 으로 접근 하면 phpmyadmin 최초 페이지를 확인 가능하다.
5. 로그인
root 암호와 패스워드를 넣고 접속 하면 일단 기본적인 접속 끝. 참고로 root 패스워드 없이 접근이 불가능하다.(mysql 의 root 패스워드가 설정 안되었다면 패스워드 부터 설정 해야 한다.)
화면 아래쪽에 분홍색도 보이고, 설치 어쩌고 저쩌고...하는 왠지 제대로 되지 않았다는 느낌이 팍팍 풍기는 안내 문구 들이 보인다. 내용이 무시 해도 될 것 같기도 하지만, 메시지가 보기 싫어서 해 달라는데로 해 주기로 한다.
6. phpMyAdmin 용 database, table 생성
phpMyAdmin 디렉토리에 보면 examples 라는 디렉토리가 보인다. 들어가 보면, create_tables.sql 이 존재한다. 이것으로 phpMyAdmin 용 테이블을 생성한다.
터미널로 mysql 접속하여 다음과 같이 하면 테이블 생성된다.
mysql> mysql -u 사용자계정 -p DB이름 < /path/examples/create_tables.sql
path 에는 phpMyAdmin 이 설치 되어 있는 경로이다.
아니면 create_tables.sql 파일 내용이 얼마 안되기 때문에, 명령어 복사하여 그대로 실행 해도 된다.
7. phpmyadmin 에서 사용하는 mysql account 생성
테이블이 생성 되었으니 phpMyAdmin 에서 사용하는 mysql account 를 생성한다. 터미널로 해도 되지만, 이미 phpMyAdmin 을 사용 할 수 있기 때문에, 이것을 이용하여 생성한다.
상단 메뉴 탭에서 "사용자" 를 선택해서 들어간 후, 기본 정보를 넣고 account 를 생성한다.
(일단 권한은 건드리지 말자...하나씩 차근 차근)
"사용자 추가" 까지 완료하면 사용자는 추가 되었는데, 6번 단계에서 만든 phpMyAdmin 용 database 를 사용할 권한은 아직까지 없다. 이젠 권한을 추가 하도록 하자.
다시 "사용자" 메뉴로 들어가면 추가한 account 가 보인다. "권한 설정" 을 선택하여 권한 설정 메뉴로 이동 한 후, "데이터 베이스에 관한 권한" 에서 phpmyadmin 을 선택하여 실행 버튼을 누른다.
드디어 phpmyadmin 데이터 베이스 에 대한 생성한 계정의 권한 설정으로 들어 왔다.
테이블 별로 권한을 줄 필요가 없기 때문에 다음과 같이 관리 권한만 빼고 모든 권한을 설정한다.(관리 권한은 필요 없겠지 아마도...)
8. phpMyAdmin 의 config 파일 추가/수정
phpMyAdmin 디렉토리를 보면 config.sample.inc.php 라는 파일이 존재한다. 이 파일을 config.inc.php 이름으로 복사하여 phpMyAdmin 디렉토리에 둔다.
아래 내용이 주석으로 막혀 있는 코드들을 모두 풀어 준다.
/* User used to manipulate with storage */ // $cfg['Servers'][$i]['controlhost'] = ''; // $cfg['Servers'][$i]['controluser'] = 'pma'; // $cfg['Servers'][$i]['controlpass'] = 'pmapass'; /* Storage database and tables */ // $cfg['Servers'][$i]['pmadb'] = 'phpmyadmin'; // $cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark'; // $cfg['Servers'][$i]['relation'] = 'pma__relation'; // $cfg['Servers'][$i]['table_info'] = 'pma__table_info'; // $cfg['Servers'][$i]['table_coords'] = 'pma__table_coords'; // $cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages'; // $cfg['Servers'][$i]['column_info'] = 'pma__column_info'; // $cfg['Servers'][$i]['history'] = 'pma__history'; // $cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs'; // $cfg['Servers'][$i]['tracking'] = 'pma__tracking'; // $cfg['Servers'][$i]['designer_coords'] = 'pma__designer_coords'; // $cfg['Servers'][$i]['userconfig'] = 'pma__userconfig'; // $cfg['Servers'][$i]['recent'] = 'pma__recent';
그리고, 'controlhost', 'controluser', 'controlpass' 에 mysql account 생성에서 사용한 값으로 변경 한다. 변경 후 다음과 같이 될 것이다.
/* User used to manipulate with storage */ $cfg['Servers'][$i]['controlhost'] = 'localhost'; $cfg['Servers'][$i]['controluser'] = 'pma_user'; $cfg['Servers'][$i]['controlpass'] = 'passpass'; /* Storage database and tables */ $cfg['Servers'][$i]['pmadb'] = 'phpmyadmin'; $cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark'; $cfg['Servers'][$i]['relation'] = 'pma__relation'; $cfg['Servers'][$i]['table_info'] = 'pma__table_info'; $cfg['Servers'][$i]['table_coords'] = 'pma__table_coords'; $cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages'; $cfg['Servers'][$i]['column_info'] = 'pma__column_info'; $cfg['Servers'][$i]['history'] = 'pma__history'; $cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs'; $cfg['Servers'][$i]['tracking'] = 'pma__tracking'; $cfg['Servers'][$i]['designer_coords'] = 'pma__designer_coords'; $cfg['Servers'][$i]['userconfig'] = 'pma__userconfig'; $cfg['Servers'][$i]['recent'] = 'pma__recent';
파일 저장 후, 웹 브라우저에서 phpMyAdmin 페이지를 다시 로그인 하면, 화면 하단의 안내 메시지들이 사라져 있다.(translation 관련 메시지는 보이는데, 이건 그냥 무시!)
9. 기타
이런 훌륭한 application 을 무료로 배포하는 것에 감사하며 phpMyAdmin 에 $1 라도 Donate !
2013년 5월 21일 화요일
mac os(mountain lion) 에서 mysql 설치
예전에 mac 에서 mysql 쓸수 있는지 확인하기 위해서 이미 설치를 했었다.
일단 삭제 하고 다시 설치 하자. (삭제하는 방법 구글링 한 것 아까워서 삭제 부터 시작함!)
1. 기존 인스톨된 mysql 삭제
lion 버전에서 삭제 라는데, 그냥 무시하고 그대로 따라 했다.
재부팅 하니....별 문제 없는듯.....
2. mysql 다운로드
Mysql 사이트 에서 다운로드 받으면 된다. 사이트 방문하면 여러가지 메뉴가 많은데, 대충 "Download" 들어가서 "MySQL Community Edition (GPL)" 받으면 된다.
참고로 mysql 사이트에 가입 후 로그인 해야 하니, 가입 안 했다면 돈 안드니 가입 하면 된다.
최종 다운로드 메뉴로 들어가면 자기가 알아서 Mac OS X 용 패키지를 보여 주니, 골라서 다운 받으면 된다.
서버도 아니고 로컬에서 설치로 골치 아프기 싫어서 그냥 dmg 로 묶여 있는 것을 받았다. 요거 ~ Mac OS X ver. 10.7 (x86, 64-bit), DMG Archive (mysql-5.6.11-osx10.7-x86_64.dmg)
3. 설치
다운 받은 dmg 파일을 열면 다음과 같이 나온다.
mysql-5.6.11-osx10.7-x86_64.pkg 를 클릭하여 실행한다. 윈도우 프로그램 설치 할때 처럼 아무 생각 없이 Ok 버튼만 눌러서 마지막 까지 설치 진행 한다.
"시스템 환경설정" 에서 mysql 메뉴를 보기 위해서 MySQL.prefPane 을 실행 한다.
preference pane 에 mysql icon 이 추가 되며, 앞으로 이것을 통해서 mysql stop, start 할 수 있다.
Mysql 아이콘을 클릭 하면 다음과 같이 Start, Stop 할 수 있는게 나온다.
Start MySQL Server 를 클릭 하니...오~ 별 문제 없이 잘 돌아 간다. 서버에 오라클 설치 할때 생각 하면 진짜....너무 편하다는....
4. 점검
진짜로 설치 제대로 되었는지 터미널(나의 가장 친한 친구 터미널~)로 mysql 에 한번 붙어 본다.
mysql 은 /usr/local/mysql 에 설치 되어 있다.
기본으로 password 가 없기 때문에, 그냥 ./mysql 이나 sudo ./mysql 로 접속하면 바로 접속 되어 진다.
sudo ./mysql 로 붙으면 root 로 붙는 것이기 때문에 이렇게 붙어서 기본 설정 하면 된다.
5. 터미널로 mysql 붙은 김에 할일
터미널로 mysql command 로 들어온 김에 root 패스워드를 설정 한다.
mysql root 의 패스워드를 설정 했기 때문에 이후 부터는 sudo ./mysql 이나 ./mysql 로 바로 붙을 수 없다. root 로 한번 붙어 보자.
로 커맨드를 치면, 패스워드 넣어라고 한다. 그러면 위에서 설정한 패스워드를 입력하면 접속 완료!
<2013년12월15일 추가>
[mysql 을 UTF-8 환경으로 설정]
http://www.nextstep.co.kr/250 참조
phpMyAdmin 을 사용한다면 별 상관 없을듯 한데, RazorSQL 사용할때 괜히 텍스트 꼬이지 않게 하기 위해서 mysql 을 UTF-8 로 설정 한다.
my.cnf 파일을 다음과 같이 수정 하면 된다(내용 추가)
파일 수정후, mysql stop/start 한다. 다시 mysql 에 접속해서 명령어로 utf-8 설정 확인 한다.
일단 삭제 하고 다시 설치 하자. (삭제하는 방법 구글링 한 것 아까워서 삭제 부터 시작함!)
1. 기존 인스톨된 mysql 삭제
sudo rm /usr/local/mysql sudo rm -rf /usr/local/mysql* sudo rm -rf /Library/StartupItems/MySQLCOM sudo rm -rf /Library/PreferencePanes/My* rm -rf ~/Library/PreferencePanes/My* sudo rm -rf /Library/Receipts/mysql* sudo rm -rf /Library/Receipts/MySQL* sudo rm -rf /var/db/receipts/com.mysql.* vim /etc/hostconfig # and remove the line MYSQLCOM=-YES-출처: Removing MySQL From OSX Lion
lion 버전에서 삭제 라는데, 그냥 무시하고 그대로 따라 했다.
재부팅 하니....별 문제 없는듯.....
2. mysql 다운로드
Mysql 사이트 에서 다운로드 받으면 된다. 사이트 방문하면 여러가지 메뉴가 많은데, 대충 "Download" 들어가서 "MySQL Community Edition (GPL)" 받으면 된다.
참고로 mysql 사이트에 가입 후 로그인 해야 하니, 가입 안 했다면 돈 안드니 가입 하면 된다.
최종 다운로드 메뉴로 들어가면 자기가 알아서 Mac OS X 용 패키지를 보여 주니, 골라서 다운 받으면 된다.
서버도 아니고 로컬에서 설치로 골치 아프기 싫어서 그냥 dmg 로 묶여 있는 것을 받았다. 요거 ~ Mac OS X ver. 10.7 (x86, 64-bit), DMG Archive (mysql-5.6.11-osx10.7-x86_64.dmg)
3. 설치
다운 받은 dmg 파일을 열면 다음과 같이 나온다.
mysql-5.6.11-osx10.7-x86_64.pkg 를 클릭하여 실행한다. 윈도우 프로그램 설치 할때 처럼 아무 생각 없이 Ok 버튼만 눌러서 마지막 까지 설치 진행 한다.
"시스템 환경설정" 에서 mysql 메뉴를 보기 위해서 MySQL.prefPane 을 실행 한다.
preference pane 에 mysql icon 이 추가 되며, 앞으로 이것을 통해서 mysql stop, start 할 수 있다.
Mysql 아이콘을 클릭 하면 다음과 같이 Start, Stop 할 수 있는게 나온다.
Start MySQL Server 를 클릭 하니...오~ 별 문제 없이 잘 돌아 간다. 서버에 오라클 설치 할때 생각 하면 진짜....너무 편하다는....
4. 점검
진짜로 설치 제대로 되었는지 터미널(나의 가장 친한 친구 터미널~)로 mysql 에 한번 붙어 본다.
$ cd /usr/local/mysql $ cd bin $ ./mysql $ sudo ./mysql
mysql 은 /usr/local/mysql 에 설치 되어 있다.
기본으로 password 가 없기 때문에, 그냥 ./mysql 이나 sudo ./mysql 로 접속하면 바로 접속 되어 진다.
sudo ./mysql 로 붙으면 root 로 붙는 것이기 때문에 이렇게 붙어서 기본 설정 하면 된다.
5. 터미널로 mysql 붙은 김에 할일
터미널로 mysql command 로 들어온 김에 root 패스워드를 설정 한다.
$ cd /usr/local/mysql/bin $ sudo ./mysql mysql> use mysql; mysql> update user set password=password('사용하고 싶은 패스워드') where user='root'; mysql> flush privileges; mysql> quit
mysql root 의 패스워드를 설정 했기 때문에 이후 부터는 sudo ./mysql 이나 ./mysql 로 바로 붙을 수 없다. root 로 한번 붙어 보자.
$ cd /usr/local/mysql/bin $ ./mysql -u root -p
로 커맨드를 치면, 패스워드 넣어라고 한다. 그러면 위에서 설정한 패스워드를 입력하면 접속 완료!
<2013년12월15일 추가>
[mysql 을 UTF-8 환경으로 설정]
http://www.nextstep.co.kr/250 참조
phpMyAdmin 을 사용한다면 별 상관 없을듯 한데, RazorSQL 사용할때 괜히 텍스트 꼬이지 않게 하기 위해서 mysql 을 UTF-8 로 설정 한다.
$ cd /usr/local/mysql $ sudo vi my.cnf
[mysqld] init_connect="SET collation_connection=utf8_general_ci" init_connect="SET NAMES utf8" character-set-server=utf8 collation-server=utf8_general_ci skip-character-set-client-handshake [client] default-character-set=utf8 [mysql] default-character-set=utf8
$ cd /usr/local/mysql/bin $ ./mysql -u root -p mysql> show variables like 'c%'; +--------------------------+--------------------------------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql-5.6.15-osx10.7-x86_64/share/charsets/ | | collation_connection | utf8_general_ci | | collation_database | utf8_general_ci | | collation_server | utf8_general_ci | | completion_type | NO_CHAIN | | concurrent_insert | AUTO | | connect_timeout | 10 | | core_file | OFF | +--------------------------+--------------------------------------------------------+ 15 rows in set (0.00 sec)
2013년 5월 16일 목요일
gamma board 구성 요소
이번 프로젝트에서 XE 를 사용 하고 있다. 그런데, 문제가 서비스 플랫폼을 가져와서 사용하면 그 서비스 플랫폼에서 제공하는 기본적인 서비스 구조를 지켜 줘야 하는데, 이건 뭐~
대부분 바꾸어서 솔직히 XE 의 DB 구조를 제외하고는 XE 를 왜 사용하고 있는지 모를 정도 이다. 그냥 처음 부터 개발을 하고 말지, 맘에 들지도 않고 복잡하기만 XE 를 왜 사용하고 있는지...차라리 워드프레스를 사용했으면 워드프레스 공부해서 남기나 하지...제길슨
아무튼 앞으로 이런식으로 흘러 갈거 같아서 미리 틈틈이 기본적인 기능(회원 관리, 게시판 관리, 사이트 편집)을 지원하는 서비스 플랫폼을 만들려고 하고 있다.(가칭 감마보드....창의성 없는...) 현재 CI 보고 있는 이유도 이것 때문이다. 뭣~ 같은 XE 의 템플릿 문법을 안 보니 살거 같다.
기본 framework 은 CI 를 사용할 예정이고, DB 는 mysql 만 지원하면 된다.(돈이 없어서 mysql 외에는 쓰지 않을 것으로 보고 있다. 물론 mysql 이 훌륭한 이유도 있다)
일단 기본적인 모듈 구성은 다음과 같이 할 것이다.
1. 환경
- php 5.4 (php 업그레이드 좀 하자고! 5.2 가 뭐냐...)
- CI
- mysql
- jquery
- knockout
- nodejs
2. php 개발 모듈
- member 관리
- admin
- 서비스 메뉴 관리
- member point 관리
- 기본 3개 이후에 추가 예정.
후..밤에 짬짬히 개발 하려니 속도가 안난다...일단 github 에서 하고 있다.
https://github.com/redsea/gboard
대부분 바꾸어서 솔직히 XE 의 DB 구조를 제외하고는 XE 를 왜 사용하고 있는지 모를 정도 이다. 그냥 처음 부터 개발을 하고 말지, 맘에 들지도 않고 복잡하기만 XE 를 왜 사용하고 있는지...차라리 워드프레스를 사용했으면 워드프레스 공부해서 남기나 하지...제길슨
아무튼 앞으로 이런식으로 흘러 갈거 같아서 미리 틈틈이 기본적인 기능(회원 관리, 게시판 관리, 사이트 편집)을 지원하는 서비스 플랫폼을 만들려고 하고 있다.(가칭 감마보드....창의성 없는...) 현재 CI 보고 있는 이유도 이것 때문이다. 뭣~ 같은 XE 의 템플릿 문법을 안 보니 살거 같다.
기본 framework 은 CI 를 사용할 예정이고, DB 는 mysql 만 지원하면 된다.(돈이 없어서 mysql 외에는 쓰지 않을 것으로 보고 있다. 물론 mysql 이 훌륭한 이유도 있다)
일단 기본적인 모듈 구성은 다음과 같이 할 것이다.
1. 환경
- php 5.4 (php 업그레이드 좀 하자고! 5.2 가 뭐냐...)
- CI
- mysql
- jquery
- knockout
- nodejs
2. php 개발 모듈
- member 관리
- admin
- 서비스 메뉴 관리
- member point 관리
- 기본 3개 이후에 추가 예정.
후..밤에 짬짬히 개발 하려니 속도가 안난다...일단 github 에서 하고 있다.
https://github.com/redsea/gboard
iOS mountain lion 에서 web sharing(apache httpd 실행)
iOS 가 lion 버전에서 mountain lion 버전으로 업그레이드 되면서 시스템 환경 설정의 공유란에 존재하던 인터넷 공유가 사라졌었다.(마운틴 라이언 출시되고 바로 구입한것이 되어서 현재는 모르겠뜸...아마도 추가 되었을지도....;;;)
뭐 시스템 환경 설정에 항목이 없더라도 터미널 띄어서 커맨드로 apache httpd 실행 시키면 되기는 하지만 귀찮아서, 해결책이 없는지 찾던중 어느 감사한 분이 클릭으로 할 수 있도록 시스템 환경 설정에 항목 추가 할 수 있도록 한 것을 찾았다.
요기 (아마도 이것일듯 설치한지 한참 되어서 기억이 가물 가물...)
다운로드 후 설치하면 "시스템 환경 설정" 에 "Web Sharing" 항목으로 apache httpd 껏따 켰다 할 수 있다. virtual host 리스트는 제대로 안 되는듯 보이는데, 이건 그냥 터미널로 처리하면 되니 패스~
뭐 시스템 환경 설정에 항목이 없더라도 터미널 띄어서 커맨드로 apache httpd 실행 시키면 되기는 하지만 귀찮아서, 해결책이 없는지 찾던중 어느 감사한 분이 클릭으로 할 수 있도록 시스템 환경 설정에 항목 추가 할 수 있도록 한 것을 찾았다.
요기 (아마도 이것일듯 설치한지 한참 되어서 기억이 가물 가물...)
다운로드 후 설치하면 "시스템 환경 설정" 에 "Web Sharing" 항목으로 apache httpd 껏따 켰다 할 수 있다. virtual host 리스트는 제대로 안 되는듯 보이는데, 이건 그냥 터미널로 처리하면 되니 패스~
macbook 에서 httpd virtual host 설정
apache httpd 의 설정파일은 /etc/apache2 하단에 존재한다.
기본적으로 설정파일 들의 템플릿들이 존재하고 주석으로 막혀 있는 상태이기 때문에 변경 사항이 많지 않다.
1. virtual host 설정 파일 변경
virtual host 설정 파일(/etc/apache2/extra/httpd-vhosts.conf) 편집 한다.
이 부분은 그대로 놔 두고, 나머지는 모두 필요 없으므로 주석 처리 하고, 내가 필요한 설정을 추가 한다.
사용하는 도메인은 외부로 열지 않을 것이기 때문에 그냥 /etc/hosts 에 원하는데로 등록하여 사용 했다.
2. apache 메인 설정 파일 변경
virtual host 설정을 반영 하는 것이 기본적으로 주석 처리 되어 있기 때문에 주석만 풀어 주면 된다. /etc/apache2/httpd.conf 파일을 열어서 vhost 로 검색 하면
으로 주석이 막혀 있는데 Include 주석을 풀어, virtual host 설정을 포함 시킨다.
그리고 apache 재 실행하면 된다.
3. 추가
Rewrite 모듈을 사용 할 것이기 때문에 virtual host 설정 파일을 수정 하는 김에, Rewrite 부분도 추가한다. /etc/apache2/extra/httpd-vhosts.conf 파일에 아래 내용을 추가 한다.
접속 관련인데, 로컬로만 돌릴 것이기 때문에 그냥 아무 부담없이 설정 한다.
기본적으로 설정파일 들의 템플릿들이 존재하고 주석으로 막혀 있는 상태이기 때문에 변경 사항이 많지 않다.
1. virtual host 설정 파일 변경
virtual host 설정 파일(/etc/apache2/extra/httpd-vhosts.conf) 편집 한다.
NameVirtualHost *:80
이 부분은 그대로 놔 두고, 나머지는 모두 필요 없으므로 주석 처리 하고, 내가 필요한 설정을 추가 한다.
ServerAdmin dhkim94@gmail.com DocumentRoot "/Users/dhkim/Sites/gboard" ServerName dhkim.gboard.org ErrorLog "|/usr/sbin/rotatelogs /Users/dhkim/Sites/log/gboard/error.%Y%m%d 86400" CustomLog "|/usr/sbin/rotatelogs /Users/dhkim/Sites/log/gboard/access.%Y%m%d 86400" combined
사용하는 도메인은 외부로 열지 않을 것이기 때문에 그냥 /etc/hosts 에 원하는데로 등록하여 사용 했다.
2. apache 메인 설정 파일 변경
virtual host 설정을 반영 하는 것이 기본적으로 주석 처리 되어 있기 때문에 주석만 풀어 주면 된다. /etc/apache2/httpd.conf 파일을 열어서 vhost 로 검색 하면
# Virtual hosts #Include /private/etc/apache2/extra/httpd-vhosts.conf
으로 주석이 막혀 있는데 Include 주석을 풀어, virtual host 설정을 포함 시킨다.
그리고 apache 재 실행하면 된다.
3. 추가
Rewrite 모듈을 사용 할 것이기 때문에 virtual host 설정 파일을 수정 하는 김에, Rewrite 부분도 추가한다. /etc/apache2/extra/httpd-vhosts.conf 파일에 아래 내용을 추가 한다.
<Directory "/Users/dhkim/Sites"> AllowOverride All Options FollowSymLinks Order deny,allow Allow from all </Directory>
접속 관련인데, 로컬로만 돌릴 것이기 때문에 그냥 아무 부담없이 설정 한다.
macbook 에서 apache httpd 로그 분할
apache httpd 의 로그 분할은 예전 부터 cronolog 를 사용해 왔었다. macbook 도 cronolog 를 사용 할 수 있을 거라는 생각에 cronolog 를 다운로드 받아서 configure 를 해 보니...
헉! gcc check 가 no !
설마 하는 생각에 which gcc 를 해 보니....헉! gcc 가 엄서!
서비스 할 것도 아니고 그냥 개인 테스트 용도로 사용할 것이기 때문에, 곧바로 rotatelogs 로 방향 선회.
다행히 rotatelogs 는 /usr/sbin/rotatelogs 에 존재를 하고 있다.
에러 로그와 접속 로그를 다음과 같이 설정하여 로그 분할 완료.
ErrorLog "|/usr/sbin/rotatelogs /Users/dhkim/Sites/log/gboard/error.%Y%m%d 86400"
CustomLog "|/usr/sbin/rotatelogs /Users/dhkim/Sites/log/gboard/access.%Y%m%d 86400" combined
아파치 재시작 하니 로그 잘 남는다. ㅋㅋ
헉! gcc check 가 no !
설마 하는 생각에 which gcc 를 해 보니....헉! gcc 가 엄서!
서비스 할 것도 아니고 그냥 개인 테스트 용도로 사용할 것이기 때문에, 곧바로 rotatelogs 로 방향 선회.
다행히 rotatelogs 는 /usr/sbin/rotatelogs 에 존재를 하고 있다.
에러 로그와 접속 로그를 다음과 같이 설정하여 로그 분할 완료.
ErrorLog "|/usr/sbin/rotatelogs /Users/dhkim/Sites/log/gboard/error.%Y%m%d 86400"
CustomLog "|/usr/sbin/rotatelogs /Users/dhkim/Sites/log/gboard/access.%Y%m%d 86400" combined
아파치 재시작 하니 로그 잘 남는다. ㅋㅋ
Codeigniter 설치
생짜 코딩을 해야 하는 강제적인 환경에 한계를 느껴 cakePHP 를 사용하려고 하다, Codeigniter 라는 framework 이 있다는 말에 구글링 해보니, 문서화도 그럭저럭 되어 있고 속도도 괜찮다는 말에 방향을 급선회 하여 Codeigniter 를 사용하기로 결정 했다.(제발 좀 framework 좀 사용하자고! 왜 그렇게 framework 에 대해서 거부감이 있는지...내가 framework 가져와서 개발 환경 강제로 모두 엎어 버리고 만다 기다려라!)
일단 다운로드는 여기서 Codeigniter 홈.
자바 같이 인스톨에 복잡한 과정이 걸리는 것이 아니기 때문에, 무조건 다운로드(2.1.3 버전) 받아서 mac book 에 구겨 넣었다.(다운로드 받은 것을 압축 풀어서 그냥 복사하면 설치 끝. PHP 만쉐이~ Java 쉣더퍽~)
설치 완료 하고 나면 index.php 페이지가 존재한다. index.php 로 붙어 보면 간단한 환영 페이지가 나온다.
별 다른 이상 없이 설치 완료 된듯.......;;;
나머지 자잘한 것은 필요 할때 마다 설정 하도록 한다. 다음은 메뉴얼 정독 하러 고고씽~
참고로 한국 사용자 포럼 을 방문하면 한글로 된 문서를 참고 할 수 있다.
일단 다운로드는 여기서 Codeigniter 홈.
자바 같이 인스톨에 복잡한 과정이 걸리는 것이 아니기 때문에, 무조건 다운로드(2.1.3 버전) 받아서 mac book 에 구겨 넣었다.(다운로드 받은 것을 압축 풀어서 그냥 복사하면 설치 끝. PHP 만쉐이~ Java 쉣더퍽~)
설치 완료 하고 나면 index.php 페이지가 존재한다. index.php 로 붙어 보면 간단한 환영 페이지가 나온다.
별 다른 이상 없이 설치 완료 된듯.......;;;
나머지 자잘한 것은 필요 할때 마다 설정 하도록 한다. 다음은 메뉴얼 정독 하러 고고씽~
참고로 한국 사용자 포럼 을 방문하면 한글로 된 문서를 참고 할 수 있다.
macbook 에서 php 업그레이드
테스트 서버의 php 버전이 너무 낮아서 업그레이드 하려고 했으나, 개인적인 일로 인해 테스트 서버까지 건드리는 것이 배보다 배꼽이 커 질듯 하여, 그냥 mac book 의 php 버전을 업그레이드 하기로 하였다.
다음은 개발용으로 사용하고 있는 mac book 의 정보 이다.
일단 mac book 에는 기본적으로 apache, php 가 이미 설치 되어 있다. php 버전은 5.3.x.
테스트 용도로 php 5.4 이상이 필요하여 구글링 하다 보니 쉽게 설치 할 수 있는 방법 있어 따라 설치 했다.
One Line Installation
php 5.4 를 설치 하기 위해서 터미널 실행 후, 루트로 로그인 하여 다음 라인을 실행 하였다.
한참 동안 다운로드를 받고 설치를 한다. 완료 되고 난 다음
아파치 죽이고 다시 살리면 PHP Version 5.4.14 로 업그레이드 되어 있다.
나머지 자잘한 설정들은 원본 링크의 "Frequently Asked Questions" 를 참고 하면 된다.
다음은 개발용으로 사용하고 있는 mac book 의 정보 이다.
일단 mac book 에는 기본적으로 apache, php 가 이미 설치 되어 있다. php 버전은 5.3.x.
테스트 용도로 php 5.4 이상이 필요하여 구글링 하다 보니 쉽게 설치 할 수 있는 방법 있어 따라 설치 했다.
One Line Installation
php 5.4 를 설치 하기 위해서 터미널 실행 후, 루트로 로그인 하여 다음 라인을 실행 하였다.
curl -s http://php-osx.liip.ch/install.sh | bash -s 5.4
한참 동안 다운로드를 받고 설치를 한다. 완료 되고 난 다음
아파치 죽이고 다시 살리면 PHP Version 5.4.14 로 업그레이드 되어 있다.
나머지 자잘한 설정들은 원본 링크의 "Frequently Asked Questions" 를 참고 하면 된다.
2013년 1월 31일 목요일
커맨드 패턴(Command Pattern)
출처: Head First Design Patterns : 스토리가 있는 패턴 학습법
커맨드 패턴(Command Pattern)
이건 알게 모르게 자주 사용하고 있는 패턴이다. 특히 요즘 언어들은 자체적으로 커맨드 패턴 방식으로 코딩 할 수 있게 function 을 제공해 주므로, 그것을 이용하면 자동적으로 커맨드 패턴 형식으로 결과물이 나온다.
커맨드 패턴(Command Pattern)
커맨드 패턴을 이용하면 요구 사항을 객체로 캡슐화 할 수 있으며, 매개변수를 써서 여러 가지 다른 요구 사항을 집어 넣을 수도 있다. 또한 요청 내역을 큐에 저장하거나 로그로 기록 할 수 있으며, 작업 취소 기능도 가능 하다.
이건 알게 모르게 자주 사용하고 있는 패턴이다. 특히 요즘 언어들은 자체적으로 커맨드 패턴 방식으로 코딩 할 수 있게 function 을 제공해 주므로, 그것을 이용하면 자동적으로 커맨드 패턴 형식으로 결과물이 나온다.
2013년 1월 29일 화요일
구글 블로그에 code style 적용하기
출처: How to use prettify with blogger/blogspot?
구글 블로그에는 코드 스타일 넣는 것이 없어서 찾아 보다가 좋은 팁을 발견 했다.
원본 내용에는 여러가지 방법들이 있는데, 그 중 가장 간단한 방법이 아래 방식이다.
이렇게 간단한 방법이....
구글 블로그에는 코드 스타일 넣는 것이 없어서 찾아 보다가 좋은 팁을 발견 했다.
원본 내용에는 여러가지 방법들이 있는데, 그 중 가장 간단한 방법이 아래 방식이다.
- Go to Blogger-->Layout-->Edit HTML
- Copy the following snippet and paste it immediately after "
<head>
" in the "Edit template" field:
<link href='http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css' rel='stylesheet' type='text/css'/> <script src='http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js' type='text/javascript'></script>
- After "
</head>
" replace "<body>
" with "<body onload='prettyPrint()'>
" - Click "SAVE TEMPLATE"
- Go to Blogger-->Posting-->New Post. Make sure you're editing the HTML by clicking on "Edit HTML". In the empty field try:
<pre class="prettyprint">int foo=0; NSLog(@"%i", foo); </pre>
- Notice if you click "Preview" now you'll see this code in black only. Don't worry (yet).
- Click "PUBLISH POST" and then "VIEW BLOG". Your code should be prettified.
이렇게 간단한 방법이....
싱글턴 패턴(Singleton Pattern)
출처: Head First Design Patterns : 스토리가 있는 패턴 학습법
싱글턴 패턴(Singleton Pattern)
디자인 패턴을 모르더라도 대부분 알고 있고 유용하게 사용하고 있는 패턴이다. 책에서는 보통 사용하고 있는 싱글턴 패턴 코드에 대해서 고전적인 싱글턴 패턴이라고 말을 하면서, 멀티쓰레드에서는 제대로 작동하지 않는다고 하는데... 멀티쓰레드 되면 프로그램 구조에 대해서 다시 생각해 봐야 하므로 당연한 말이 아닌지....
아무튼 이건 Class Diagram 보다는 코드를 보는게 더 이해가 빠르다.(Class Diagram 에 박스 하나 밖에 없으므로....)
[Java]
1. Thread-unsafe
2. Thread-safe
[Objective C]
1. Thread-safe
멀티쓰레드가 된다면 만들어 놓고 디버깅 하려면 무지 힘드니, Singleton 을 사용한다면 프로그램 구조 설계 할때 잘 생각해서 구현 하도록 하자. 생성 외에 내부 메소드들도 멀티쓰레드 동작이 반영 되어야 할 것이다.
싱글턴 패턴(Singleton Pattern)
싱글턴 패턴은 해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴이다.
디자인 패턴을 모르더라도 대부분 알고 있고 유용하게 사용하고 있는 패턴이다. 책에서는 보통 사용하고 있는 싱글턴 패턴 코드에 대해서 고전적인 싱글턴 패턴이라고 말을 하면서, 멀티쓰레드에서는 제대로 작동하지 않는다고 하는데... 멀티쓰레드 되면 프로그램 구조에 대해서 다시 생각해 봐야 하므로 당연한 말이 아닌지....
아무튼 이건 Class Diagram 보다는 코드를 보는게 더 이해가 빠르다.(Class Diagram 에 박스 하나 밖에 없으므로....)
[Java]
1. Thread-unsafe
public class Singleton { private static Singleton uniqueInstance; private Singleton() {} public static Singleton getInstance() { if(uniqueInstance == null) { uniqueInstance = new Singleton(); } return uniqueInstance; } }
2. Thread-safe
public class Singleton { private volatile static Singleton uniqueInstance; private Singleton() {} public static Singletone getInstance() { if(uniqueInstance == null) { synchronized(Singleton.class) { if(uniqueInstance == null) { uniqueInstance = new Singleton(); } } } } }
[Objective C]
1. Thread-safe
@impelement Singoleton static Singleton* sharedInstance = nil; + (id)sharedInstance { if(sharedInstance != nil) return sharedInstance; static dispatch_once_t pred; dispatch_once(&pred, ^{ sharedInstance = [[self alloc] init]; }); return sharedInstance; } @end
멀티쓰레드가 된다면 만들어 놓고 디버깅 하려면 무지 힘드니, Singleton 을 사용한다면 프로그램 구조 설계 할때 잘 생각해서 구현 하도록 하자. 생성 외에 내부 메소드들도 멀티쓰레드 동작이 반영 되어야 할 것이다.
추상 팩토리 패턴(Abstract Factory Pattern)
출처: Head First Design Patterns : 스토리가 있는 패턴 학습법
추상 팩토리 패턴(Abstract Factory Pattern)
흠...이건 좀 괜찮다.
Factory method pattern 과 엮여 있는 패턴이다. Abstract factory pattern 은 내부에서 Factory method pattern 으로 구현 되어 진다.
그런데, Factory method pattern 은 상속을 통해 factory 가 구현되는 것이고, Abstract factory pattern 은 객체 중심으로 factory 가 구현되는 중요한 차이점이 있다.
factory pattern 은 상황에 맞게 factory method 를 사용할 것인지, abstract factory 를 사용할 것인지 판단 하면 되겠다.
대부분의 경우 factory method 만으로 충분 할 듯....
추상 팩토리 패턴(Abstract Factory Pattern)
추상 팩토리 패턴에서는 인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체를 구상 클래스를 지정하지 않고도 생성 할수 있다.
흠...이건 좀 괜찮다.
Factory method pattern 과 엮여 있는 패턴이다. Abstract factory pattern 은 내부에서 Factory method pattern 으로 구현 되어 진다.
그런데, Factory method pattern 은 상속을 통해 factory 가 구현되는 것이고, Abstract factory pattern 은 객체 중심으로 factory 가 구현되는 중요한 차이점이 있다.
factory pattern 은 상황에 맞게 factory method 를 사용할 것인지, abstract factory 를 사용할 것인지 판단 하면 되겠다.
대부분의 경우 factory method 만으로 충분 할 듯....
팩토리 메소드 패턴(Factory Method Pattern)
출처: Head First Design Patterns : 스토리가 있는 패턴 학습법
팩토리 메소드 패턴(Factory Method Pattern)
이건 좀 실망한 디자인 패턴이다. 팩토리 형식(디자인 패턴이 아니라고 하나 뭐라나...)으로 코딩을 하는 것과 팩토리 메소드 형식으로 코딩을 하는 것을 나누어 두었는데, 실제 코딩을 하다보면 아무 생각 없이 팩토리 형식으로 만들다 보면 결국에는 팩토리 메소드 패턴이 나올수 밖에 없다.
팩토리 메소드 패턴(Factory Method Pattern)
팩토리 메소드 패턴에서는 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만듭니다. 팩토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡긴다.
이건 좀 실망한 디자인 패턴이다. 팩토리 형식(디자인 패턴이 아니라고 하나 뭐라나...)으로 코딩을 하는 것과 팩토리 메소드 형식으로 코딩을 하는 것을 나누어 두었는데, 실제 코딩을 하다보면 아무 생각 없이 팩토리 형식으로 만들다 보면 결국에는 팩토리 메소드 패턴이 나올수 밖에 없다.
2013년 1월 17일 목요일
xcode 에서 github 사용
이것 때문에 2시간 동안 삽질 무진장 했다. 다음 단계로 하면 된다.
-----------------------------------------------------------------------------
[2013.11.18 업데이트. Xcode 5.0.2용]
젠장! 젠장! 젠장! 오랫만에 ios app 이 필요해서 개발 하려고 하니, Xcode 업데이트 되면서 source controll 하는 것이 바뀌었다.....
Xcode 업데이트 되면서 github 와 연동 하는 절차는 바뀌었지만, 좀 더 쉽게 된 거 같은 생각이 든다.
1. github 에서 repository 생성 한다.(돈 주고 쓰는 계정과 개인 계정이 따로 있어서 돈 주고 쓰는 계정에서 private 로 repository 를 생성 하였음)
2. 생성한 repository 를 내 계정으로 collaboration 건다.(만일 github 계정을 동일하게 사용한다면 collaboration 단계는 필요 없음)
3. Xcode 에서 project 생성
4. Xcode 프로젝트의 "Source Controll" 메뉴의 Configure 로 들어 가서 remote 에서 "Add Remote" 를 선택해서 github repository URL 을 추가 한다.
5. Xcode 의 Perference > Accounts 메뉴로 들어 가면, 금방 추가한 github repository 에 User Name, Password 를 추가 한다.(User Name 에서 email address 형식이 아니라 id 형식이 되어야 함)
6. 테스트. 소스 코드 수정 후, commit, push 되는지 테스트
[주의]
* 정보를 제대로 넣었는데 github 에 인증이 안된다고 할때가 있는데, mac 의 keychain 에 등록된 로그인 정보가 잘못 되어서 그럴 수 있으니, 이럴때는 github 관련 keychain 을 모두 삭제 하고 다시 로그인 시도 하면 된다(github 계정이 여러개 라서 이런 경우가 발생 했음)
* repository login 설정에서 User Name 을 email 형식으로 적었는데, 로그인이 안되서 id 형식으로 사용 했음. 이건 제대로 테스트 안 한 것인데, keychain 과 엮여서 그럴 수도 있음. 현재는 잘 되니....email 형태는 테스트 하지 않음.
- github 사이트에 empty project 생성(README.md, ignore 생성하는 것을 체크 하면 안됨. 완전 empty 로 생성)
- xcode 로 원하는 project 생성(local repository 사용 하는 것을 체크 해야 함)
- organize 실행
- organize 에서 해당 프로젝트의 repository 로 이동
- github 사이트로 가서 생성한 empty project 의 주소 복사(https 복사)
- 해당 프로젝트 repository 의 "Remotes" 항목 선택
- "Add Remote" 선택 후 5번에서 복사한 주소와 이름을 입력
- xcode 종료 후 다시 실행(xcode 버그 있는듯 함. 바로 remote 로 접속하면 안됨)
- xcode 실행 후, "File -> Source Control -> Push" 선택
- "Choose the remote to which to push changes" 창이 뜨면서 로그인 하라는 창이 나타남(github 에서 project 를 private 로 생성했음)
- github.com 의 https 를 못 믿는다고 auth 창이 뜸.
- auth 버튼을 클릭하고 들어가서 믿어도 된다고 체크 해 준다.
- push 가 진행 됨.
다음과 같은 이유로 삽질 했으니 주의 하자.
* xcode 와 github 의 디렉토리 관리 차이의 이유로 1번 항목에서 무조건 완전 empty 로 project 를 생성 해야 한다. 만일 empty 가 아니면 연결은 되는데 제대로 작동하지 않는다.
* github 의 project 주소는 https 가 아니라 ssh 로 해도 되는데 이런 경우 github 의 help 항목에서 알려주는 대로 ssh-key 등록 절차를 진행 해 줘야 하기 때문에 좀 귀찮다.
-----------------------------------------------------------------------------
[2013.11.18 업데이트. Xcode 5.0.2용]
젠장! 젠장! 젠장! 오랫만에 ios app 이 필요해서 개발 하려고 하니, Xcode 업데이트 되면서 source controll 하는 것이 바뀌었다.....
Xcode 업데이트 되면서 github 와 연동 하는 절차는 바뀌었지만, 좀 더 쉽게 된 거 같은 생각이 든다.
1. github 에서 repository 생성 한다.(돈 주고 쓰는 계정과 개인 계정이 따로 있어서 돈 주고 쓰는 계정에서 private 로 repository 를 생성 하였음)
<github 에서 repository 생성>
2. 생성한 repository 를 내 계정으로 collaboration 건다.(만일 github 계정을 동일하게 사용한다면 collaboration 단계는 필요 없음)
<github 에서 collaboration 걸기>
3. Xcode 에서 project 생성
<Create git repository on My Mac 으로>
4. Xcode 프로젝트의 "Source Controll" 메뉴의 Configure 로 들어 가서 remote 에서 "Add Remote" 를 선택해서 github repository URL 을 추가 한다.
<Source Controll 의 Configure 선택>
<Add Remote 추가>
5. Xcode 의 Perference > Accounts 메뉴로 들어 가면, 금방 추가한 github repository 에 User Name, Password 를 추가 한다.(User Name 에서 email address 형식이 아니라 id 형식이 되어야 함)
<repository login 설정>
6. 테스트. 소스 코드 수정 후, commit, push 되는지 테스트
[주의]
* 정보를 제대로 넣었는데 github 에 인증이 안된다고 할때가 있는데, mac 의 keychain 에 등록된 로그인 정보가 잘못 되어서 그럴 수 있으니, 이럴때는 github 관련 keychain 을 모두 삭제 하고 다시 로그인 시도 하면 된다(github 계정이 여러개 라서 이런 경우가 발생 했음)
* repository login 설정에서 User Name 을 email 형식으로 적었는데, 로그인이 안되서 id 형식으로 사용 했음. 이건 제대로 테스트 안 한 것인데, keychain 과 엮여서 그럴 수도 있음. 현재는 잘 되니....email 형태는 테스트 하지 않음.
피드 구독하기:
글 (Atom)