티스토리 툴바


Search

'전체'에 해당되는 글 122건

  1. 2011/12/09 panT writer 만들기 #1
  2. 2011/10/31 iOS, Object-C를 이용한 아이폰/아이패드 개발에서 Delegate에 대한 이해-2. 이벤트
  3. 2011/10/30 iOS, Object-C를 이용한 아이폰/아이패드 개발에서 Delegate에 대한 이해-1. prolog (2)
  4. 2011/10/20 XCode (4.2)에서 C++과 Objective-C 를 동시에 쓰기
  5. 2011/10/19 혼자 버그라고 오해한 XCode 4.2의 컴파일 에러
  6. 2011/10/18 macos Lion으로 업데이트 후 XCode를 4.2로 업데이트 후 AutoReleasePool의 변화
  7. 2011/10/14 사진 관련 잡지를 찾다가 iOS5로 업그레이드하면서 알게 된 뉴스 가판대 잡지-Popular Photography
  8. 2011/10/11 [CentOS 6] 설치 후 콘솔 해상도 조정하기
  9. 2011/10/11 [CentOS 6] 처음 설치 후 IP 설정 안될 때
  10. 2011/08/27 자바, iOS의 Object 와 id 에 대해
  11. 2011/05/27 iBatis 삽질의 추억
  12. 2011/04/24 AIX에서 부팅하면서 자동실행될 파일들 등록하기
  13. 2010/09/12 애니게이트 공유기 RG 3500 발열 문제 해결하기 - 잘만 방열판 사용
  14. 2010/08/25 그간 개발한 스마트폰용 어플들. (2)
  15. 2010/07/21 iBatis에서 iterate 쓰기 : 여러개의 or이나 in 안에 여러 개의 데이터 넣기 (2)
  16. 2010/07/08 HumanChecker를 만들다.
  17. 2010/05/20 오라클 10g 리스너 포트번호 바꾸기.
  18. 2010/04/13 토드에서 실행계획 확인하는 방법
  19. 2010/04/13 도요타 사태로 우리나라 기업들이 배운 것
  20. 2010/03/15 JBOSS 5 + maven에서 MSSQL 연동하기
  21. 2010/03/14 드뎌 찾았다! 이클립스에서 사용가능한 델파이식 북마크!
  22. 2010/03/09 IBM AIX 타임 서버랑 싱크맞추는 법
  23. 2010/03/04 아놔 델파이 TTcpClient로 문자열 보내기
  24. 2010/02/23 IBM AIX 6에 Oracle 10g client 설치하기
  25. 2010/02/22 jboss soap wsdl 주소 변경하는 방법
  26. 2010/02/09 JBoss 5: 웹서버와 웹서비스 서버 물리적으로 분리하기
  27. 2009/11/10 3D Studio max에서 기본 단위를 mm로 설정하는 방법
  28. 2009/10/23 oracle MD5 암호화
  29. 2009/10/23 오라클 특정 컬럼 암호화 하기
  30. 2009/09/25 VerifyError: Error #1014: 클래스 common::CCDPBase를 찾을 수 없습니다.

panT writer 만들기 #1

개발일지 2011/12/09 22:05 Posted by 팬소년

  

나는 TStory만 사용한다.

특별한 이유는 없지만, 그냥 다른 블로그들의 제한이 넘 싫다.

그리고 내가 제일 싫어하는 것 중 하나는 웹에서 직접 문서를 작성하는 거다.

제일 싫은 건 날아갈까 걱정되는 거고,

두번째로 싫은 건 사진 추가가 Drag & Drop으로 안된다는 거다.

그래서 Windows Live Writer를 사용하게 되지만, 내가 원하는 기능이 없기도 하고, 좀 불편한 점도 있고, 플러그인을 지원하지만 모든 이벤트에 대한 플러그인을 지원하는 것도 아니고, 플러그인을 사용하는 것도 쫌 불편하고...

 

여튼 그래서 지금 TStory용 라이터를 만들려고 한다.

플래폼은 Mac OS만 지원한다. ㅋ.맥에서 만들 거니까.

 

그런데 아직 모르는 게 너무 많다.

당장 맥용 에디터를 어떻게 만드는지부터 모르겠다.

맥은 caret라고 부르지 않나보다. View에 문자 입력용 커서(윈도우에서는 캐럿이라고 부르는데)를 올려놓고 키보드에 반응하는 것부터 어떻게 해야할 지 전혀 모르겠다.

ㅍㅋㅋ. 끝을 낼 수나 있을지 모르겠다.

 

하지만, 나는 이걸 시작해 보려 한다.

오늘 프로젝트도 만들었다. 프로젝트 이름은 panTWriter다

프로젝트를 만들어야 시작을 하지.

 

그리고, Sqlite3를 이용하지 않고 CoreData를 이용하려 한다.

sqlite3가 좀 지랄맞기도 하고, 메모리릭이 폭발한다는 제보도 있어 애플이 미는 CoreData를 이용하기로 했다.

시간은 좀 많이 걸리겠지만 CoreData를 공부해서 CoreData를 프로젝트에 밀어넣어 보겠다.

하다 안되면 Sqlite3를 이용할 수도 있음. ㅍㅋㅋ

 

"Use Core Data"에 체크를 하면서 어찌나 고민했던지.

눌러버리고 저장해 버렸으니 끝이다. ㅋ

'개발일지' 카테고리의 다른 글

panT writer 만들기 #1  (0) 2011/12/09





  

이벤트에 대해 알아보자.

 

이벤트는 이해하기 어렵지 않으니 Delegate에 대한 첫번째 발걸음으로 적합하다.

이벤트는 객체지향 프로그래밍의 가장 기본적인 설계 기법 중 하나라 할 수 있다.

객체지향 프로그래밍의 특징이 여러가지 있지만 그 중 하나가 재사용성이다.

재사용성과 이벤트가 무슨 관계가 있을까. 아래 마이클잭슨의 사례로 한번 생각해 보자.

 

 

마이클 잭슨 한국에 오다. 100여명의 스탭과 함께.

 

이제는 고인이 된 마이클 잭슨이 한국에 온 적이 있다. 그가 온다는 것만으로도 울트라 빅빅빅 이슈였지만, 함께 이슈가 되었던 건 100여명의 스탭과 함께 오기 때문에 모셔오는 비용이 어마어마하다는 거였다.

같이 오는 100여명의 스탭 중에는 헤어디자이너, 무대 감독, 음향 감독 뿐 아니라 전용 요리사들도 포함되어 있었다.

 

여기서 우리는 전용 요리사들에 주목해 보자.

물론 무대 준비를 때문에 예민해진 마이클 잭슨을 위해, 그의 입맛에 맞는 요리를 준비하는 요리사들은 어쩌면 필수일지 모른다. 하지만 이런 개인적인 감정 문제는 다 접어두고 큰 그림만 생각해 보자.

 

마이클 잭슨이 배가 고프면 밥만 제공해 주면 된다. 마이클 잭슨은 입맛이 까다롭지 않고 주는대로 먹는 착한 어른이니까.

그리고 총괄 스태프는 마이클 잭슨에게 요리사들을 전부 알려주고 배가 고프면 이 요리사들에게 얘기하라고 정해주고 자기는 싹 빠졌다.

 

이제 마이클 잭슨이 배가 고프면 아래의 프로세스를 따를 거다.

 

1. 마이클 잭슨이 배가 고프다.

2. 한식이 먹고 싶으면 한식 요리사를, 중식이 먹고 싶으면 중식 요리사를, 양식이 먹고 싶으면 양식 요리사를 찾는다.

3. 배가 고프니 밥달라고 얘기한다.

4. 요리사가 그 요구를 받아들인다.

5. 요리사가 요리를 준비하고 식사를 제공한다.

 

너무도 당연한 흐름이지만, 객체지향 프로그램을 설계하는 입장에서는 약간 문제가 있어 보인다.

객체지향 프로그래밍을 설계하는 입장에서 가장 문제가 되는  것은 “2번 요리사를 찾는다”이다.

 

만약 마이클 잭슨이 “나 배고파” 라고 총괄 스태프에서 얘기하면 총괄 스태프가 알아서 요리사를 찾아 음식을 제공해 주는 구조였다면 전용 요리사는 필요하지 않았을 거다.

 

문제가 되는 건 마이클 잭슨이 특정 요리사를 직접 찾았다는 거다.

 

위 문제에 대한 객체지향적인 해결 방안은 다음과 같다.

 

1. 마이클 잭슨이 배가 고프다.

2. 배가 고프다고 하늘에 대고 소리친다.

3. 총괄 스태프가 이 소리를 듣고 한식, 중식, 양식 요리사 들 중 한명을 배정해 음식을 만들어 달라고 요구한다.

4. 요리사가 그 요구를 받아들인다.

5. 요리사가 요리를 준비하고 식사를 제공한다.

 

