|
|
|
|
|
|
| 그냥 내가 보통 사용하는 Makefile Sample sample 을 잘 보면 몇 가지 안 쓰는 부분들이 있지만, Makefile 의 문법을 알기 위해서 나중에 쓸 수 있는 부분들이라서 같이 올린다. | .SUFFIXES = .cpp .o AR = ar CC = g++ CFLAGS = LIBS = INCS = OBJS = cs_socket_addr.o \ cs_socket.o \ cs_netutil.o \ cs_acceptor_socket.o \ cs_connector_socket.o SRCS = $(OBJS: .o=.cpp) TARGET = netlib.a TEST1 = client_test TEST2 = server_test all : $(TARGET) $(TEST1) $(TEST2) $(TARGET) : $(OBJS) $(AR) rcv $(TARGET) $(OBJS) $(TEST1) : $(TARGET) $(TEST1).o $(CC) -o $(TEST1) $(TEST1).o $(TARGET) $(TEST2) : $(TARGET) $(TEST2).o $(CC) -o $(TEST2) $(TEST2).o $(TARGET) .cpp.o : $(CC) -c $(CFLAGS) $*.cpp dep : gccmakedepend $(SRCS) clean : rm -rf $(OBJS) $(TARGET) $(TEST1) $(TEST2) core | |
CharSyam
2009/11/30 00:18
2009/11/30 00:18
|
|
| Track this back : http://liso.or.kr/~charsyam/charsyam/tc/CharSyam/trackback/65 |
|
|
|
| Haskell IO 관련해서 삽질하기 getChar, putChar |
|
|
|
| 시간이 나면 조금씩 함수형 언어를 해볼려고 생각중인데, 생각만 하고, 노력은 안한다는… 사실 노력을 안한 이유 중에, 이거 haskell Sample을 아무리 따라해봐도 제대로 동작하지가 않는다. -_-;; 그런데 엄청난 반전이 있었으니… 나를 괴롭히던 샘플 IO관련 인데 main :: IO() main = do c <- getChar putChar a | 라는 함수가 있었다. 글자를 한자 stdin 으로 받아서 stdout 으로 뿌려주는 아주 단순한 예제인데 자꾸… “The last statement in a 'do' construct must be an expression” 라는 에러가 나면서 샘플을 돌려볼 수가없는 것이었다. 그런데 –_- 위의 예제를 다음과 같이 하면 돌아간다. main :: IO() main = do c <- getChar putChar a | 이런 젠장, do 와 같은 라인에 뭔가가 있으면 안되는 것이었다. T.T 왜 그런지는 나두 잘 모르겠지만, 계속 위의 에러가 나면서 T.T 모두들 이런 실수 안하시길… |
CharSyam
2009/11/24 01:06
2009/11/24 01:06
|
|
| Track this back : http://liso.or.kr/~charsyam/charsyam/tc/CharSyam/trackback/64 |
|
|
|
|
|
|
|
| 한방빌드를 만들어서 쓰다보면, 다음과 같은 경우가 생깁니다. 1. 소스 트리는 하나로 유지하고 싶다. 2. 나가는 대상에 따라서 서로 다른 기능이 동작해야 한다.(바이너리에서 완전히 빠져있게) 사실 결론은 하나입니다. #ifdef 등으로 기능이 다르게 동작하게 하는 것. 그럼 여기에 적용할 수 있는 간단한 방법은 다음과 같습니다. 1. 소스 트리를 따로 유지한다. –> 1번에 위배되고, 유지보수에 손이 많이 갑니다. 2. 프로젝트 속성을 여러개 만들어서, 사용한다. 하지만, 이것도, 한 솔루션에 프로젝트가 여러 개 있다면, 굉장히 번거로운 작업이 생깁니다. 3. 하나의 프로젝트 속성을 쓰데, 매번, 빌드 할 때, #define 속성을 변경해준다. 4. 빌드 시, 자동으로 소스 코드에 설정에 맞는 #define 이 들어가도록 빌드 스크립트를 작성한다. 위에 것들을 보면 4번이 그래도 가장 나아보입니다. 그리고, 설정 작업이 복잡해 진다면, 4번 형태로 가는게 좋을듯 합니다. 그런데, 지금부터 알려드릴(이미 공개된 ㅋㅋ) 옵션을 사용하게 되면, 한방에 처리가 됩니다. 뭐냐 하면, CL 이라는 환경 변수입니다. 먼저 자세한 건 다음 사이트에서 알 수 있습니다. http://msdn.microsoft.com/en-us/library/kezkeayy.aspx 간단하게 설명하자면 set CL=-D_TEST_A_ 이런식으로 지정하면 빌드시에 자동으로 _TEST_A_ 옵션이 적용됩니다. –D 뿐만 아니라 다른 것들도 쉽게 바뀌게 됩니다. 즉, 같은 빌드 프로세스를 타면서 앞쪽에 CL옵션을 설정해서 #define 한것과 같은 효과를 낼 수 있습니다. 간단한 빌드 프로세스에서는 위의 4번과 같은 방법을 쓰지 않고도 효과적으로 사용할 수 있습니다. |
CharSyam
2009/11/21 11:54
2009/11/21 11:54
|
|
| Track this back : http://liso.or.kr/~charsyam/charsyam/tc/CharSyam/trackback/63 |
|
|
|
|
|
|
|
| 아, 오늘도 또 대형사고를 쳐버렸습니다. 신규 서비스를 배포했는데, 바로 버그가 발견되서, 롤백해야 되는 아픈 순간이… 더더욱 문제는, 버그의 원인이, 어려운 것도 아니고, 아주 간단한 것을 실수해 버렸기 때문입니다. 그것도 두가지나!!! 첫번째는, 코드의 문제입니다. 아주 간단한 룰을 꺼꾸로 써버려놓고, 대충 테스트를 하고(딱 버그가 일어나기 직전까지만…) 아 문제없다라고 생각하고 넘어가버렸습니다. 반대로, 그 제대로 테스트를 했을 경우에는 해당 버그가 발생하지 않는 케이스 였다라는게 더더욱 문제였습니다. QA 기간에 QA에서 버그를 발견하지 못하는 것은 QA의 책임은 아니라고 생각합니다. 개발자가 변경 사항에 대해서 더 자세히 알려주고, 테스트케이스에 대해서 고민했다면… 아마도 쉽게 발견했을지도 모르겠습니다. 일단, 저는 이번에 그러지 못했습니다. 두번째는, 배포직전에 백업을 조금 잘못해서, 롤백하는데 대략 1~20분 정도 시간이 걸렸습니다. 사실 이 부분도 큰 문제라고 생각합니다. 1번의 실수는 그래도 단지 실수일 뿐이지만… 두번째는 잘못된 행동이기 때문입니다. 물론, 어떻게 보면, 변명의 여지도 있습니다. 아주 바뻐서, 모두 다 제대로 챙기기에는 힘들었을 수도 있습니다. 하지만… 제대로 해야 하는 것들을 제대로 하지 못한 것을 단지 실수로 여기기 보다는, 여기서 개선점을 찾아내야 한다고 생각합니다. 그래서 “회고” 가 있는 것이겠죠. 이제부터는 기능을 구현하기 전에, 이것을 어떻게 테스트 해야 잘 할 수 있는가 부터, 고민을 해야겠습니다. 그리고, 할 수 있는한, 점검표를 만들어서 실제로 점검하면서 할 수 있도록 해야겠습니다.(단순 반복 작업) 그리고 귀찮다고 대충하는 것은 정말정말 피해야겠습니다. |
CharSyam
2009/11/21 03:02
2009/11/21 03:02
|
|
| Track this back : http://liso.or.kr/~charsyam/charsyam/tc/CharSyam/trackback/62 |
|
|
|
| 아이폰 프로그래밍 시작하기-2 Nib 와 loadView의 관계 |
|
|
|
| 필자, 역시, 아이폰 프로그래밍은 이제 막 시작하는 거라, 완전 밑바닥 부터 공부를 하는 중이다.
(과연 공부를 하고 있냐고 물으신다면, 아니라고 쿨럭…)
사실, 몇달전에 간단한 아이폰 어플을 만든 적은 있지만, 그 때는, 내부 구조를 전부 C++로 만들고, UI만 아이폰 컨트롤을 조금 써서 만들었었다. 그 때의 목표는 Windows Mobile 어플과 아이폰 어플의 로직을 같은 코드로 공유하는 것이었다.
그런데, 그 때도 잘 이해하지 못하고 넘어갔던 것들이 nib 와 각 컨트롤러의 동작들이었는데, 이번에 그 부분을 공부할려고 하니 완전히, 삽질의 바다에서 헤메이는 것이었다. 이래서 물어봐야 하는데, 안 물어본 쿨럭…(혼자서 할 수 있을꺼라고 생각하다니 T.T 주변에 아이폰 프로그래밍 잘하는 사람들이 수두룩 한데 쿨럭…)
그러나, 책을 보고, 예제를 고쳐보고 곰곰히 생각해보니 다음과 같은 관계가 간단하게 성립한다.