둘의 차이를 명확히 알 수 있는가.

배고픈 당사자인 마이클 잭슨이 직접 요리사를 찾는지, 아니면 그냥 하늘에 대고 배고프다고 소리치면 총괄 스태프가 듣고 알아서 상황에 맞는 요리사를 찾아서 일을 시키는지가 가장 큰 차이이다.

 

마이클 잭슨의 입장에서는 배가 고프면 말할 수 있는 상대가 특정의 몇몇 요리사들 뿐이기 때문에 배가 고플 때를 대비해서 그 요리사들을 데려올 수 밖에 없었던 거다.

배가 고프다고 다른 사람들한테는 얘기할 수 없고 꼭 그 요리사들한테만 얘기하도록 정해져 있기 때문에 그 요리사들을 데려와야만 한다.

 

이걸 좀더 확대하면, 헤어를 위해 전용 헤어 디자이너, 전용 의상 담당, 구두, 악세사리, 무대, 음향, 기타 등등 마이클 잭슨이 직접 다 찾아서 얘기해야 하기 때문에 마이클 잭슨 한명만 오면 그 모든 스태프들이 다 딸려와야 한다.

그중 한명이라도 없으면 마이클 잭슨은 제대로 된 공연을 할 수 없다.

 

헤어를 다듬어야하면 하늘에 대고 “나 머리 좀 잘라줘~” 라고 소리치면 총괄 스태프가 이걸 듣고 알아서 한국에서 잘 나가는 헤어 디자이너를 섭외해 머리를 잘라주는 구조였다면 굳이 전용 헤어 디자이너를 미국에서 여기까지 데려오느라 큰 돈을 쓰지 않아도 되었을 거다.

이런 식으로 전부 확대하면 100여명의 스태프가 아니라 1-2명의 총괄 스태프 등 핵심 스태프 몇 명만 같이 왔어도 되었을지 모른다. 그럼 돈도 무지 절약했을텐데.

 

 

그런데 우리 프로그래머들도 이렇게 돈을 무지 쓰는 일을 하고 있다.

 

프로그래머라면 대부분 어떤 프로젝트에서 클래스 하나를 만들어 놓고 와~ 잘 만들었다~ 혼자 감탄하면서 다른 프로젝트할 때도 가져다 쓰기 위해 다른 프로젝트에 던져 놓았더니, 그 클래스 안에서 다른 클래스나 파일들을 요구해서 하나씩 복사해 넣다가 결국은 프로젝트 전체를 다 복사해 넣어야 하는 상황이 발생해서 포기한 경험이 있을거다. ㅋ.

 

바로 마이클 잭슨과 같은 경우다.

 

한 클래스에서 다른 클래스를 사용하도록 프로그래밍 하는 경우가 바로 그런 경우다.

물론 대부분 한 클래스에서 다른 클래스를 사용하도록 설계하지만, 어떤 클래스들은 내부적으로 아무런 클래스도 사용하지 않도록 설계되어야 한다.

그래야 다른 프로젝트에서 사용할 때 아무런 문제없이 사용할 수 있다.

이래야 객체지향 프로그래밍의 특징 중 하나인 “재사용성”을 높일 수 있다.

 

예를 들어 질량 계산을 담당하는 클래스라면 그 클래스의 헤더파일과 구현 파일들만으로 (상속을 받았다면 그 상위 클래스들까지 포함) 모든 기능을 제공해야 한다는 거다.

다른 클래스를 가져다 쓰기 시작하면 그 클래스가 또 다른 클래스를 필요로 하고 그 또 다른 클래스는 또또 다른 클래스를.. 또또또 다른 클래스를… 이래서는 재사용성이 보장되지 않는다.

 

이렇게 클래스의 헤더 파일과 구현파일만으로 하나의 기능이 완벽하게 보장되면 재사용성이 보장될 수 있다.

 

그런데 이렇게 다른 클래스를 쓰지 않기 위한 또 하나의 조건이 있다.

 

바로 마이클 잭슨처럼 배고프면 배고프다고 외치는 매커니즘으로 구현되어야 한다는 거다.

배고프다고 특정 요리사에게 얘기한다면, 이거이 바로 클래스 안에서 다른 클래스를 쓰는 거다.

재사용성이 보장되기 위해선 나 외에 다른 클래스는 아예 알아서도 안된다.

그냥 “나 배고파요~”라고 외치기만 해야 한다.

 

똑같은 쇠구슬 하나를 놓고 은하계의 각 행성마다 다르게 나타나는 질량을 계산하는 클래스에서 중력가속도가 필요하다면 중력가속도를 알려주는 클래스를 이용할 게 아니라,

“XX 행성의 중력가속도를 알려줘요~” 라고 소리치기만 해야 한다는 거다.

실제로 아이폰용 프로그램 개발의 많은 부분이 이런 식으로 이루어지고 있다.

 

이렇게 소리지르고 난리를 치면 담당하는 누군가가 듣고 그 값을 알려준다.

여기서 중요한 건, 질량을 계산하는 클래스는 그 담당자가 누구인지는 전혀 모르고, 그게 누구이건 아무런 상관이 없다는 거다.

기억하자. 우리의 “재사용용성이 보장되는” 클래스는 자기 자신 외에는 아무도 모르고 있어야 한다.

소리만 칠 줄 알아야 한다.

 

버튼의 경우를 보자.

우리는 버튼에게 색상, 크기, label 등을 정해준다.

내가 버튼에게 명령을 내리는거다.

그런데 버튼이 눌려진 처리를 해야 한다면?

 

 

많은 사람들이 위와 같은 그림을 그려놓고 이벤트를 설명하지만, 위 그림은 틀렸다.

 

버튼은 아무런 클래스도 모르는 “재사용성이 뛰어난” 클래스이기 때문에 form에게 자기 버튼이 눌렸음을 알려주지 못한다.

다만 “나 눌렸어요~” 하고 소리치는 것밖에 할 수가 없다. 다른 아무런 클래스도 알지 못하니까 .

그냥 소리만 치는거다.

 

모든 건 form이 다 알아서 한다.

form에서 버튼 클래스를 하나 사용하면서 이 버튼이 “나 눌렸어요~” 라고 소리치면 어떻게 처리할지를 정해놓는거다.

그러면서 계속 버튼 클래스에 귀를 기울이고 있다. “나 눌렸어요~”라고 소리치는지 안치는지 듣고 있는거다.

 

이거 큰 차이다. 버튼 클래스가 form에게 알려주는지, 아님 그냥 소리만 치고 마는거지.

듣는 사람이 없으면 그냥 소리는 공허하게 흩어지고 만다. (실제로 이런 경우는 많다.)

 

자, 이런 게 이벤트다.

한 놈은 소리만 치고, 다른 놈은 소리치는지 듣고 있다가 불편한 거 해결해 주고.

 

뭐라고 소리지를지 미리 약속을 정해놓은 게 protocol이고 이런 체계가 Delegate다.

 

이제 계속 연재를 통해 프로토콜과 Delegate의 동작 방법에 대해 설명하겠다.

 

이 글이 도움이 되셨다면 아래 손꼬락을 꼬옥 눌러주세요. 큰 힘이 됩니다. 그리고 댓글도 남겨주시면 더더욱 크~ㄴ 힘이 됩니다. ^^;






  

iOS에서 Object-C를 이용해 아이폰/아이패드 개발을 할 때 절대 빼 놓을 수 없는 필수 요소가 Delegate이다.

이게 없으면 개발을 할 수가 없을 정도인데, 블로그에서 delegate에 대해 찾아보면 이에 대한 정보가 정말 빈약하다.

그래서 이 연재를 만들기로 했다.

 

Delegate에 대해 이해하려면 꽤 많은 걸 알아야 한다.

 

우선 interface나 abstract class 에 대해 알아야 한다. 자바, C#, 델파이, C++, Action Script에서는 interface나 abstract class 라고 부르지만, Objective-C에서는 protocol이라고 부른다.

 

그리고 callback 에 대해서도 이해해야 한다.

Callback은 단순해서 좀 이해하기 쉬운데, 보통은 A 클래스에서 B 클래스의 메소드를 호출하는 식으로 이용하는 관계에서 그 반대인 B 클래스에서 A 클래스로 호출하는 것을 Callback라고 부른다. 예를 들어 우리는 보통 “Button” 에게 색과, 위치, 표시될 label 등을 설정해 주는 식으로 우리가 Button에게 call을 하는데, button이 눌리는 일이 발생하면 반대로 button이 우리에게 “나 눌려졌어요~” 하고 알려주는 것과 같은 거다. Win 32 프로그래밍을 할 때는 이걸 이벤트라 부르고, iOS의 Objective-C에서는 이런 처리를 Delegate라고 하는 것만 다르다고 하면 되겠다. 

C/C++에서는 이걸 함수 포인터를 이용해서 처리하고, 델파이에서는 이벤트로 처리한다. (이 방면에서는 델파이가 제일 나은 방법을 제공하는 듯 하다.) 자바는 interface / abstract class에 의해 처리하고, C#은 Objective-C와 같은 Delegate라는 이름으로 처리하는데 이름만 다르지 실제 처리하는 밑으로 내려가면 결국은 다 같은 놈들이다.

 

이런 것들을 다 이해해야 Delegate의 동작 원리에 대해 제대로 알 수 있다.

동작 원리를 제대로 밝힌 글들은 없어 내가 한번 써보려 한다.

이 글이 도움이 되셨다면 아래 손꼬락을 꼬옥 눌러주세요. 큰 힘이 됩니다. 그리고 댓글도 남겨주시면 더더욱 크~ㄴ 힘이 됩니다. ^^;






  

이 간단한 걸 기억 못해서 어제 종일 끙끙댔다.

그래서 기록을 남겨본다

 

XCode는 C++ 과 Objective-C 를 동시에 쓸 수 있.. 쓸 수 있을수도 있도록 지원하고 있다.

그래서 나는 중요한 클래스는 그냥  C++ 로 만들고 UI와 관련된 부분만 Objective-C 로 만들려고 생각하고 있다.

 

그런데, 오랜만에 해보니 이게 잘 안되는거다. 블로그 검색해도 잘 나오질 않고.

 

방법은 간단하다.

1. C++클래스를 사용하는 Objective-C 파일의 확장자를 .m 에서 .mm 으로 바꿔준다. .cpp 확장자를 .mm으로 바꾸는 게 아니라, .m 파일의 확장자를 .mm으로 바꾸는거다.

 

이렇게만 해도 되는데, 만약 이래도 안되면,

 

2. .cpp 파일의 속성을 아래와 같이,

"Objective-C++ source" 로 바꿔준다.

스크린샷 2011 10 20 오후 2 57 46 1

 

사실 이게 XCode 3.2때는 꼭 해줘야 했었는데, 이번 4.2에서는 굳이 안해줘도 처음부터 잘 된거 같다. (사실 이것저것 세팅을 건드려서 확실치는 않음. 여튼 안되면 이걸 보자.)

 

그리고 어떤 분이 이렇게 Objective-C에서 C++을 사용하면 생성자와 소멸자가 호출이 안된다는 소문을 내셨는데,

실제 테스트해본 결과 XCode 3.x대와 4.2 모두 C++ 클래스의 생성자와 소멸자가 제대로 호출되는 걸 확인했다.

 

TestUnit에서도 C++ 클래스 잘 인식되고(당연하지만 ㅋ) 넘 기쁘다. 이제 코딩만 남았다. 코딩만.. 남았네.

 

 

이 글이 도움이 되셨다면 아래 손꼬락을 꼬옥 눌러주세요. 큰 힘이 됩니다. 그리고 댓글도 남겨주시면 더더욱 크~ㄴ 힘이 되겠습니다. ^^;






  

오늘 그렇잖아도 시간도 별로 없었는데, 짬날때마다 이것 때문에 삽질 좀 했슴미다.

너무나도 단순한 문제인데 컴파일이 안되어 이거이  XCode 4.2의 버그라고 생각했는데, 역시나 제 잘못이었슴미다.

 

진짜 간단한, Apple에서 제공한 tutorial을 따라하는 중이었는데,

 

#import <Cocoa/Cocoa.h>

 

@interface HelloView : NSView

{

NSString * m_pstrText; // 여기서 보여줄 문자열

}

 

-(void) test;

 

@end

 

위와 같은 클래스를 정의해 놓고, 외부에서 test() 메소드를 호출하겠다고만 하면

 

"AutoreleasePool count reference issue" 라고 시작하는, 암튼 저런 함수가 없다 라는 말도 안되는 컴파일 에러 메시지가 나온다.

 

clean을 아무리 하고 껐다켰다를 반복해도 마찬가지였다.

그래서 이름만 다르게 하고 똑같은 기능을 하는 새로운 클래스를 만들어서 테스트해보니

당연히 잘 된다. 잘 되야 하니까.

 

도대체 왜 안될까를 고민면서 잘되는 파일과 잘 안되는 파일의 속성을 비교해 보았다.

 

이런 저런 속성들을 찾아보다 드뎌 그 문제를 확인했다.

 

XcodeLocation

 

처음 봤을 때, 다른 점은 파란색으로 표시한 "Relative to Project" 부분이었다.

 

Location의 위치가 다른 파일들은 모두 "Relative to Group" 이었는데, 문제가 되는 그 클래스의 파일 2개만 "Relative To Project"였다.

그래서 그 클래스를 위한 2개의 파일을 그냥 다른 조치없이 Location을 "Relative to Group"으로만 바꿔줘 봤다.

 

그래도 여전히 마찬가지로 똑같은 에러가 났다.

 

또 뭐가 문젠가 봤더니 다른 파일들은 모두 다 같은 폴더 안에 있는데, 그 2개의 파일만 다른 위치에 있었다.

그래서 모두 같은 폴더 안에 들어가도록 맞춰줬다.

 

다행히도 XCode는 파일을 우클릭하면 Finder에서 보여주는 기능을 제공한다.

그래서 쉽게 파일의 위치를 조정할 수 있었고, 위 그림에서 빨간색 버튼을 클릭하면 해당 파일의 위치를 다시 잡아줄 수 있다.

 

이런 식으로 파일 위치를 잡아줬더니 문제가 모두 해결되었다.

아마도 XCode에 캐시가 있었던 게 아닌가 싶다.

그래도 Clean을 했는데도 계속 캐시를 쓰면서 에러가 발생한 건 큰 문제다.

 

이렇게 해 놓으니 다시 원래의 상태로 돌려놔도 컴파일 에러가 발생하지 않는다.

 

도대체 왜 이러는지 많이 궁금했는데, 이제 원인도 파악하고 문제도 해결되어 넘 개운하다. 하하.

이 맛에 파고드는거지 모.

 

 

이 글이 도움이 되셨다면 아래 손꼬락을 꼬옥 눌러주세요. 큰 힘이 됩니다. 그리고 댓글도 남겨주시면 더더욱 크~ㄴ 힘이 되겠습니다. ^^;






  

예전엔 XCode에서 Console 프로그램을 만들면

 

int main()

{

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

...

 

[pool release];

}

 

이런 식으로 진행되었던게, 이번에 4.2로 업데이트 후 다시 보니,

 

int main (int argc, const char * argv[])

{

@autoreleasepool

{

// insert code here...

NSLog(@"Hello, World!");

}

 

return 0;

}

 

이렇게 바뀌었다.

 

@autoreleasepool 의 블록으로 감싸서 그 안에서 reference count를 기반으로 한 메모리 관리가 되도록 한 것이다.

좀 많이 편해졌다고 봐야 하나. 타이핑할 수가 줄어들었으니 좀 편해졌다고 볼 수도 있겠다.

 

많이 바뀌고 발전하는구나. XCode도.

Visual Studio만큼 더 발전했으면 하는 바람이다.

 

 

이 글이 도움이 되셨다면 아래 손꼬락을 꼬옥 눌러주세요. 큰 힘이 됩니다. 그리고 댓글도 남겨주시면 더더욱 크~ㄴ 힘이 되겠습니다. ^^;






  

전부터 사진 관련 잡지들을 찾아봤었는데, 딱히 눈에 들어오는 게 없더라구요.

그러다 이번에 아이패드를 iOS5로 업그레이드하면서 IOS 5에 새로 생긴 뉴스 가판대에서 이것저것 뒤적이다 “Popular Photography” 라는 잡지가 있는 걸 알았습니다.

 

 

이렇게 생겼는데, 프리뷰용을 보다 보니 괜찮겠다 싶어 2011년 9월호를 $2.99에 구입했습니다.

영문판만 있는 거 같습니다.

어차피 사진만 볼건데 뭐.. ㅋ.

 

 

가격 정책은 최신호는 $4.99,

한달이라도 지난 건 $2.99 입니다. 최신호가 한 5,500원, 달이 지나면 3,500원 정도 하는 거네요.

 

 

그리고 한달에 $1.99를 내면 달마다 자동으로 새 잡지를 받아볼 수 있고,

6달을 자동으로 볼 거면 $9.99,

1년은 $14.99 네요.

 

1년치 다 해봐야 2만원이 안되네요.

괜찮은 조건이라는 생각이 듭니다.

 

사진을 인쇄해서 보면 왜 이래.. 하는 생각도 드는데 차라리 아이패드로 보면 더 낫지 않나 싶기도 하네요.

 

 

위 사진은 조금 불편한 점이기도 한데,

꼭 끝까지 다 다운로드 받아야 볼 수 있슴니다. 제가 구입한 2011년 9월호 버전은 113메가 정도 되네요.