이 부분을 잘 몰라서, NIB를 안 쓸려고 하니, 화면이 나오지 않는다든지, 또는 원하는 동작이 일어나지 않는다든지 한 것이다. 그렇다면 NIB를 안쓰고 할려면 위의 Nib 가 해주는 역할을 개발자가 대신 해줘야 하는 것이다.
1) NIB를 사용할 경우
- (void)applicationDidFinishLaunching:(UIApplication *)application { [window addSubview:viewController.view]; [window makeKeyAndVisible]; } |
2) NIB를 사용하지 않을 경우 – MainWindow.xib 는 쓸 경우
|
- (void)applicationDidFinishLaunching:(UIApplication *)application { HelloController *viewController= [[HelloController alloc] init]; [window addSubview:viewController.view]; [window makeKeyAndVisible]; } |
2) NIB를 사용하지 않을 경우 – 전체 사용 안함
|
- (void)applicationDidFinishLaunching:(UIApplication *)application { UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; HelloController *viewController= [[HelloController alloc] init]; [window addSubview:viewController.view]; [window makeKeyAndVisible]; } |
다른 부분들도 바뀌어야 하는 부분들이 있지만, nib를 안쓰면 다음과 같이 코드 부분들이 늘어나는 것을 알수 있다. |
CharSyam
2009/11/16 01:32
2009/11/16 01:32
|
|
| Track this back : http://liso.or.kr/~charsyam/charsyam/tc/CharSyam/trackback/61 |
|
|
|
| 아이폰 프로그래밍 시작하기-1 프로그램 실행 아이콘과 로고화면 |
|
|
|
| 아이폰 프로그래밍을 하면서 보통 Objective-C 나 ViewController, NavigationController 를 사용하는 방법에 대해서 알려주시만…
그것보다 더더욱 중요한(?) 프로그램 실행 아이콘과 로고화면을 바꾸는 방법에 대해서는 내용이 별로 없다 –_-
그러나 엄청 쉬운 방법 –_-;
그럼 어떻게 하느냐?
| |
파일명 |
사이즈 |
| 프로그램 실행 아이콘 |
icon.png |
60x60 |
| 프로그램 로고 화면 |
Default.png |
320x480 |
여기서 중요한 것은 프로그램 로고 화면의 이름이 첫글자가 대문자 D라는 것이다.
(사실, 이건 대소문자 구별할 경우에 문자가 되는 부분이다.)
그리고 Project 에 추가하면, 바로바로 코드를 지정하지 않아도 지정되는 모습을 볼 수 있다. |
CharSyam
2009/11/11 23:11
2009/11/11 23:11
|
|
| Track this back : http://liso.or.kr/~charsyam/charsyam/tc/CharSyam/trackback/60 |
|
|
|
| 급히 수정해야 하는 버그는 또 다른 버그를 만든다. |
|
|
|
| 크, 역시 급히 수정해야 하는 버그는 새로운 버그군을 만들어 낸다. 오늘 급히 수정해야 할 버그를 고치기 위해서, 코드에 변경을 했다. 그 다음부터 –_-, 동작이 하나씩 안되기 시작하더니, 급기야 –_-, 주요 기능이 동작하지 않게 되었다. 물론, 원인을 하나하나 분석하기 시작해서 이전 코드의 동작이 제대로 되도록 수정을 하기는 했지만 –_- 흑흑흑… 급한 마음으로 코드를 짜면, 역시 버그가 나올 수 밖에 없다. 좋은 테스트 코드가 있다면 좋겠지만, 아직 그러기에는 힘든 T.T |
CharSyam
2009/11/07 02:24
2009/11/07 02:24
|
|
| Track this back : http://liso.or.kr/~charsyam/charsyam/tc/CharSyam/trackback/59 |
|
|
|
|
|
|
|
| 혹시 예전에 이런 얘기를 들어본 적이 있는가? 어미 게가 아기 게는 바르게 걷기를 바래서, 아기 게의 걸음을 보정해 주려고 노력하는 이야기… 이 이야기의 요점은… 어미 게의 감동적인 자식 교육이 아니라, 잘못된 교육이라는 것이다. 이걸 아주 강하게 느끼는 것이, 현재의 나다 T.T 내 코드는 좀 더럽다 –_-, 아주 깔끔하게 짜는 것도 아니고, 시간이 없을 때에는 더더욱, 더러운 코드를 생산한다. 스멜이 강하게 나는!!! 그런데, 이번에 프로젝트를 진행하면서, 나와 신입 프로그래머 한명이 담당하게 되었다. 그런데, 코드 리뷰를 해주고, 해당 코드를 수정할 일이 있어서, 코드를 보는데, 우어어어어, 알아보는 데 시간이 걸렸다. 그런데 재미있는 것은, 이 친구가 작성한 다른 코드를 보면, 아주 깜끔한 코드 부터, 아주 더러운 코드까지 각양각생이었다. 그 이유가 무엇일까? 원인은 바로 기존 코드의 참고이다. 즉, 참고한 코드가 깔끔한 코드이면, 신입이 작성한 코드도 깔끔한 코드가 되고, 참고한 코드가 더러운 코드가 되면, 신입이 작성한 코드도 매우 더러운 코드가 되어버리는 것이다. 그리고 가슴아프게도, 더러운 코드 부분은 나의 더러운 코드를 보고 흉내를 낸것이었다. 그걸 보니, 코드를 깔끔하게 짜야겠다라는 생각이 부쩍든다. 왜냐하면, 참고할 코드를 작성하는 선배가 바담뿡 하고 있는데, 그걸 보고 배우는 신입사원이 바람풍 할리는 없기 때문이다. 결국, 누구의 잘못이 아니라, 나의 잘못이다. 더더욱 깔끔한 코드를 생성하려고 노력해야겠다. |
CharSyam
2009/11/02 01:50
2009/11/02 01:50
|
|
| Track this back : http://liso.or.kr/~charsyam/charsyam/tc/CharSyam/trackback/58 |
|
|
|
|
|
|
|
| qsort[] = [] qsort(x:xs) = qsort larger ++ [x] ++ qsort smaller where smaller = [a | a<- xs, a <= x] larger = [b | b <- xs, b > x] double x = x * 2
파일로 저장한건 되는데 왜, 그냥 번역기에서 돌리면 안될까? |
CharSyam
2009/11/02 00:18
2009/11/02 00:18
|
|
| Track this back : http://liso.or.kr/~charsyam/charsyam/tc/CharSyam/trackback/57 |
|
|
|
|
 |
|