살짝 부담스럽기도 합니다.

그리고 동시에 여러 개를 다운받지도 못합니다. 것도 좀 불편하네요.

그리고 돈주고 구입한 건 색을 좀 달리하면 어떨까 하는 생각도 듭니다.

 

처음 들어가면 아래와 같이 사용법에 대해 설명하고 있습니다.

 

 

사용법이 좀 복잡하죠? ㅋ.

저도 위아래 스크롤과 좌우 스크롤만 하고 있슴미다. ㅎ

 

 

아래는 목차입니다.

꽤 다양한 내용을 다루고 있습니다.

 

그리고 이런 탐론렌즈 광고도 붙어 있습니다.

이런 광고를 처음보니

광고인데도 웬지 좋이네요. ㅎㅎ. 탐론광고라..

 

 

 

캐논 광고도 있습니다.

강렬하네요. ㅋ

 

 

사진 전문 잡지 답게

뮤직비디오같은 사진 찍는 법에 대해 주제로 다루고 있습니다.

 

 

이렇게 소상히 설명해 주네요.

감탄.. 자세한 내용은 일부러 글상자로 가렸슴미다. ㅋ.

 

 

이런 멋진 사진들도 많고. 사진 잡지로 손색이 없네요. 많이 괜찮습니다.

약 $3에 이정도 볼 수 있다는 건 꽤 괜찮은 일인 거 같네요.

이 글이 도움이 되셨다면 아래 손꼬락을 꼬옥 눌러주세요. 큰 힘이 됩니다. 그리고 댓글도 남겨주시면 더더욱 크~ㄴ 힘이 됩니다. ^^;






  

centos 6를 처음 설치하고 나면, 콘솔인데도 해상도가 너무 높아(아마도 최고 해상도로 설정되는 듯) 굉장히 불편하다.

 

차라리  X-Window를 깔아 써야겠다고 생각하면서 yum을 사용하려다,

그래도 난 콘솔이 더 편한데... 하는 생각에 찾아봤다.

 

여기저기서 다들 /boot/grub/menu.lst  파일을 수정하라고 하는데, 이거이 처음엔 잘 되다가 내가 링크를 깨먹는 바람에 ㅋㅋ 안되버리는 거다.

 

그러다 알아낸 거. /boot/grub/grub.conf 파일을 수정하면 된다. 그리고 리부팅.

 

이 파일 안에 kernel이라고 되어 있는 부분이 있는데 (# 주석으로 시작하는 부분 말고)

이 끝에 vga=0x311 video=640x480-256@60 이라고 넣어주면 된다.

 

이렇게 하면 640x480의 해상도에 256색, 60hz로 표시된다.

 

처음엔 1024x768로 했는데 내 눈에 익은 그 리눅스의 콘솔 크기가 아니다.

너무 크다.

800x600으로 했는데도 크다.

 

결국 내 눈에 익숙한 리눅스 콘솔 해상도는 640x480이라는 걸 알았다. 허.

큼지막하니 보기 좋다

 

 

이 글이 도움이 되셨다면 아래 손꼬락을 꼬옥 눌러주세요. 큰 힘이 됩니다. 그리고 댓글도 남겨주시면 더더욱 크~ㄴ 힘이 됩니다. ^^;

'서버 > linux' 카테고리의 다른 글

[CentOS 6] 설치 후 콘솔 해상도 조정하기  (0) 2011/10/11
[CentOS 6] 처음 설치 후 IP 설정 안될 때  (0) 2011/10/11





  

CentOS 6를 WebServer로 설정 후, setup 해서 네트워크 IP를 분명 제대로 다 설정해 줬는데 이게 반영이 안되었다.

 

#/etc/init.d/network restart

 

를 해도 반영 안됨.

 

이럴 때 방법은 다음과 같다.

 

root로,

 

#vi /etc/sysconfig/network-scripts/ifcfg-eth0

 

해서 그 안에 정보들을 다 잘 적어주고,

 

ONBOOT=yes

 

가 설정되어 있는지 확인.

 

여기까지 하면

 

# reboot 해준다.

 

이제 부팅되면서 eth0을 물고 들어올 거다.

 

CentOS 속도 빨라졌네요.

 

 

이 글이 도움이 되셨다면 아래 손꼬락을 꼬옥 눌러주세요. 큰 힘이 됩니다. 그리고 댓글도 남겨주시면 더더욱 크~ㄴ 힘이 됩니다. ^^;

'서버 > linux' 카테고리의 다른 글

[CentOS 6] 설치 후 콘솔 해상도 조정하기  (0) 2011/10/11
[CentOS 6] 처음 설치 후 IP 설정 안될 때  (0) 2011/10/11





  
오랜만에 프로그래밍 관련 글을 쓰는군요. 

자바의 Object 나 iOS의 id에 대해 궁금해 하시는 분이 계셔서 글을 쓰게 되었습니다. ^^;

자바의 Object에 대해 먼저 설명하겠습니다.


Object는 클래스다.  

자바의 Object는 클래스입니다.

자바에는 무수히 많은 클래스가 있습니다. 거의 모든 걸 다 클래스로 만들어 놓았죠. 그래서 자바를 만든 제임스 고슬링의 별명이 "Every thing is classes" 라고 합니다. 이 말은 굳이 클래스로 만들지 않아도 될 것을 클래스로 다 만들어서 속도저하를 일으키고 있다는 걸 빗대고 있는 거라 생각되네요.

암튼. 자바에 무수히 많은 클래스가 있는데, 그 클래스들마다 공통으로, 반드시, 꼭 구현되어야  하는 기능들이 있습니다.

자동차를 예를 들어 보죠. 자동차는 반드시 가고, 서고, 방향 바꾸고. 이렇게 3가지 기능이 반드시 구현되어 있어야 합니다. 

자동차라는 게 종류도 많고 가격도 천차만별에 모양 색깔 기능.. 다 다른데, 반드시, 꼭 구현되어야  하는 기능들이 있습니다.
 




이런 식인거죠.

모든 자동차들은 가다, 서다, 방향기능을 꼭 가지고 있어야 합니다.

마찬가지로 자바의 클래스들도 꼭  가지고 있어야 하는 기능들이 있습니다.





그 클래스가 생성되고, 소멸되는 기능들, 그리고 그 클래스의 이름.. 기타 등등 모든 클래스들이 자바 클래스로서 갖추어야 할 기본 덕목들.. 아니 기본 기능들과 속성들이 있습니다.

이런 기능들을과 속성들을 학점 클래스 만들 때마다 구현해 주고, 학생 클래스 만들 때마다 다 구현해 줘야 할까요?
어떤 사람은 클래스의 이름을 위해 name 이라는 변수로 만들고, 어떤 사람은 _name, 어떤 사람은 Name, 어떤 사람은 m_classname.. 기타 등등.

사람마다 다 틀리게 만들어서 무지막지 혼란스러울 겁니다.

그래서 클래스 하나를 딱 정해놓고 기본적으로 필요한 기능과 속성들을 정리했죠.

그것이 바로 당신이 알고 싶어하는 바로 그 Object 클래스인 겁니다.


모든 자바 클래스는 Object 클래스를 상속받습니다. 

굳이 명시 안해도 이미 Object 클래스를 상속받았다고 간주됩니다.



Object는 최상위 클래스다. 그래서 대표성을 지닌다.
 


그런데, 이 Object 클래스에 한가지 더 재밌는게 있슴미다.

모든 클래스는 Object 클래스를 상속받는다고 했습니다.

그럼 여기에 이런 관계가 성립합니다.

학생 클래스는 Object 클래스다. (O)
Object 클래스는 학생 클래스다. (X)

잘 이해가 안되죠. 이 말은, 

한국사람은 사람이다. (O)
사람은 한국사람이다. (X)

이 관계와 같습니다.

[하위 클래스]는 [상위클래스]다. 는 성립하지만, 그 반대는 성립하지 않습니다.

만약 프로그래밍할 떄 저 반대가 성립하는 것처럼 프로그래밍하면(실제로 이렇게 하는 사람 있음. 형변화에 엄격하지 않은 Object Pascal에서 이렇게 하는게 가능함. ㅋ. 결과가 골때림. 그 자리에서 에러가 안나고 다른 자리에서 에러가 나기 떄문에 이거 일주일짜리 디버깅 꺼리임) 프로그램이 불규칙하게 죽는 현상이 발생할 수 있습니다. 

그래서 이게 가능합니다.

Object obj = 학생클래스 인스턴스;

반대는 성립하지 않습니다.  

이렇게 Object 클래스는 모든 클래스의 최상위 클래스로 대표성을 가지기 떄문에

Object 클래스의 인스턴스는 모든 클래스의 인스턴스를 받을 수 있습니다. 

Object obj = 학생클래스 인스턴스; (O)
Object obj = 교수클래스 인스턴스; (O)
Object obj = 학점클래스 인스턴스; (O)



그럼 iOS의  id는?

iOS의 id는 약간 개념이 다릅니다. 클래스가 아닌거죠.

그냥 변수입니다. 

C를 하셨던 분들은 다 아실만한 void * 인 겁니다.

그냥 포인터를 받는 변수입니다. 좀 길게 말하면 클래스 인스턴스의 주소를 저장하는 변수인거죠.

이 글이 마음에 드시면 아래 손꼬락을 꼬옥 눌러주세요. ^^





iBatis 삽질의 추억

프로그래밍/자바 2011/05/27 21:14 Posted by 팬소년

  

아. iBatis.

오늘 transaction을 명시적으로 적용한 (SqlMapClient.startTransaction() ) 함수를 하나 맹글었는데, 사실 그동안 iBatis에서 transaction을 쓸 일이 별로 없었다규.

이거이 쓰고 나면 딱 커넥션풀 갯수만큼만 잘 되고 그 다음부터는 커넥션풀을 얻어오지 못했다는 타임아웃 에러가 나고 먹통이 되어버린다.

밥먹고 와서 삽질한 결과, 드뎌 알아냈다. iBatis에서 startTransaction을 했거든 commitTransaction만 하지 말고 꼭 endTransaction도 하라는 것.

이런 형태면 된다.

 

try

{

SqlMapClient.startTransaction();

 

.....

 

SqlMapClient.commitTransaction();

}

catch (SQLException ex)

{

.....

}

finally

{

SqlMapClient.endTransaction();

}

 

이거였다. commitTransaction() 만 하면 Connection pool에 반납하지 않고 그냥 죽어버린다. 디져쓰.

꼭 endTransaction()도 해 주자.






  

리눅스에서는 /etc/rc.local에 등록하면 끝이었지만, AIX는 약간 다르다. 지금 내가 쓰고 있는 AIX의 버전은 6.1이다.

/etc/inittab

하면 주석을 제외한 맨 첫줄에 (주석은 : 으로 시작한다.)

init:2:initdefault:

라고 되어 있는 걸 확인할 수 있다. 가운데 숫자가 2로 되어 있는 걸 확인하자. 숫자가 2로 되어 있으면 rc2.d 디렉토리 안에 원하는 스크립트를 넣으면 된다.

cd /etc/rc.d/rc2.d

이 디렉토리로 이동하면 여러 스크립트들이 보이는데, 여기에 내가 원하는 스크립트를 넣으면 된다.

다만 스크립트 명을 지정해 줄 때 몇몇 규칙이 있다.

시작은 반드시 대문자 S로 시작해야 한다.

S 다음에 숫자를 넣어야 하는데, 이 숫자의 순서대로 스크립트가 실행된다. 그러니까 S1test 라는 스크립트와 S2test라는 스크립트가 있으면, S1test 라는 스크립트가 실행되고 다음에 S2test라는 스크립트가 실행된다.

그리고 스크립트니까 755 권한을 주고, 스크립트를 실행할 때는 root의 환경변수를 읽어서 사용하지 않기 떄문에 $APPPATH/bin/app.sh 이런 식의 스크립트는 쓰면 안된다. 꼭 $APPPATH 라는 변수대신 그 변수의 실제 값을 넣어줘야 한다.






  

우리 집은 애니게이트 공유기 RG 3500을 사용하고 있다.
한 3년 정도 사용한 것 같은데, 여태 아무문제없이 잘 사용하고 있다가, 올해 여름 드디어 일이 터졌다.
날이 푹푹 찌니 공유기가 자꾸 다운되는 현상이 발생한 것이다.
이럴 때 공유기를 만져보면 굉장히 뜨겁다.
그래서 10분 이상 꺼서 식혀줬다가 다시 켜고 하는 식으로 인터넷을 사용했다.
그래도 날이 정말 더운 날은 하루에도 10번은 껐다 켜야 하는 현상이 발생했다.

그런데 이 애니게이트 공유기 RG 3500이 발열에 문제가 많다.
찾아보니 나와 같은 문제를 호소하는 사람들이 많았다.

그래서 일단 커버를 열어보았다.
아무리 봐도 환풍을 위한 장치가 너무 작아 발생한 문제인 듯 싶어서다.

날이 점점 선선해져서인지 커버를 열어놓는 것만으로도 더 이상 애니게이트 공유기 RG 3500가 다운되는 현상은 발생하지 않았다. 그래도 역시 안심이 안되는지라 메인 칩셋의 방열판을 바꾸기로 했다.



빨간 화살표로 표시한 부분이 애니게이트 공유기 RG 3500 방열판이다.
저 부분을 잘만 방열판으로 바꿀꺼다.

제일 중요한 문제는 칩셋을 다치게 하지 않고 방열판을 떼어내는 것인데,
방법은 오랫동안 사용해서 저 칩셋을 뜨겁게 만든 상태에서 전원끄고 바로 떼어내는 것이다.

이때 롱노즈나 뺀찌같은 것을 이용해서 딱 잡고 비틀어서 떼어내는 게 핵심이다.
만약 여기서 실패해서 칩셋이 망가지거나 했다면 그냥 새로 나온 공유기로 사자. (..는 게 칩셋을 떼어내기 전 나의 생각이었다. 어차피 방열판을 바꾸지 못해서 지금처럼 자꾸 다운되면 쓰지 못한다.)


SONY | DSLR-A550 | Aperture priority | Pattern | 1/50sec | F/2.0 | 0.00 EV | 30.0mm | ISO-400 | Off Compulsory


방열판의 칩셋을 떼어낸 모습이다.
지저분하게 남아있는 구리스 본드를 최대한 제거한다.


SONY | DSLR-A550 | Aperture priority | Pattern | 1/200sec | F/2.0 | 0.00 EV | 30.0mm | ISO-400 | Off Compulsory


이것이 잘만 방열판이다. 용산에서 8,000원 사왔다.
인터넷에선 5,800원이던데.

사진은 안 찍었는데, 구리스 본드(1,500원)를 바르고 방열판을 올려 단단히 고정시킨다.
구리스 본드를 바를 때 주의할 점은 최대한 얇게, 넓게, 일정하게 펴 발라야 한다는 것이다.
그래서 나는 구리스를 바를 때는 항상 명함을 이용한다.
명함으로 쓱쓱 문질러서 최대한 얇게, 넓게, 일정하게 펴 바른다.


SONY | DSLR-A550 | Aperture priority | Pattern | 1/40sec | F/2.0 | 0.00 EV | 30.0mm | ISO-400 | Off Compulsory


드디어 잘만 방열판을 붙였다.
내년 여름이 되어봐야 알겠지만, 오늘 파일 다운로드받으면서, 동시에 인터넷하는데 아무 문제 없다.
예전에는 파일만 다운로드 받아도 바로 지가 다운되어 버렸었는데.

이제 먼지가 들어가는 걸 막기 위해 커버를 씌울 방법을 찾아봐야겠다.
아마 대충 덮고 방열판이 바깥으로 돌출되어 있는 그런 형태가 되지 않을까 싶다.





그간 개발한 스마트폰용 어플들.

프로그래밍 2010/08/25 14:24 Posted by 팬소년

  
안드로이드를 산지도 벌써 한달 가까이 되어 가네요.
안드로이드가 스마트폰용 OS로는 참 괜찮은 것 같아요.

그간 만든 안드로이드폰용 어플들을 정리해 봤습니다.
혼자 쓸려고 만든거라 UI는 좀 후집니다.

1. panSchedule.

일정관리 프로그램입니다. 음력을 지원하면서 위젯이 되는 게 없길래 제가 걍 만들었습니다.
나름 꽤 쓸모있습니다. 음력 기념일과 음력 국경일을 모두 볼 수 있어서 제사일같은 걸 놓치지 않게 해줍니다.






입력/편집 화면




그리고 이렇게 일정을 음성 인식으로 입력할 수 있게 해서 사용의 편의성을 높였습니다. 이거 무쟈게 편합니다.


2. panGPSLogger

이건 (거의) 1초마다 한번씩 현재 GPS 좌표를 기록해 주는 프로그램입니다.
딱 이런 기능만 있는 제품이 소니에서 판매중인데, 가격이 10만원대입니다.
꼭 사고 싶었는데, 생각해 보니 만들면 되겠다 싶어 안드로이드폰 사자마자 바로 만들기 시작해서 그날 밤에 기본 기능을 완성했던 프로그램입니다.

나중에 사진의 촬영시각이랑 매핑해서 사진을 찍은 위치가 어디인지를 보여주도록 할 생각입니다.




3. 주차 SMS

저는 차가 없어서 (아직도) 부모님차를 빌려 타고 다닙니다.

그런데 상황에 따라 차를 저희 집 앞에 주차해 놓을 때도 있고, 부모님집 앞에 주차해 놓을 때도 있고.. 그래서 차를 빌려 타고 주차할 때마다 부모님께 전화 연락을 드립니다. 이게 참 어려운 일입니다. 혹시 연락을 못드리기라도 하면 새벽에 전화가 오기도 합니다. "차 어디있어~"

그래서 만들었습니다. 주로 주차하는 곳이 4군데 정도인데, 주차해 놓고 각 위치에 해당하는 버튼을 누르면 아버지한테 문자메시지가 날아갑니다. "아버지, 차는 어디어디에 있어요~" 이렇게요. 아 세상이 점점 편해집니다.




4. panZzik

이건 찍찍이라고 불리는 어학용 플레이어입니다.
화면을 보면 "5초 앞으로"라는 버튼이 굉장히 크게, 전체 면적이 반이 넘게 자리잡고 있는데, 이 기능이 핵심입니다.
영어 테이프 MP3를 듣다가 잘 못 들은 부분이 있으면 저 완전 큰 "5초 앞으로" 버튼을 누르면 5초 앞으로 이동해서 들을 수 있게 해줍니다. 그리고 종료했다가 다시 켜면 먼저 번에 들었던 부분부터 자동으로 재생되서 참 편합니다.




5. 한줄 일기장

회사 경력관리 프로그램과 연동되는 한줄 일기장입니다.
역시 음성 인식 기능을 지원해서 쉽게 하루의 일과나 소소한 일정을 기록할 수 있게 했습니다.






  
자바에서는 이렇게 한다.

        ArrayList<String> arCapacity = new ArrayList<String>();
       
        String[] arResult = strCapacity.trim().split(",");
       
        // 검색어를 목록에 담는다.
        for (int i = 0; i < arResult.length; i++)       
            arCapacity.add(arResult[i]);
       
        List<MemberCapacityItemVO> list;
       
        try
        {           
            list = m_client.queryForList("searchMemberCapacity", arCapacity);
        }
        catch(SQLException ex)
        {
            ex.printStackTrace();
            return "";
        }

이걸 iBatis XML에서는
<select id="search" parameterClass="java.util.List" resultClass="ItemVO">
        select
            member.EMP_NO
        from
            member
        where
            and member.CODE in
            <iterate open="(" conjunction="," close=")">
                #arCapacity[]#
            </iterate>
    </select>

이걸로 끝이다. 와 실로 놀랍지 않은가.




HumanChecker를 만들다.

프로그래밍 2010/07/08 20:39 Posted by 팬소년

  
이름이 이게 맞는지 모르겠는데, 회원가입하거나 할 때 로봇이 가입하는건 아닌지 확인하기 위해 문자나 숫자를 써 놓고 로봇이면 썩 물러가고 사람이면 입력해봐! 하는 체커가 있다. 오늘 그거 맹글었다.


팀장님 홈페이지는 아무나 글을 쓸 수 있는 구조인데, 자꾸 누가 비아그라 사라고 스팸글을 올려서(10분 간격으로 올라오는 걸 보면 분명 로봇이다.) 팀장님이 계속 지우시다가 짜증나서 함 만들어 보라고 하신거다.

꽤 간단하게, 금방 만들었다. 하긴 뭐 하는 게 없다.

이 플래시는 외부(자바스크립트)와 연동하기 위한 딱 하나의 함수를 가지고 있다.

int getResult() 함수가 그것.

만약 제시된 문자와 사용자 입력이 같으면 1을 리턴하고, 그렇지 않으면 0을 리턴한다. ㅋ. 초간단.
예를 들면 다음과 같이 쓸 수 있다. (실제 사용 예)
// 사람이 직접 입력하는 글인지 여부 체크
var nResult = document.fwrite.HumanChecker.getResult();
if (1 == nResult)
{
    document.fwrite.isHuman.value = "PANBOY IS SO COOL";
}
else
{
    alert("이미지의 글자를 정확히 입력해 주세요");        
    return false;
}   

저 플래시를 화면에 표시할 때는 아래와 같이 했다.

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="HumanChecker" width="100%" height="120"
                 codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
                 <param name="movie" value="HumanChecker.swf" />
                 <param name="quality" value="high" />
                 <param name="bgcolor" value="#869ca7" />
                 <param name="allowScriptAccess" value="sameDomain" />
                 <embed src="HumanChecker.swf" quality="high" bgcolor="#869ca7"
                  width="100%" height="120" name="HumanChecker" align="middle"
                  play="true"
                  loop="false"
                  quality="high"
                  allowScriptAccess="sameDomain"
                  type="application/x-shockwave-flash"
                  pluginspage="http://www.adobe.com/go/getflashplayer">
                 </embed>
               </object>

30분이 넘었는데도 더 이상 스팸글이 안올라오는 걸 보면 이제 문제가 해결된 것 같다.

다운로드 :





  
아 쉬울 줄 알았는데, 열라 어렵다. 웹에도 한큐에 딱 설명해 놓은 게 없어서 1시간 넘게 삽질했다.
1521이 nCube License Manager라는 놈이랑 포트가 겹친다. 자꾸 리스너가 죽어서 포트를 바꾸기로 했다. 포트가 겹치는 게 원인인지는 좀 더 있어보면 알겠지.

우리는 50001번으로 바꾸기로 했다. 아 이거 내가 자바로 서버만들 때 자주 쓰는 포트번혼데. ㅋ

1. 리스너를 죽인다. lsnrctl stop

2. 리스너를 수정해서 listener.ora
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /home/oracle/oracle/product/10.2.0/db_2)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = oracle)
      (ORACLE_HOME = /home/oracle/oracle/product/10.2.0/db_2)
      (GLOBAL_DBNAME=test)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
     # (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.21.36)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.5.100)(PORT = 50001))
    )
  )


새로 추가한 부분을 빨간 색으로 bold 처리했다.
수정한 게 아니라 새로 추가한 부분이다.
보니까 기본 포트를 사용하는 게 아니라면 저렇게 SID_DESC에도 추가해 줘야 한단다.

여기까지 해놓고 아무리 다시 리스너를 시작해봐도 답이 없다. 이 뒤가 정말 중요하다.

3. system으로 작업.
/ as sysdba로 sqlplus 실행해서 아래의 작업을 실행

SQL> alter system set local_listener = "(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.5.100)(PORT = 50001))";
System altered.

SQL> alter system register;
System altered.

여기까지 해놓고 lsnrctl status 해서 확인해 보면 확실히 다른 내용의 상태 결과도가 보인다.

50001 포트 열어놓는 것도 잊지 말자.




토드에서 실행계획 확인하는 방법

프로그래밍 2010/04/13 17:28 Posted by 팬소년

  
view / toad Option / Oracle / General에 가서
plan 테이블 명을 적어주고(default 값이 있다)

검색할 쿼리를 적어주고 ctrl + E를 하면 plan 이 나온다.





  
이번 도요타 사태는 품질의 대명사로 불리던 세계 1위 기업이 작은 부품 하나 때문에 한순간에 휘청거리게 된 사건으로 시사하는 바가 크다. 이 난국을 지켜보는 우리 기업에서 배운 것은 다음 3가지로 크게 요약해 볼 수 있다.

1. 품질관리의 중요성
2. 경영개선과 안전 문제에 대한 인식 강화
3. 모기업과 협력사간 기술개발지원, 기술협력 등으로 상생관계를 더욱 돈독히 해야할 필요성 느낌.




JBOSS 5 + maven에서 MSSQL 연동하기

프로그래밍 2010/03/15 19:30 Posted by 팬소년

  
아.. 이거이 또한 삽질의 연속이었다.
도대체 JBOSS5 에서 MSSQL 연동하는 사람이 내가 처음인거냐?

여튼.
pom.xml에 다음과 같이 dependency를 추가해 준다.

<dependency>
    <groupId>com.microsoft.sqlserver.jdbc</groupId>
    <artifactId>sqljdbc</artifactId>
    <version>2.0</version>
</dependency>

잘 아는 것처럼 이것도 또한 라이센스 문제로 자동으로 maven이 다운로드해 주지 않는다.

sqljdbc.jar와 sqljdbc4.jar 파일을 다운로드해서 특정 폴더에 저장해 놓는다.
둘의 차이는 알아서 찾아보시길. 또 다운로드 받을 수 있는 곳도 알아서 찾아보시길. 파일명까지 알려줬으니 금방 찾을거다.

내 경우 /home/rnd/repo 라는 디렉토리 밑에 넣어주었다.

저렇게만 해주고 mvn package를 하면 당연히 에러가 난다.
maven에게 저 sqljdbc가 어디에 있는지를 알려줘야 한다.
내 경우에는 sqljdbc.jar 파일만 썼다. (java 1.5)

mvn install:install-file -DgroupId=com.microsoft.sqlserver.jdbc -DartifactId=sqljdbc -Dversion=2.0 -Dpackaging=jar -Dfile=/home/rnd/repo/sqljdbc.jar


이렇게 해주면 maven이 설치를 한다. 훌륭한 maven. 잘했어!

이걸로 끝이다.

이제부터는 jboss 내에서 mssql과 연동 잘 된다.





  

http://eclipse-tools.sourceforge.net/quickmarks/

여기로 가면 된다.
다운로드 화면으로 가면 처음엔 다른 걸 다운로드받도록 되어 있으니 밑으로 스크롤해서 quickmarks를 찾아 다운로드받아야 한다. plugin 폴더에 넣으면 된다.

ctrl+shift 1-9로 지정하고,
ctrl이 아닌 alt 1-9로 이동한다.

그래도 이게 어디.








IBM AIX 타임 서버랑 싱크맞추는 법

프로그래밍 2010/03/09 22:12 Posted by 팬소년

  
root 권한으로

setclock time.bora.net

한참 찾았네. 뭘해도 자료 찾기 힘든 AIX.





  
이거이 안된다. 팀장님이 TTcpClient.sendln(String)과 TTcpServer의 receiveln(String) 을 이용해서 간단하게 통신하는 소스를 가져와서 보여주셨는데, 이거이 문자열이 깨진다.

만약 11을 보내면 서버에서 잘 받아지는데,
1111을 보내면 11만 제대로 오고 나머지는 쓰레기값이다.

그래서 String을 byte로 변환해서 byte로 보내려고 했는데, 
이거이 String이 이상하게 값을 관리하고 있다.

만약 abcd 를 저장하고 있는 String 변수를 byte 배열로 변환해서 보면 

97 0 98 0 99 0 100 0

이렇게 되어 있다. 오잉. 가운데 0은 모지. 
하도 오랜만에 델파이를 만지니 원래 저랬나 싶기도 하고. 
한국어로 쓰겠다고 하면 String이 원래 2바이트로 저장하나 싶기도 하고. 여튼 그렇다. 

질문 1. 델파이에서 메모리 보는 거 원래 없었어? 왜 안보이지? 이게 없는데 내가 어떻게 델파이로 프로그램을 만들고 놀았을까..

그래서 AnsiString에 옮겨 담았다.

ansiStr := AnsiString(msg);

AnsiString에만 옮겨담아도 

97 98 99 100 

으로 잘 나온다. 

문자열을 byte 배열로 옮겨담은 과정은 다음과 같다.
    
 // byte 배열로 변환
      for I := 0 to 255 do
        arBytes[I] := 0;

      ansiStr := AnsiString(msg);

      nLength := length(ansiStr);
      move(ansiStr[1], arBytes[0], nLength);

      TcpClient1.SendBuf(arBytes, nLength);


그리고 서버에서는 OnAccept에서 이렇게 받아 처리했다.

var
    s: AnsiString;
    buffer: array [0..255] of byte;
  I: Integer;
begin
    LabeledEdit2.Text:=ClientSocket.RemoteHost;

    for I := 0 to 255 do
      buffer[I] := 0;

    ClientSocket.ReceiveBuf(buffer, 256);

    setLength(s, 256);
    move(buffer[0], s[1], 256);
    ListBox1.Items.Add(s);

setLength 함수도 웃기다. 저렇게 하고 나면 s에 쓰레기값이 잔뜩 채워진다. 아 이거 주소 바뀌었는지도 확인 안해봤네. 주소 바뀌고 쓰레기값으로 채워지면 할말 없고. (설마.. ㅎㅎ)

여튼 저렇게 했더니 이제 한글도 잘 된다. 한글 안되면 UTF-8로 변환하려고 했는데. 
아 간만에 델파이 썼더니.. 거참.. 왜 메모리 보는 게 없을까. 있을꺼야. 있을껴. 있어야만해.




IBM AIX 6에 Oracle 10g client 설치하기

프로그래밍 2010/02/23 16:36 Posted by 팬소년

  
아 반나절을 이거 하나때문에 다 보내버렸네요.
아 진짜 왕짜증.

AIX 6에 Oracle 10g client를 설치하는 건 다운로드받은 파일을 압축푸는 것부터 쉽지 않았슴미다.
다운로드받은 오라클 사이트에 설명되어 있는대로 압축을 풀려고 하면 이런 에러가 납니다.

panboy:/usr/local/oracleClient>gunzip 10gr2_aix5l64_client.cpio.gz

gunzip: 10gr2_aix5l64_client.cpio: File too large

아 어쩌라는 건지.. 
혹시나 해서 버전을 확인해 보니,

panboy:/usr/local/oracleClient>gzip -V
gzip 1.2.4 (18 Aug 93)
Compilation options:
DIRENT UTIME STDC_HEADERS HAVE_UNISTD_H

93년도 버전... 장난쳐? gzip.org에 가봐도 AIX용 링크는 죄다 끊어져 있고..

그래서 더 찾아보다가 아래의 방법을 알게되었슴미다.

panboy:/usr/local/oracleClient>gunzip < 10gr2_aix5l64_client.cpio.gz  > 10gr2_aix5l64_client.cpio

이거이 압축풀리는 듯 하다가 딱 멈춤미다. 역시 반응은 파일이 너무 크다고.
한가지 차이점은 이렇게 해 놓으면 어쨋든 압축풀린 10gr2_aix5l64_client.cpio 파일이 만들어지기는 한다는 거.

panboy:/usr/local/oracleClient>gunzip < 10gr2_aix5l64_client.cpio.gz  > 10gr2_aix5l64_client.cpio

gunzip: stdout: File too large

10gr2_aix5l64_client.cpio 파일의 크기는 정확히 1073741312 임미다.

그래서 안되겠다 싶어 윈도우에서 10gr2_aix5l64_client.cpio.gz  파일의 압축을 풀어 10gr2_aix5l64_client.cpio 파일을 ftp로 올렸는데, 올라가다가 멈춤미다. 끝에 몇 바이트 안 남겨놓고. 아 놔. 모하자는 건지.

앗! 그런데 ftp로 올라가다가 멈춘 파일의 크기가 1073741312 byte 임미다.

응? 둘다 1073741312 잖아? 몬가 있군. 싶어서 이 값을 512(block size니까) 로 나누니까 2097151 라는 값이 나옵니다. 그러니까 저 1073741312 는 block size인 512의 배수였던 겁니다. 이거이 몬가 있군 싶어서 gooooooooogle에 1073741312 을 넣고 검색해 봤습니다.

http://www-01.ibm.com/support/docview.wss?uid=swg21041563

Resolving the problem

Any UNIX OS sees AFS volumes as individual files. Looking at specific OS kernel parameters, we found that the fsize parameter in the /etc/security/limits file on the receiving fileserver was set at 2097151 blocks. These blocks were set at 512 bytes each. Performing the math we found that 2097151 x 512 = 1073741312, or the exact byte size at which the volume moves would fail. A reset of the fsize parameter in the /etc/security/limits file to a value of "-1" (essentially "unlimited") and a reboot is necessary to resolve this. 

이렇게 나옵니다.

아 지금 재부팅하고 있습니다.

이 밑에 속았네 어쩌고 소리 없으면 리부팅하고 제대로 된겁니다. 그래도 거참. IBM 사이트에서 유닉스한테 리부팅을 하라니. 장난쳐. 아 제발 리부팅 잘 되길.. 안되면.. 거까지 뛰갔다 와야되는뎅.


ps. 리부팅하고 나니 그냥

cdpws:/usr/local/oracleClient>gunzip 10gr2_aix5l64_client.cpio.gz


이렇게만 해도 압축 잘 풀리네요. -.-;




jboss soap wsdl 주소 변경하는 방법

프로그래밍 2010/02/22 11:16 Posted by 팬소년

  
# $JBOSS_HOME/server/default/deployers/jbossws.deployer/META-INF>vi jboss-beans.xml

여기서 

<property name="webServiceHost">${jboss.bind.address}</property>

부분을 

<property name="webServiceHost">${webservice.binding.address}</property>

이렇게 바꾼 다음, 

시작할 때, 

$JBOSS_HOME/bin/run.sh -b 10.1.x.x -Djboss.server.log.threshold=INFO -Dwebservice.binding.address=192.168.10.1

이렇게 시작하면 된다.

아 한큐에 모든 게 다 해결되어 넘 기쁘다!

참고자료: http://cafe.naver.com/jbossug/1842




TAG JBoss, SOAP, WSDL

  
드디어 성공.
웹서버와 웹서비스 서버를 물리적으로 완전히 분리했다.

웹서비스 서버는 JBoss 5 Community Edition을 사용했다. (AIX 6.1)
Web서버는 Windows Server 2008. -.-; 머신이 싸길래.

웹서버와 웹서비스 서버는 완전히 분리되어 있다.

웹서버는 80번 포트를 오픈하고 아파치 서버를 올려 바깥에 내놨고(공인IP),
웹서비스 서버는 tomcat connector를 위한 포트만 오픈하고 죄다 닫아버렸다. 그리고 이 서버는 내부에 있다.(사설 IP)

나의 목표는 웹서비스를 포함한 모든 요청을 전부 웹서버가 받아서 웹서버가 처리할 건 지가 알아서 처리하고, 웹서비스 서버가 처리할 건 웹서비스 서버가 처리하도록 하는 거였다.

방법은 비교적 간단하고 세팅도 그리 어렵지 않다.

1. jk_mod를 다운로드 받아 $APACHE/modules에 복사
2. 약간의 환경세팅

위 과정은 인터넷 뒤져보면 잘 나와있고, 아파치 홈페이지에도 설명되어 있으니 생략.

다 잘 되었다고 생각했었는데, 맨 끝에 문제가 발생했다. 
wsdl에 접속 location이 명시되어 있는데, 이게 기본적으로 서버 자체의 ip를 물고 들어가게 된다.

그러니까, 

현재 상황은 이렇다.

웹서버가 http://www.hello.co.kr 이고,
웹서비스 요청은 http://10.1.1.5:8080/helloWS 으로 받고 있다. 

이 상황에서, 

웹서버가 웹서비스 요청을 포함한 모든 요청을 받도록 하기 위해,

웹서버에게 http://www.hello.co.kr/helloWS 로 요청을 보내면 이 요청이 방화벽 안의 웹서비스에게로 날아가서 그놈이 처리하도록 되어 있는 거다.

다 잘되었는데, wsdl의 맨 끝에 

<<service name="helloWS">
-   <port binding="tns:HelloEndpointInterfaceBinding" name="HelloEndpointInterfacePort">
        <soap:address location="http://10.1.1.5:8080/helloWS" />
  </port>
</service>

이렇게 되어 있어서 결국 아무런 처리도 안되고 있었다.

왜냐, 외부에서는 10.1.1.5 서버에 연결할 수 없기 때문에. (방화벽 정책 자체를 그렇게 설정해 놨으니까)

그런데 이 문제 비교적 쉽게 해결했다.

JBoss 서버를 띄어놓은 상태에서 mvn install 에 성공하면 JBoss가 기록하는 로그에 (debug 모드) wsdl을 어디에 publish했다는 기록이 남는다.

이런 식이다.

19:33:18,234 INFO  [WSDLFilePublisher] WSDL published to: file:/usr/local/jboss/jboss-5.1.0.GA/server/default/data/wsdl/helloWS-1.0.war/HELLOWS4208386379691609677.wsdl

그럼 그냥 단순히 저 파일을 열어서 맨 끝에 address location만 바꿔주면 된다.

<service name="helloWS">
-   <port binding="tns:HelloEndpointInterfaceBinding" name="HelloEndpointInterfacePort">
        <soap:address location="http://www.hello.cl.kr/helloWS" />
  </port>
</service>

이렇게 바꿔줬다. 아주 잘되고 있다.

자. 이게 한가지 꼭 짚고 넘어가야 할 것이 있다.
아마도 몇몇 설정만 바꾸면 wsdl이 항상 내가 원하는대로 나오게 할 수 있을 거다. 어디를 바꿔야 할지 아는 분 꼭 알려주시기 바랍니다.




TAG JBoss, WSDL

  

customsize > units setup > system unit setup
1Unit -> Milimeters.

unit Setup 창에서 Display Unit Scale > Metic -> Millimeters.




TAG 3d, 3DMAX, MAX

oracle MD5 암호화

프로그래밍 2009/10/23 11:43 Posted by 팬소년

  

Oracle 9i부터 다양한 Encryption 표준 알고리듬들을 지원하는

  DBMS_OBFUSCATION_TOOLKIT

 이라는 패키지를 제공하고 있습니다.


MD5는 물론이고, DES, AES등 많이 쓰이는 표준 Encyption을 지원합니다.

MD5라면

  DBMS_OBFUSCATION_TOOLKIT.MD5(input, checksum);

Procedure를 이용하시면 됩니다.

자세한 사항은

   Data Encryption Using DBMS_OBFUSCATION_TOOLKIT

를 참조하세요.

 

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

DBMS_OBFUSCATION_TOOLKIT.MD5의 사용예는 다음과 같습니다.

 

DECLARE

  PLAIN_PASSWORD       VARCHAR2(20) := 'SAMLPLE';

  SECURE_PASSWORD   VARCHAR2(32);

BEGIN

  SECURE_PASSWORD  := DBMS_OBFUSCATION_TOOLKIT.MD5(input_string=> PLAIN_PASSWORD);

END;

 

PL/SQL이나 Stored Procedure/Function에서는 위와 같이 사용하시면 됩니다.

여기서 주의하실점은, DBMS_OBFUSCATION_TOOLKIT에 MD5함수 정의가

overload되어있어서(RAW입력과 VARCHAR2입력에 대한 함수 2개가 정의) 그냥

 

  SECURE_PASSWORD  := DBMS_OBFUSCATION_TOOLKIT.MD5(PLAIN_PASSWORD);

 

이렇게 호출하면 오류가 난다는 겁니다. 반드시 parameter명 (VARCHAR2입력의 경우input_string)을 명시해야 원하는 함수를 호출할 수 있습니다.


출처 : 네이버 지식인. http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10110&docid=1225492&qb=b3JhY2xlIGNoZWNrc3Vt&enc=utf8&section=kin&rank=1&sort=0&spq=0&pid=fXZUQv331y8ssv5U5bRssv--138580&sid=SuEWOpDk4EoAAGtxdZI




오라클 특정 컬럼 암호화 하기

프로그래밍 2009/10/23 10:47 Posted by 팬소년

  
 

--암호화 함수

CREATE OR REPLACE FUNCTION f_Encrypt (p_Input_str  in varchar2) RETURN VARCHAR2
AS
 v_Input_len number := ROUND(LENGTH(p_Input_str)/8+0.5)*8;
 v_Encrypted_str varchar2(2000) := null;
 v_Key varchar2(16) := 'abcdefgh12345678';
BEGIN
   DBMS_OBFUSCATION_TOOLKIT.DESENcrypt(input_string => RPAD(p_Input_str,
                                       v_Input_len),
                                       key_string => v_Key,
                                       encrypted_string =>v_Encrypted_str);

   RETURN v_Encrypted_str;
END;
/

-- 복호화 함수
CREATE OR REPLACE FUNCTION f_Decrypt (p_Encrypted_str in varchar2) RETURN VARCHAR2
AS
 v_Key varchar2(16) := 'abcdefgh12345678';
 v_Decrypted_str varchar2(2000);
BEGIN
   DBMS_OBFUSCATION_TOOLKIT.DESDecrypt(input_string => p_Encrypted_str, 
                                     key_string => v_Key,
                                     decrypted_string => v_Decrypted_str);

   RETURN trim(v_Decrypted_str);
END;
/

 
 
CREATE TABLE ENC_TEST (ID VARCHAR2(30), PWD VARCHAR2(30));

-- 암호화 입력
INSERT INTO ENC_TEST (ID, PWD) VALUES ('AAA', f_Encrypt('11223344AABB'));
INSERT INTO ENC_TEST (ID, PWD) VALUES ('BBB', f_Encrypt('QWER1232'));
COMMIT;

SELECT * FROM ENC_TEST;

ID                             PWD
------------------------------ ------------------------------
AAA                            쮎틃6X奚~?@
BBB                            돐?&戱MY疥[


-- 복호화
SELECT ID, f_Decrypt(PWD) FROM ENC_TEST;

ID                             PWD
------------------------------ ------------------------------
AAA                            11223344AABB
BBB                            QWER1232


* 출처 : http://database.sarang.net






  


Flex CS3. 이런 에러가 떴다.
그것도 시연하기 바로 직전에 이 에러가 나와서 전혀 시연을 할 수 없는 상태가 되어 버렸다. 완전 처음보는 에러여서 바로 해결할 수도 없었다.

하필 오늘 시연 시간이 2시간이나 당겨진데다,
아침엔 1시간이면 끝낼 작업을 오전 내내 붙잡고 시간을 끌어서 마음이 조급했다.
그래서 시연 준비도 제대로 못하고 있었는데, 이런 처음 보는 에러까지 나와버리니 참.. 덕분에 시연에 참가한 사람들은 다들 X씹은 표정이 되어 돌아갔다. 마음이 무겁다.


반쪽짜리 시연이 끝났다.
도대체 저 에러가 뭔지 찾아야 했다.

크게 3개의 모듈을 쓰고 있는데 그중 2개의 모듈만 들어가면 런타임에 저런 에러가 나면서 프로그램이 멈춰버렸다.

그나마 다행이었다. 실험군과 대조군이 완벽히 갖춰진 셈이니.
하나하나 비교하다가 드디어 찾아낸 문제점.

문제가 발생하는 2개의 모듈에는