이동함..

카테고리 없음 2018. 6. 20. 15:22

티스토리에 딱히 불만이 있는 건 아닌데..

티스토리 -> 브런치 -> blogspot으로 넘어갔습니다.


이유가 딱히 있는 건 아니고..


그냥 daum계정을 잘 안쓰다보니.. 왠지 데이터를 여기에 남기기보단 자주 쓰는 id에 남기는 것이 나을 것 같았습니다.


새로운 블로그는 https://5dolstory.blogspot.com 입니다. 


그럼 안녕~


뿅!

Posted by 서오석
,

올만에 다시 iOS 심볼리케이션 이야기..


티스토리로 글쓰면 별로 안이뻐서 대충 써도 이뻐지는 블로그를 찾다가 실패..


직접 올리기도 귀찮고..-0-;;


일단 우분투에서 ios symbolication을 하는 건 osx처럼 간단하지는 않다. 


냐하면 심볼리케이션을 할 때 cpu의 archi type을 확인하는데 이게 osx에서는 lipo라는 명령어로 확인하고 거기에 맞는 arch type으로 심볼리케이션을 한다.


근데 lipo는 linux용이 없기 때문에 다른 걸로 archi type을 찾아야 한다.. (일단 이 부분은 현재 나도 못찾았다.. 전공이 C 디버그가 아니라서..;;)


그래서 app crash 정보 중 cpu architecture가 정확하다고 판단(실제 완전 정확하진 않음..)하고 적용해야 한다.


우분투에서 심볼리케이션을 할라면 atos를 대체 할 atosl이 필요하다.


atosl : https://github.com/facebook/atosl 


페북에서 만든 것이고 내부적으로 dwarf를 이용해서 심볼리케이션을 해준다. 


atosl 설치는 우분투에서 하면 쉽다.


일단 우분투에 dwarf 라이브러리를 깔자.


apt-get install libdwarf-dev binutils-dev



그리고 atols을 다운받자


압축을 풀고 atols 폴더로 간 다음 


config.mk.local을 만들어야 한다


cat > config.mk.local
LDFLAGS += -L/usr/lib/
LDFLAGS += -L/usr/share/lintian/overrides
LDFLAGS += -L/usr/share/lintian/overrides/binutils 

ctrl-z


이걸 만들어주고 이제 설치를 하자


make  
make install



root에서 install해줘야 한다.


인스톨이 완료되었다면 


atols --help 이렇게 쳐보자.


/atosl --help

atosl 1.1

Usage: atosl -o|--dsym <FILENAME> [OPTIONS]... <ADDRESS>...


  -o, --dsym=FILE file to find symbols in

  -v, --verbose enable verbose (debug) messages

  -l, --load_address=ADDRESS specify application load address

  -A, --arch=ARCH specify architecture

  -g, --globals lookup symbols using global section

  -c, --no-cache don't cache debugging information

  -V, --version get current version

  -h, --help this help


위처럼 나오면 잘 설치된거다.


이제 심볼리케이션을 한번 해보자

atosl --arch armv7 -o SampleApp.app.dSYM/Contents/Resources/DWARF/SampleApp --load-address 0x6a000 0x0037096a 0x00370a16 0x0036b6b6 0x0036b4d2 0x00369f3c 0x00366bc4 0x0035036c 0x00070bb8


-[MSLCoreDataManager createTable:datastore:] (in SampleApp) (MSLCoreDataManager.m:531)

-[MSLCoreDataManager getTable:datastore:] (in SampleApp) (MSLCoreDataManager.m:545)

__37-[MSLSyncManager datastore:snapshot:]_block_invoke (in SampleApp) (MSLSyncManager.m:928)

-[MSLSyncManager datastore:snapshot:] (in SampleApp) (MSLSyncManager.m:922)

__56-[MSLSyncManager snapshotWithDatastore:success:failure:]_block_invoke (in SampleApp) (MSLSyncManager.m:764)

__85-[MSLSyncManager processHTTPRequestWithPath:method:header:parameter:success:failure:]_block_invoke239 (in SampleApp) (MSLSyncManager.m:402)

__73-[MSLURLSessionManagerTaskDelegate URLSession:task:didCompleteWithError:]_block_invoke_276 (in SampleApp) (MSLURLSessionManager.m:184)

0x00070bb8


잘된다.


파라미터를 설명하면..


--arch : 심볼리케이션 할 아키텍쳐

-o : 심볼리케이션 할 앱의 dSYM파일

--load-address $1 : load address , $2.... : runtime address 


이다 


runtime address를 등록한 순서대로 아래 심볼리케이션 된 라인들이 나온다. 파싱해서 사용하면된다.


여기까진 앱 심볼리케이션이고..


시스템 심볼리케이션도 저거로 된다. 


똑같이 sdk 심볼을 -o에 넣고 --load-address 설정하면 된다.



알고보면 별로 안어려운데.. 개삽질 끝에 알아낸 것들이다..ㅋㅋㅋ


페북 아저씨들은 참 똑똑한 것 같다.ㅎ

'개발 이야기' 카테고리의 다른 글

iOS symbolication dwarfdump로 하기  (0) 2015.01.30
Posted by 서오석
,

iOS 심볼리케이션을 하려면 기본적으로 mac에서 debug모드로 하면 자동으로 된다.


개인 개발자면 별 문제가 없지만 nhn이나 skp, daumkakao 같이 다수의 앱을 서비스하는 회사에서는 iOS 앱의 크래쉬 정보를 서비스화 해서 전사 앱 개발을 하는데 도움을 주려고 시스템을 별도 구축한다.


몇가지를 보면 nhn의 ncrazer가 있고 skp는 crash logger라는 애고 daumkakao에는 moca crash report라는 시스템이 있다.


nhn ncrazer 


skp crash logger 
http://readme.skplanet.com/?p=5030 

daumkakao
음.. 따로 자료 안만듬..ㅎㅎ 나중에 만들어야 하는데..;

일단 요기까지 잡다한 설명은 제외하고 저런 서비스에서 iOS 심볼리케이션을 어떻게 할까?

대략 방법은 2가지다.
* xcode에서 기본적으로 제곡하는 symbolicatecrash를 이용하는 방법
* atos, otool, lipo, dwarfdump를 이용하는 방법


저건 모두 mac에서 돌려야 돌아간다. 


symbolicatecrash를 이리저리 뜯어서 속도를 빠르게 할 수 있다. 


근데 두번째은 다이렉트로 해보는 방법도 있어서 그 부분을 소개해보련다.


그냥 간단히 예제를 하나 보자


앱의 bundle name은 TestApps다. 


ios backtrace가 다음과 같다고 했을 때 


0   libsystem_kernel.dylib         0x34d721d4 0x34d5d000 + 86484

1   libsystem_c.dylib             0x34cdbcf8 0x34cc7000 + 85240

2   libsystem_c.dylib             0x34cf7798 0x34cc7000 + 198552

3   libsystem_c.dylib             0x34d1190c 0x34cc7000 + 305420

4   TestApps                       0x0034665e 0x6a000 + 2999902

5   TestApps                       0x0026d99c 0x6a000 + 2111900



dwarfdump로 심볼리케이션 한 주소를 알아내기 위해서는 symbol address를 알아내야 한다. 


symbol address를 알려면 일단 otool을 가지고 vmaddr의 메모리 주소를 알아내야 한다.


방법은 


otool -arch armv7 -l ../TestApps.xcahive/Products/Applications/DaumApps.app/DaumApps


이런식으로 arch 명령어 주고 앱파일의 위치를 걸면 


oad command 0

      cmd LC_SEGMENT

  cmdsize 56

  segname __PAGEZERO

   vmaddr 0x00000000

   vmsize 0x00004000

  fileoff 0

 filesize 0

  maxprot 0x00000000

 initprot 0x00000000

   nsects 0

    flags 0x0

Load command 1

      cmd LC_SEGMENT

  cmdsize 736

  segname __TEXT

   vmaddr 0x00004000

   vmsize 0x004d4000

  fileoff 0

 filesize 5062656

  maxprot 0x00000005

 initprot 0x00000005

   nsects 10

    flags 0x0


이런형태로 줄줄 뭐가 나오는데 Load command 가 LC_SEGMENT이고 segname이 __TEXT인 vmaddr이 우리가 필요한 메모리 주소다.


otool이 없어도 된다. dwarfdump로도 구할 수 있다. 


방법은 dwarfdump -R /TestApps/dSYM/ 을 하게 되면 


Segments

Segment Name     vmaddr   vmsize   fileoff  filesize maxprot  initprot nsects   flags

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

__PAGEZERO       00000000 00004000 00000000 00000000 00000000 00000000 00000000 00000000

__TEXT           00004000 004d4000 00000000 00000000 00000005 00000005 0000000a 00000000

__DATA           004d8000 000d0000 00000000 00000000 00000003 00000003 00000014 00000000

__LINKEDIT       005a8000 00430000 00001000 00178270 00000001 00000001 00000000 00000000

__DWARF          009d8000 012e7000 0017a000 012e637b 00000007 00000003 0000000f 00000000


이렇게 나오는데 빨간색으로 표기한게 vmaddr이다.


위에서 vmaddr은 0x00004000 이다


저 주소를 있으면 주소를 계산하자.


위에 backtrace의 4번 라인을 가지고 symbol address를 구해보자.


0x3B465E =   0x00004000 + 0x0034665e - 0x6a000


symbol address는 0x3B465E다.


이제 이걸 dwarfdump에 넣어서 돌리자.


dwarfdump --arch=armv7 --lookup=0x3B465E TestApps/dSYM/


결과를 보다보면

0x008cdb2e:     TAG_subprogram [78] *

                 AT_name( "-[AFHTTPClient initWithBaseURL:]" )

                 AT_decl_file( "/Users/5dolstory/Workspace/D TestAppsIphone/TestIphone/Pods/AFNetworking/AFNetworking/AFHTTPClient.m" )

                 AT_decl_line( 231 )


......

Line table dir : '/Users/5dolstory/Workspace/TestAppsIphone/TestIphone/Pods/AFNetworking/AFNetworking'

Line table file: 'AFHTTPClient.m' line 288, column 0 with start address 0x00000000003b4656

.........


이렇게 Line table 이 있는데 이게 crash가 난 위치고 AT decl file이 클래스 파일 위치고 AT name이 메소드명이다.





'개발 이야기' 카테고리의 다른 글

symbolication을 ubuntu에서 하기  (0) 2015.06.17
Posted by 서오석
,

오늘은 이지스 군함을 조립해 봅시다.


한번에 4개를 사서 조립하려니 진짜 빡시네요..;; 그래도 아들이 나중에 가지고 놀 걸 생각하면서 열심히 만듭니다.ㅎ


코어몰에서 제목을 이지스 군함이라고 만들었지만 케이스에는 Warship이라도 되어 있습니다.


생긴것도 이지스함이라기 보단 일반적인 구축함처럼 생겼습니다. 


브릭은 950 피스 정도 되며 대형 레고 블럭이며 가격은 코어몰에서 29500원 선에 팔리고 있습니다.




상자를 열어서 브릭을 까보면 양이 엄청나다는 것을 알 수 있습니다. 이렇게 양이 많은 브릭을 조립 할 때는 가능하면 브릭을 종류 별로 분리해 놓는 것이 좋습니다. 위에는 브릭을 종류 별로 분리하려고 그릇을 가져다 둔 겁니다.




양이 많아서 그런지 브릭을 정리하는데도 시간이 꽤 걸리네요..ㅎ 


회색 브릭과 매우 작은 브릭, 특수 브릭, 검은 색 브릭을 구분했습니다.




이제 구축함의 선두부터 만들어 봅시다. 처음 이야기 했지만 배가 상당히 큰 편입니다. 선두도 꽤나 크네요.



선두 조립을 끝냈습니다. 저기 뚜껑이 있는 부분이 원래 구축함들에겐 함대공 미사일이나 함대함 미사일이 발사되는 발사관입니다만...



요기에서는 한쪽은 보관함이고 한쪽은 사람이 탈 수 있는 공간으로 세팅되었습니다. 

(나중에 구조를 바꿔서 안에 미사일이 발사될 수 있도록 가능하게 해봐야겠습니다. 일단 선체가 매우 크기 때문에 가능할 듯 싶네요.)


저 상태가 선두 조립이 완료된 상태입니다.



선체의 후미를 만들기 시작합니다. 후미에는 핼리패드가 장착되어있습니다. 후미의 구조는 복잡하지 않아서 시간이 얼마 안걸렸네요.



배의 중간인 마스크 부분을 만들었습니다. 사진이 몇장 없지만 마스크 부분에 작은 부품이 많이 들어가서 시간이 꽤 걸렸습니다.




지금까지 만든 선두, 선미 , 마스크의 모습입니다. 뒤에 박스는 처음 만들었던 전투함세트네요..ㅎ



마스크 부분을 좀 더 보여드리자면 아래 미사일 발사대가 3문씩 양쪽에 있습니다. 이건 느낌상 러시아의 드레드노트같은 느낌이네요. 그리고 후방에 레이더 뒤쪽에도 양쪽을 기준으로 미사일 발사대가 있습니다. 이 부분을 골키퍼로 만들었으면 더 사실적이었을 것 같네요.



마스크를 조립하다가 1x1 부품 2개가 모잘라서 일단  비워놨습니다. 크게 눈에 띄지는 않네요.




선두에 장착되는 함포입니다. 요 배에는 함포에 사람이 타고 있을 수 있습니다. 아쉽게도 4x1 브릭 2개가 모자라서 좀 어설픕니다.

이 브릭도 판매자에게 같이 보내달라고 해야겠네요.




선두, 선미, 마스크를 합친 완성본 모습니다. 참고로 저기 구명보트의 체인은 정말 플라스틱 체인으로 되어 있습니다. 매우 약하니 조심 조심 다뤄서 끼워야 합니다.



좀 더 옆면을 보여드리고 싶어서 찍었습니다. 크기를 보시면 대략 70cm 정도 됩니다. 매우 큰편입니다.




앞에 사진을 한방 더 찍어봤습니다.


보시면 요 레고는 사람이 노란색입니다. 초대형 항모에도 사람이 노란색인걸 보니 중급에는 사람이 살색이 들어가고 대형에만 노란색 사람이 들어가는 듯 싶습니다.




말씀드린 체인 부분입니다. 디테일이 꽤 좋은 편입니다. 




정면을 보여드리기 위해서 찍은 사진입니다.


조립시간은 4시간 정도 소요되었습니다. 전에 프리깃 함을 조립할 때는 614피스인데도 4시간 반이 걸렸는데 얘는 970피스인데도 그때보다 시간이 적게 걸렸습니다.


이게 처음에 브릭을 분류해서 각 상자에 넣고 작업을 하면 작업시간을 상당히 단축 시킬 수 있습니다. 또한 브릭을 잃어버리지 않기 때문에 처음부터 없는 브릭이 뭔지 알 수 있습니다. 


생각보다 매우 디테일하기 때문에 10살정도 되는 아이가 조립을 하면 적당해 보였습니다. 


이제 마지막으로 초대형 항모가 남았네요.. 초대형 항모는.. 피스만 1500개 정도 됩니다.. 해서 블로그에 포스팅을 1,2부로 나눠서 하도록 하겠습니다.



Posted by 서오석
,

오늘 소개 할 호환레고는 "ENLIGHTEN 826 Aircraft Carrier (항공모함 전투단)" 입니다.



크기는 대형항모라고 보긴 좀 그렇고 경항모라고 하면 어울리겠네요. 피스는 508피스로 구성되어 있습니다.


가격은 25800원으로 역시 매우 저렴한 편입니다..ㅎㅎ


그럼 바로 조립을 해봅시다.





일단 브릭을 구분합니다. 저번 프리깃 함을 만들 때 브릭들을 마구 섞어서 작업을 하니 시간이 꽤 걸리더라고요. 


그래서 이번에는 그룹을 작은거 큰거로 구분했습니다.



항모의 뼈대를 만들기 시작합니다. 경항모의 뒤에는 보트가 들어갈 수 있게 되어 있습니다. 그래서 저 가드가 있고요.



어느정도 항모의 윤곽이 나오고 있습니다. 가운데 스프링 부분은 경항모에서 미사일 발사대가 측면으로 나오게 되어 있어서 그 부분을 만든 것입니다. 

 호환레고를 보면 신기한 부품들이 몇개가 있습니다. 일반적으로 레고에서 볼 수 없는 것들인데 아마 구동되는 부분을 만들려고 추가한 듯 합니다.



항모가 얼추 만들어졌습니다. 덥개를 덥으니 이제 좀 그럴싸하네요.



관제탑을 만들고 비행기만 올리면 끝납니다. 완성이 되었네요..ㅎㅎ



항모에 있는 조그만 보트입니다. 원래 항모 뒤에서 꺼낼 수 있는데  제품 설명에 보면 잘 나와 있어서 따로 안찍었습니다. 


이번 인현도 얼굴과 몸이 살색입니다.ㅎㅎ 



브릭을 조립하면서 모자란 브릭이 생겨서 임시로 다른 브릭으로 땜빵을 했습니다.


원래 4X1 브릭이 있어야 하는데 저기에다가 신호기 같은걸 만들어서 달려고 6X1 브릭으로 끼워넣었습니다. 없는 브릭은 역시 다시 요청을 해야겠네요.


대략적으로 만든 시간은 2시간 30분 정도 걸린 듯 합니다. 


일단 브릭 피스 자체가 509개정도로 전에 프리깃함보단 좀 더 적어서 맞추기가 수월합니다.


그리고 브릭을 구분해서 조립하니 브릭 찾는데 시간이 많이 단축되었네요.


대략적으로 8세 아이정도면 무난히 만들 수 있지 않을까 생각이 되네요.ㅎㅎ


중국 레고가 정말 가격대 성능비는 짱인듯 싶습니다.


Posted by 서오석
,

오랜만에 다시 블로그 포스팅을 하네요..


최근에 아이가 커서 레고를 사줄까 하다가 호환 레고를 알게 되어서 몇개 구매했습니다.(라고 쓰고 제가 갖고 싶어서라고 쓰지는 않습니다.;) 


일반 정품 레고와 비교했을 때 가격이.. 후덜덜하게 쌉니다. 그래서 하나씩 구입 할 때마다 블로그에 포스팅하기로 마음을 먹었습니다.


첫 호환 레고 스리즈는 "ENLIGHTNE 820 Frigate 구축함 세트입니다.


가격은 24800원 (2015.01.10) 정도로 매우 저렴합니다.


저는 그냥 11번가에서 구매했는데요. 오픈마켓에서 "코어몰"이라고 치면 많이 나옵니다. 거기서 구매하시면 됩니다.


생긴건 이렇게 생겼습니다.





안에 들어있는 브릭의 피스는 650개 정도 들어있고 구성은 큰배, 구명보트, 조그만 악당 섬 이렇게 3개입니다.


한국 명칭이 구축함 세트인데 영어로는 정확하게 명칭이 되어 있습니다. 크기로 봤을 때 프리깃함이라고 보는게 맞을 듯 합니다.


ENLIGHTEN 스리즈 중에 warship이라고 명명된 스리즈가 있는데 그게 구축함에 더 가까워 보입니다.

(한국명으로 이지스함이라고 되어 있는데.. 이지스도 구축함이니.. 얼추 맞긴 합니다.)


본격적으로 조립을 시작해보겠습니다.



상자를 열면 2개 상자로 분리되어 있습니다. 

(화면이 어두운 건 아내와 아기가 잘 때 혼자 만들어야 해서 불을 키지 못했습니다.ㅠ)


옆에 열쇠고리는.. 찬조입니다.(열쇠고리는 옥스포드꺼랑 비슷합니다.)



브릭의 구성은 이렇습니다. 대략 4봉지가 있고 봉지 안에 몇개 자잘한 것들이 있습니다.





브릭을 모두 상자에 쏟아 넣습니다. 작은 피스가 꽤 있기 때문에 잃어버릴 염려가 있어서 가능하면 상자에 담아놓고 작업을 하는게 좋습니다.



악당들이 지내는 조그만 섬입니다. 저기 로켓 발사대는 실제로 스프링으로 동작해서 발사가 됩니다! 0_0



이렇게 스프링으로 발사가 됩니다. 




섬을 다 만들고 브릭 인형을 배치했습니다. 재미있는게.. 원래 레고는 애들이 노락색 피부를 갖는데 얘네들은 피부가 살색입니다!

정말 사람이라서 그런건지 모르겠지만.. 살색입니다.






이제 로켓포드가 달린 헬기를 조립합니다.



헬기 완성을 하였습니다. 브릭들 사이에 쌓여 있어서 구분이 잘 되지 않네요. 




헬기 안에 조종사를 태웠습니다. 조종사 헬멧에 있는 안경은 너무 헐거워서 그냥 걸쳐놓는 수준입니다. 나중에 호환레고(중국)와 정품 레고간에 비교를 해야겠습니다. 전반적으로 중국산 레고는 브릭을 맞출 때 뻑뻑하거나 너무 헐겁습니다. 정품레고처럼 균일하지 않아 보입니다.





이제 구축함을 만들기 시작합니다. 구축함은 하부를 만듭니다.

하부를 만들 때 브릭 피스 1개가 모자랐습니다. (저 길다란 막대기..) 코어몰에선 모자란 브릭은 이야기 하면 따로 준다고 합니다. 


일단 없는대로 3개만 껴서 시작했습니다.



얼추 골격이 만들어졌습니다.



짜잔.. 이제 완성이 되었습니다. 사진엔 없는데 파란 옷 입은 사람 두명 밑에는 구명보트가 들어갈 수 있도록 되어 있습니다. 



헬기도 올려보았습니다. 


한국어로는 구축함 세트인데.. 구축함은 아니고 정말 프리깃함 정도입니다.


인형이 쓰고 있는 파란 모자에는 별이 그려져있습니다.(인민군이라 그런가 봅니다..)


6세 이상이 조립하긴 어려워 보이고 6세 이상이면 가지고 놀 정도 되어보입니다.


한..10살이나 11살 정도가 조립하면 좋을 듯 합니다. 


제가 조립한 시간은 4시간 정도 소요되었습니다.



Posted by 서오석
,

iodocs의 구조는 기본적으로 다음과 같다.


- iodocs-master 

- node_modules

 iodocs에서 사용하는 node의 모듈 디렉토리 

 

- public

 API의 정보들을 등록하는 디렉톨리

 

- views 

 iodocs의 문서 포멧 및 디자인을 지정 하는 디렉토리

 

- app.js 

 iodocs 내부적으로 API를 Call할 때 사용하는 javascript 

 

- config.json 

 iodocs를 띄우기 위한 기본 설정들

 - package.json 

 iodocs 버전 정보 



                      

node_modules

이곳에는 node.js에서 사용 가능한 모듈이 있다 만약 iodocs를 커스터마이징하여 추가적인 기능을 붙이고 싶은 경우 npm으로 추가 모듈을 설치하면 된다. 


public

해당 디렉토리 밑에는 총 3개의 하위 디렉토리가 있다.

  • data
  • images
  • javascripts
  • stylesheets




Posted by 서오석
,

API를 개발하면 문서를 만들어야 하는데 이것을 쉽게 만들어주는 툴이 iodocs이다. 

Git에 보면 간단한 설명이 있다.


I/O Docs Github 바로가기


I/O Docs is a live interactive documentation system for RESTful web APIs. By defining APIs at the resource, method and parameter levels in a JSON schema, I/O Docs will generate a JavaScript client interface. API calls can be executed from this interface, which are then proxied through the I/O Docs server with payload data cleanly formatted (pretty-printed if JSON or XML). Basic HTML text tags are enabled in the JSON schema.


Iodocs가 좋은 점은 doc인데도 불구하고 해당 페이지에서 직접 API를 날려 볼 수 있도록 되어 있다. 


설치 방법은 yum을 이용해서 간단하게 설치하는 방법도 있으나 여기서는 하나씩 설치하는 방식을 사용한다.


INSTALLATION INSTRUCTIONS FOR NODE, NPM & REDIS

  1. Node.js - https://github.com/joyent/node/wiki/Installation
  2. npm (Node package manager) - https://github.com/isaacs/npm
  3. Redis - http://redis.io/download

INSTALLATION INSTRUCTIONS FOR I/O DOCS

From the command line type in:

  git clone http://github.com/mashery/iodocs.git
  cd iodocs
  npm install


해당 사이트에 가면 위 1~3번을 설치하고 나면 간단하게 iodocs를 설치 할 수 있다고 나온다. 


일단은 저걸 설치하려면 Git이 서버에 설치가 되어 있어야 한다. 일단 Git을 설치하자.

OS버전은 RedHat이며 각 설치 방법은  OS별로 다르다. 


[root@iaas-5dol-sandbox ~]# yum install git-core



이제 node.js를 설치해보자. 

https://github.com/joyent/node/wiki/Installation 를 이용해서 직접 설치를 할 수 있으나.. 파이선을 버전에 맞게 다시 인스톨해줘야 하는 번거로움이 있어서 yum으로 인스톨을 하겠다.


필자의 경우 yum으로 install하려고 하니 nodejs가 없다고 나왔다.


그냥 바이너리를 이용해서 설치하고 환경변수에 추가해주자


[root@iaas-5dol-sandbox program] wget http://nodejs.org/dist/v0.10.30/node-v0.10.30-linux-x64.tar.gz

[root@iaas-5dol-sandbox program]# tar xvfz node-v0.10.30-linux-x64.tar.gz

[root@iaas-5dol-sandbox program]# ln -s node-v0.10.30-linux-x64 node

[root@iaas-5dol-sandbox ~]vi .bash_profile


PATH=$PATH:$HOME/bin:/daum/program/node/bin

export PATH



자 이제 redis를 설치하자. redis를 iodocs에서 사용하는 이유는 iodocs 내부적으로 문서로 만든 API 자체를 날려볼 수 있기 때문인데 api가 oauth를 사용하는 경우에 인증을 저장할 공간이 필요하고 그것을 redis에 저장한다.


만약 oauth를 사용하지 않는 경우는 redis를 제거해도 되긴 한다. 여기선 일단 redis를 적용한 버전으로 진행한다.


[root@iaas-5dol-sandbox program] wget http://download.redis.io/releases/redis-2.8.13.tar.gz

[root@iaas-5dol-sandbox program] tar xvfz redis-2.8.13.tar.gz

[root@iaas-5dol-sandbox program] make

[root@iaas-5dol-sandbox program] make install

[root@iaas-5dol-sandbox program] ln -s redis-2.8.13 redis



이제 기본적인 것은 다 설치했으니 iodocs를 설치해보자.

[root@iaas-5dol-sandbox program] git clone http://github.com/mashery/iodocs.git

[root@iaas-5dol-sandbox program] cd iodocs

[root@iaas-5dol-sandbox program] npm install





'개발 이야기 > 유용한 Coding' 카테고리의 다른 글

I/O Docs 구조  (0) 2014.08.18
java로 excel 다중 sheet 만들기  (0) 2010.06.03
jdbc 사용 예제  (1) 2009.08.25
Struts2 + Spring2.0 엮을 때 나는 NullPointerException 해결방법  (1) 2009.02.02
FTP 파일 업로드  (0) 2008.12.01
Posted by 서오석
,

1. 사전작업

svn에 있는 소스를 내려받아 인텔리J에서 작업을 하고 싶다면 다음과 같이 하자. 




VCS -> Browse VCS Repository -> Browse Subversion Repository  -> 소스 선택 -> Checkout


그냥 잘 받아지면 문제가 없지만 초기 세팅 시 아래와 같은 문제가 생길 수 있다.


2. 에러 내용

인텔리J에서 SVN 체크아웃을 할 때 다음과 같은 에러가 발생한다면?

"Cannot load supported formats: Cannot run program "svn": CreateProcess error=2" 



eclipse의 경우 svn PlugIn을 깔면 체크아웃이 잘 되지만 인텔리J는 기본적으로 SVN client을 내장하고 있지 않다. (PlugIn은 그냥 PlugIn일 뿐..) 그래서 이걸 깔아줘야 한다. 


3. 해결 방법

http://www.sliksvn.com/en/download 에서 SilkSvn을 다운로드 받고 설치해주자. 

(다른 것도 상관없다. 다른 것을 쓰고 싶으면 http://subversion.apache.org/packages.html 를 참조하자.)


4. 레퍼런스

http://blog.jetbrains.com/idea/2013/12/subversion-1-8-and-intellij-idea-13/


Posted by 서오석
,

아래와 같이  pom.xml에 등록하면 됨

<build>

<finalName>${project.artifactId}</finalName>

<plugins>

<!-- 컴파일러 설정 -->

<plugin>

<artifactId>maven-compiler-plugin</artifactId>

<configuration>

<encoding>UTF-8</encoding>

<source>1.6</source>

<target>1.6</target>

</configuration>

</plugin>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-shade-plugin</artifactId>

<version>1.7</version>

<executions>

<execution>

<phase>package</phase>

<goals>

<goal>shade</goal>

</goals>

<configuration>

<transformers>

<transformer

implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">

<manifestEntries>

<Main-Class>com.tistory.5dol.Starter</Main-Class> <!-- 실행시킬 Class 등록 -->

</manifestEntries>

</transformer>

<transformer

implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">

<resource>META-INF/spring.handlers</resource>

</transformer>

<transformer

implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">

<resource>META-INF/spring.schemas</resource>

</transformer>

</transformers>

<filters>

<filter>

<artifact>*:*</artifact>

<excludes>

<exclude>META-INF/*.SF</exclude>

<exclude>META-INF/*.DSA</exclude>

<exclude>META-INF/*.RSA</exclude>

</excludes>

</filter>

</filters>

</configuration>

</execution>

</executions>

</plugin>

</plugins>

</build>


Posted by 서오석
,

순서


1. 포트 오픈

rlogin : 513 

rsh : 514

ssh : 22


2. target 서버에서 .rhost 설정

127.0.0.1 5dolstory  <- ip는 source 서버의 ip


3. 서버에서 rsh, rlogin 실행

/etc/xinetd.d/rsh, /etc/xinetd.d/rlogin

disable = yes -> no 설정


4.   xinetd 재시작

/etc/rc.d/init.d/xinetd restart


5. 로그인 없이 rsh 바로 접근 하고 싶은 경우

vi /etc/pam.d/rsh

#auth       required     pam_rhosts_auth.so <-  주석 처리

Posted by 서오석
,

출처 : http://eekplus.blogspot.kr/2012/03/oradiag.html


환경변수에 추가

export TNS_ADMIN=/home/eek/conf/


해당경로에 sqlnet.ora파일 생성해서

DIAG_ADR_ENABLED=off

TRACE_LEVEL_CLIENT=off
LOG_FILE_CLIENT=/dev/null


설정값을 추가하면 로그 파일이 생성되지 않음.


원본 document : http://docs.oracle.com/cd/B28359_01/network.111/b28317/sqlnet.htm#BIIDEAFI

Posted by 서오석
,

count(1)과 count(*)의 차이점은 뭘까?


결론만 말하자면 아무런 차이가 없다. 심지어 속도 차이도 없다. 


Oracle Ask Tom에 보면 이런 글이 있다 : http://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:1156159920245





Posted by 서오석
,

jQuery의 Ajax로 post로 날릴 때 

XMLHttpRequest cannot load ...."URL" not allowed by Access-Control-Allow-Origin 

이라는 에러가 나는 건 간단히 말하면 크로스브라우징 에러이다.


참조 : http://blog.iolo.pe.kr/category/hacking/web

Ajax에는 Same Origin Policy라는 원칙이 있다. 말 그대로, 현재 브라우져에 보여지고 있는 HTML을 내려준 웹서버(Origin)에게만 Ajax 요청을 보낼 수 있다.


MS가 XMLHttpRequest를 처음 만들 때만 해도 이런 제약은 당연한 것처럼 보였지만, 지금에 와서는 OpenAPI를 통한 매시업(Mashup)이 활성화되는 데 가장 큰 장애물이 되었다. 매시업이 아니더라도 여러 개의 도메인을 사용해야 하는 대규모 사이트를 개발할 때도 골치거리였다. Same Origin Policy를 우회하는 방법으로 JSONP, IFRAME IO, CrossDomain Proxy 등이 고안되었지만, 보안성이 취약하다거나, 동기 호출이 안되거나, 주고 받는 데이터 형식이 제한되거나, 직관적이지 못하거나(dirty hack), ... 등의 문제점 때문에 표준화되기엔 무리가 있었다.


(중략) 한 참 뒤에야 W3C는 (MS의 IE가 제공하는 방식을 수용하여) 크로스도메인간에도 Ajax요청을 주고 받을 수 있는 방법을 표준화 했는데, 그것이 바로 CORS다.


CORS를 한 마디로 요약하면, "요청을 받은 웹서버가 허락하면 크로스도메인이라도 Ajax로 통신할 수 있다"라는 정책이다. 기술적으로는 크로스도메인에 위치한 웹서버가 응답에 적절한 Access-Control-Allow-류의 헤더를 보냄으로써 크로스도메인 Ajax를 허용 수 있다


헤서 자신의 도메인과 post로 날리는 url이 같은지 확인해보면 알 수 있다.


만약 크로스브라우징을 지원해야 할 경우는


아래처럼 요청을 하면 되며

$.ajax({


    url: 'https://www.googleapis.com/moderator/v1/series?key='+key,

    data: myData,

    type: 'GET',

    crossDomain: true,

    dataType: 'jsonp',

    jsonp : 'callback',

    success: function() { alert("Success"); },

    error: function() { alert('Failed!'); },

    beforeSend: setHeader

});


받는 형태는 아래형태여야만 한다.

callback({"key1" : "value1",  "key2" : "value2"});



'개발 이야기 > 삽질의 해답들' 카테고리의 다른 글

자바로 정렬하기  (0) 2010.02.02
Spring2.0 Dao 에러 중 setter 설정 에러  (0) 2009.07.31
Posted by 서오석
,
출처 : 
 

1. 메모리 관리 소개
 
top과 같은 일반적인 Unix 도구들은 시스템이 잠시 구동된 후 여유 공간이 얼마되지 않는다고 종종 보고합니다.
(예를 들어약 3시간 가량 시스템을 가동하면)
현재 제가 이 글을 작성하고 있는 이 머신은 512MB 크기의 RAM임에도 불구하고 단지 60MB 이하의 메모리 여유 공간이 있다고 보고합니다모두 어디로 간 것일까요?
 
이렇게 보고되는 메모리가 사용되는 가장 큰 공간은 디스크 캐시(Cache)에 있습니다. (필자의 경우 현재 약 290MB 이상 입니다.)
이러한 캐시 영역은 top에 의해 "cached"라고 표시됩니다.
캐시 메모리는 실행 중이거나 새로 시작될 프로그램이 메모리를 필요로 한다면 빠르게 대체되어야 하기 때문에 OS에서는 항상 여유있는 만큼 확보하게 됩니다.
 
UNIX가 디스크 캐시용으로 메모리를 이렇듯 많이 사용하는 이유는...
캐시가 사용되지 않으면 RAM이 모두 낭비되기 때문입니다.
캐시를 유지한다는 것은 어떤 프로그램이 같은 데이터를 다시 필요로 하고 있다는 것으로캐시에서 정보를 읽어 들이는 것은 하드 디스크에서 읽어 들이는 것에 비해 약 1000배 이상 빠릅니다.
캐시에서 정보를 가져올 수 없다면하드 디스크에서 읽어 들여야 하기에 그만큼 많은 시간이 소요됩니다. (그러나 정보의 손실은 없습니다.)
 
응용 프로그램을 사용하기 위해 얼마 정도의 여유 메모리가 있는지를 확인하기 위해서는 다음 명령어를 실행하세요.
# free -m
 
-m 옵션은 메가바이트를 의미하며 결과값은 아래와 같습니다:
total used free shared buffers cached
Mem: 503 451 52 0 14 293
-/+ buffers/cache: 143 360
Swap: 1027 0 1027
 
-/+ buffers/cache 라인에는 메모리의 사용량 및 다른 응용 프로그램을 사용하기 위한 여유 공간이 얼마나 되는지를 보여줍니다.
일반적으로 작은 스왑이 사용되면메모리 사용량은 성능에 어떠한 영향을 주지 않습니다.
 
제 시스템에는 512MB의 메모리가 있음에도 단지 503MB만이 사용 가능하다고 나와있습니다.
이것은 커널이 스왑을 할 수 없어서커널이 차지하는 메모리 공간은 절대로 사용될 수 없기 때문입니다.
시스템의 아키텍쳐에 따라서다른 목적을 위해서도 하드웨어에 의해 혹은 하드웨어를 위한 메모리가 점유되어 있는 공간이 있을수도 있습니다.
 
 
2. x86 상의 알 수 없는 880MB 제한
 
기본적으로리눅스 커널은 적은 메모리만으로도 실행할 수 있으며 관리가 가능합니다.
그래서 페이지 테이블 관리가 조금은 용이하게 되고순서대로 메모리로의 접근이 조금 더 빨라지게 됩니다.
단점은 일단 RAM의 총 용량이 880MB에 근접해지면 커널은 모든 메모리를 사용할 수 없게 됩니다.
이것은 지금까지 문제가 되지는 않았지만 데스트톱의 경우 그러한 상황이 발생될 수 있습니다.
 
1GB 이상의 RAM을 모두 사용하려면커널은 재컴파일되어야 합니다.
'make menuconfig' (또는사용하는 어떤 config 파일도 가능)을 열어 다음의 옵션을 설정하세요.
Processor Type and Features ---->
High Memory Support ---->
(X) 4GB
 
이것은 2.4 및 2.6 커널에 적용됩니다.
높은 메모리를 지원한다는 것은 이론적으로 메모리 접근 속도가 다소 느려지게 되는 것이지만, Joseph_sys와 log에 따라서 실제적으로는 차이가 없습니다.
 
 
3. top의 출력에서 VIRT, RES, 그리고 SHR의 차이점
 
VIRT는 하나의 프로세스의 가상 크기 (virtual size of a process)를 의미하는데그 프로세스가 실제로 사용하고 있는 메모리의 총량으로프로세스에 대응되는 메모리 (, X 서버의 비디오 카드 RAM), 프로세스에 대응되는 디스크상의 파일들 (대부분 주로 공유 라이브러리들), 그리고 다른 프로세스와 함께 공유되는 메모리입니다. VIRT는 현재 시점에서 어떤 하나의 프로그램이 접근 가능한 메모리의 크기가 얼마나 되는지를 보여줍니다.
 
RES는 현재 점유하고 있는 메모리 크기 (resident size)를 의미하는데하나의 프로세스가 실제 물리 메모리를 얼만큼 소비하고 있는가는 보여주는 것입니다. ( 이것은 또한 %MEM 열에 직접적으로 대응합니다.) 대부분의 프로그램들이 라이브러리에 의존하기 때문에 RES는 항상 VIRT 크기보다 작습니다.
 
SHR은 얼마 정도의 VIRT 크기 만큼 공유될 수 있는가를 보여줍니다. (메모리 또는 라이브러리라이브러리의 경우에는 모든 라이브러리가 메모리에 들어 있다는 것이 아닙니다예를 들어한 프로그램이 어떤 라이브러리의 아주 적은 함수만을 사용한다면모든 라이브러리는 대응이 되고 VIRT와 SHR에서 라이브러리 수가 측정되지만 단지 사용되고 있는 함수가 포함된 해당 라이브러리 파일의 일부분만 실행되고 RES에 의해 측정될 것입니다.
 
 
4. 버퍼와 캐시의 차이
 
버퍼는 특정 블록 장치와 관련이 있으며 파일시스템의 메타데이터를 캐시에 저장하는것 뿐만 아니라 in-flight 페이지를 추적하는 것 또한 할 수 있습니다그러나 캐시는 캐시에 저장된 파일 데이터만을 유지합니다.
버퍼가 디렉터리에는 무엇이 있는지파일들의 권한들은 어떠한가를 저장하며어떤 메모리가 특정 블록 장치를 위해 기록이 되거나 혹은 읽어 들여지는 가를 추적합니다그러나 캐시는 파일들의 내용 그 자체만을 유지할 뿐입니다.
 
이 부분에 대해 더 정확히 아시는 분은정정 및 부연 설명을 해주시기 바랍니다.
저는 /proc/meminfo가 이러한 결론에 도달하기 위해서 어떻게 처리되는가를 알아보는 것에 근거하여 다소 추측을 포함해 작업하였기 때문입니다.
 
 
5. Swappiness (커널 2.6)
 
2.6 버전 이후로메모리가 꽉 차게 될 때리눅스는 캐시의 크기를 축소하는 것과는 달리얼마의 메모리를 디스크로 스왑해야 하는지를 조율하기 위한 방법이 있었습니다.
 
어떤 하나의 응용 프로그램이 메모리를 필요로 하나 모든 RAM이 사용되고 있을 때커널은 일부 메모리 공간을 확보할 수 있는 두 가지 방법을 가지고 있습니다.
커널은 가장 오래된 데이터를 삭제함으로써 RAM에 있는 디스크 캐시를 줄인다거나상대적으로 덜 사용되는 부분 (페이지)를 디스크의 스왑 파티션 밖으로 스왑할 수도 있습니다.
 
그러나 이 두가지 방법 중 어떤 것이 더 효과적인가는 미리 알 수 없습니다.
커널은 최근의 활동 기록을 바탕으로 주어진 시간에 두 가지 방법 중 효과적인 것을 추측하여 결정을 하게 됩니다.
 
커널 2.6 이전 버전에서는 사용자가 그러한 계산에 영향을 미칠 수 있는 수단이 없었으며 커널이 종종 잘못된 결정을 하게 되어 성능이 저하되고 느려지게 되는 상황이 발생하기도 했습니다. 2.6 버전에 swappiness가 추가됨으로써 이러한 문제를 해결하였습니다.
 
Swapiness는 응용 프로그램을 스왑하고 캐시를 비워두는 것 사이에 균형의 변화를 주기 위해서 0에서 100까지 중 하나의 값을 선택합니다. 100을 선택하면커널은 사용하고 있지 않은 페이지들을 찾아내어 모두 스왑해 버립니다다른 경우에는스왑이 응용 프로그램이 메모리를 얼마나 점유하고 있는지 그리고 얼마나 적은 캐시가 사용하지 않는 것들을 찾아내고 빼내는가에 따라 스왑이 발생할 수도 있고 그렇지 않을 수도 있습니다.
 
기본적으로 swappiness의 값은 60입니다. 0은 메모리가 필요했던 응용 프로그램들이 캐시의 크기를 줄여서 RAM의 아주 작은 부분만 할당되게 할 수 있는 이전의 방식에 가깝게 되게 합니다랩톱의 경우 주로 디스트 회전 속도가 감소하기 때문에 20의 swappiness 값을 권장합니다.
 
sysctl으로, swapiness는 런타임시 다음과 같은 명령어들을 통해 설정될 수 있습니다.
# sysctl -w vm.swappiness=30
# echo 30 >/proc/sys/vm/swappiness
 
: Gentoo boot가 etc/sysctl.conf에서 설정될 때 기본값
# Control how much the kernel should favor swapping out applications (0-100)
vm.swappiness = 30
 
: Asianux Server 3의 기본값
# sysctl -a | grep vm.swappiness
vm.swappiness = 60
 
 
일부 패치셋에서는 커널이 자동적으로 swapiness 레벨을 지정할 수 있게 하여 사용자 설정 값을 유지하지 않을 수도 있습니다.


'서버 이야기 > Linux 이야기' 카테고리의 다른 글

rlogin, rsh 설정  (0) 2013.10.07
리눅스 history에 시간남기기  (0) 2013.01.23
rcp 서버 설정하기.  (0) 2012.10.24
리눅스 시간 동기화  (0) 2012.09.05
No space left on device  (0) 2012.06.28
Posted by 서오석
,

오라클에서 VARCHAR 형으로 되어있는 컬럼에 숫자만 있는 경우 이걸 어떻게 계산할까 궁금해하다가 요 블로그를 보게 되었다.

(http://blog.daum.net/why_i_am/33)


그래서 나도 테스트 해봤다.


일단 AVG를 할때 AVG하는 대상이 null이 없을 때는 아래와 같다.



보면 평균이 5가 나온다.


만약 d를 null로 하면?



평균을 d를 뺀 a,b,c만 가지고 평균을 낸다.


이건 count 함수와도 연관이 있다. 다시 d를 0으로 세팅하면..



count 가 4개이고 sum은 a,b,c,d를 모두 더한 값이다.


만약 다시 d가 null이면?



count가 3이되고 sum할 때 d를 빼고 한다. 

참고로 만약 count(*)로 하면 4가 나온다. 



생각해보면 sum할 때 대상 컬럼을 꼭 nvl(num,0)으로 만든 다음 할 필요가 없다.


여기서 중요한 개념은 "0 != null" 이다.


0은.. 0이지만 null은 '아무것도 없다.'라는 개념이기 때문이다.


맨 위에 있는 블로그에 다 있는 말이지만.. 간단히 정리해봤다.

Posted by 서오석
,

출처 : http://trouble.tistory.com/entry/bash-history%EC%97%90-%EC%8B%9C%EA%B0%84-%EB%82%A8%EA%B8%B0%EA%B8%B0


History 명령어


특수문자

의미

!

History 기능을 시작하기 위한 특수문자

!n

n번째로 사용된 명령어 실행

!-n

현재부터 n번째 앞에 사용된 명령 실행

!!

바로 전에 실행되었던 명령 실행(!-1)

!string

가장 최근에 string를 포함하고 있는 명령 실행

!?string[?]

가장 최근에 string을 포함하고 있는 명령 실행

^aa^bb

마지막으로 실행된 명령어에서 aa를 bb로 치환하여 명령 실핼, !!:s/aa/bb와 같음

!*

마지막으로 실행된 명령에 사용된 모든 argument

!$ 또는 !!$

마지막 명령의 마지막 argument

!^

마지막 명령의 첫 argument

Event:s^aa^bb

Event는 앞에서 !로 시작하는 history 명령. Aa를 bb로 치환, ^ 대신 다른 특수문자를 사용하여도 됨. Ex) !23:s/aa/bb

!:n 또는 !!:n

마지막 명령의 n번째 argument

!:n*

마지막 명령의 b번째부터 그 이후의 argument(!:n-$와 같은 의미)

!:0

마지막 명령의 명령어만 나타냄

!:n-m

마지막 명령의 n번째부터 M번째 까지의 argument

!;n-

마지막 명령의 n번째부터 마지막 argument를 제외한 argument

!?string?%

가장 최근에 string을 포함하고 있는 단어를 나타냄


위의 명령어를 command line나 bash script에서 사용하여 history 기능을 사용할 수 있다.

modifler를 이용하여 hostiry에 저장된 명령어의 내용을 변환 시킬수도 있다.

$ Tip : 쉘 명령 실행 시간을 .bash_history 에 기록하기
vi /etc/profile

[root@Linux ~]# vi /etc/profile
HISTTIMEFORMAT="%Y-%m-%d_%H:%M:%S\ "
export HISTTIMEFORMAT

라인을 추가하게되면, 로그인한 계정의 .bash_histroy 파일에
해당 명령의 실행 시간이 함께 찍히게 된다.

확인은 history 명령을 입력하게 되면,
[root@Linux ~]# history
2623  2006-10-17_13:48:06\ /etc/init.d/apache restart
2624  2006-10-17_13:48:06\ vi vhost_nehome.net


이런식으로, 라인 번호 다음에 해당 명령의 실행 시간이 표기된다.

'서버 이야기 > Linux 이야기' 카테고리의 다른 글

rlogin, rsh 설정  (0) 2013.10.07
리눅스 메모리 관리, 왜 메모리 여유공간이 없을까?  (0) 2013.08.14
rcp 서버 설정하기.  (0) 2012.10.24
리눅스 시간 동기화  (0) 2012.09.05
No space left on device  (0) 2012.06.28
Posted by 서오석
,

출처 : http://uple.net/121, http://cafe.naver.com/coolkkm1/19


oracle에서 현재시간과 일자 계산


현재 시간 출력 : sysdate
SQL> select sysdate from dual;

SYSDATE
------------
29-MAR-10


현재시간을 포맷을 지정하여 출력
SQL> select to_char(sysdate,'yyyymmdd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'
-----------------
20100329 13:15:26


현재의 시간과 1일 전의 시간을 구하기
SQL> select to_char(sysdate,'yyyymmdd hh24:mi:ss'), to_char(sysdate - 1,'yyyymmdd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,' TO_CHAR(SYSDATE-1
----------------- -----------------
20100329 13:15:38 20100328 13:15:38


현재의 시간과 10일전의 시간을 구하기
SQL> select to_char(sysdate,'yyyymmdd hh24:mi:ss'), to_char(sysdate - 10,'yyyymmdd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,' TO_CHAR(SYSDATE-1
----------------- -----------------
20100329 13:15:47 20100319 13:15:47


현재 시간과 1시간전의 시간을 구하기
SQL> select to_char(sysdate,'yyyymmdd hh24:mi:ss'), to_char(sysdate - 1/24,'yyyymmdd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,' TO_CHAR(SYSDATE-1
----------------- -----------------
20100329 13:15:54 20100329 12:15:54


현재 시간과 1분전의 시간을 구하기
SQL> select to_char(sysdate,'yyyymmdd hh24:mi:ss'), to_char(sysdate - 1/24/60,'yyyymmdd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,' TO_CHAR(SYSDATE-1
----------------- -----------------
20100329 13:16:02 20100329 13:15:02


현재 시간과 1초전의 시간을 구하기
SQL> select to_char(sysdate,'yyyymmdd hh24:mi:ss'), to_char(sysdate - 1/24/60/60,'yyyymmdd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,' TO_CHAR(SYSDATE-1
----------------- -----------------
20100329 13:16:09 20100329 13:16:08




- 시간구하기

select (to_date('1800', 'hh24mi') - to_date('0900', 'hh24mi'))*(24*60*60 )
 from dual;

to_date 로 계산후

(24 -- 시간표시

*60 -- 분표시

*60 ) -- 초표시

 

- 현재시간에 시간 추가하기

select sysdate,sysdate+1/(24*60)*10 from dual

 

sysdate+1은 1일 이후입니다.

그래서 1/(24*60)은 1분입니다.

10을 마지막에 곱하면 10분이죠 ^^

일 가(감) 산 SYSDATE + 1

시간 가(감) 산 SYSDATE + 1/24

분 가(감) 산 SYSDATE + 1/24/60

초 가(감) 산 SYSDATE + 1/24/60/60

 

-- 날자와 날짜사이의 시간 구하기
select to_date('2005050309','yyyymmddhh')-to_date('2005050409', 'yyyymmddhh'))*24
from dual;
;
                                
-- 날짜에 시간더하기
select to_char(to_date('200305021120', 'yyyymmddhh24mi'),  'yyyymmddhh24mi'),
to_char(to_date('200305021120', 'yyyymmddhh24mi') + (115/1440), 'yyyymmddhhmi') from dual;

 

-- 날짜수 구하기
select
  to_date('20050301', 'yyyymmdd')+1 - to_date('20050225', 'yyyymmdd')
from dual;
->여기서 하루치를 더한거는 그마지막 날을 포함하기 위해 하루를 더해야한다

 

-- 개월수 구하기
select months_between(to_date('20050131', 'yyyymmdd'), to_date('20010201', 'yyyymmdd')) from dual;

 

-- 그달의 마지막 날짜 구하기
select to_char(last_day(to_date('20040201','yyyymmdd')), 'yyyymmdd')
from dual;

select to_char(last_day(to_date('20040201','yyyymmdd')), 'mm')
from dual;

select to_char(last_day(to_date('20040201','yyyymmdd')), 'dd')
from dual;

 

-- 하루를 더추가하고 2달 뒤의 일자구하기
select to_char(add_months(to_date('20050201','yyyymmdd')+1, 2), 'yyyymmdd')
from dual;

 

-- 하루를 더추가하고 2달 앞의 일자구하기
select to_char(add_months(to_date('20050201','yyyymmdd')+1, 2), 'yyyymmdd')
from dual;


-- 해달일부터 2달 뒤의 일자구하기
select to_char(add_months(to_date('20050201','yyyymmdd'),2), 'yyyymmdd')
from dual;

 

- months_between : 두날짜간의 달수 구하기

select  months_between (to_date('20050201','yyyymmdd'), to_date('20050101', 'yyyymmdd'))
from dual;

 

- next_day 특정날자에서 가장가까운 요일의 날자 찾기

select next_day(to_date('20050101','yyyymmdd'), '일') from dual

 

TRUNC 함수의 제2 인수에'day'를 이용하면…….

SQL> select TRUNC(SYSDATE,'day') from dual;

TRUNC(SY
--------
05-02-13
리스트 4 이번 주의 주처음의 날을 취득

 

이러한 방법으로 간단하게 주의 처음의 날을 취득할 수 있습니다. 물론 SYSDATE 함수 대신에, SYSTIMESTAMP 함수를 사용할 수도 있습니다.다만, DATE형으로 변환되는 것은 기억해 둘 필요가 있습니다.

날짜 데이터로 TRUNC 함수를 사용하는 경우, 제2 인수에는'day'외에도 몇개인가 지정할 수 있습니다.메뉴얼을 확인하삼!!

 

TRUNC 함수를 사용한 샘플 SQL를  1개들어 둡니다.제목은 「이번 달의 제n○요일을 취득한다」

select decode(TRUNC(get_date,'mm'),TRUNC(SYSDATE,'mm'),get_date,null)
from (
select decode(TRUNC(TRUNC(TRUNC(SYSDATE,'mm'),'day') + :youbi -1,'mm')
             ,TRUNC(SYSDATE,'mm')
             ,TRUNC(TRUNC(SYSDATE,'mm'),'day') + :youbi -1
             ,TRUNC(TRUNC(SYSDATE,'mm'),'day') + :youbi -1 + 7)
      + (:nambanme - 1) * 7 get_date
from dual)
리스트 5 이번 달의 제n○요일을 취득한다

 

- sysdate = 19950725

-  round(sysdate, 'month') -> 19950801

-  round(sysdate,'year') -> 19960101

-  trunc(sysdate, 'month') -> 1950701

-  trunc(sysdate, 'year') -> 19950101

 

- 형식

 scc , cc : 세기 표현

 year : 년도를 영어로 표현

yyyy, yyy, yy, y : 년도를 자릿수로 자른다

bc, ad : 서기 등으로 표시

q : 분기 표시

mm : 두자리로 월표시

month: 영어로 표시

mon: 영어로 3자리로 월표시

rm: 로마자로 표시 i, ii. xi

ww: 1년기준 몇째주 표시

w:한달기준 몇째주 표시

ddd: 365(1년기준 ) 의 몇째 일

dd: 날짜를 두자리로 표시

d: 요일을 숫자로 표시

dy : 요일 한자리로 표시

day: 요일 표시

am, pm, a.m. , p.m. : 오전오후 표시

hh, hh12 : 12시 기준으로 표시

hh24 : 24시 기준으로 표시

/, "of" : 날짜의 중간에 문자 표시 -> to_char(to_date('19951201', 'yyyymmdd'),'yyyy "of" mm/dd')

spth : 날짜를 영문 서수로 표시

sp : 날짜를 영문 숫자로 표시

Posted by 서오석
,

원본글 바로가기


tomcat6를 처음 설치하면(압축풀면)  webapps 폴더 안에 웹페이지에서 디플로이를 관리할 수 있는

host-manager, manager 등이 디폴트로 설치되어 있다. 하지만 이것은 보안적인 측면에서 위배되므로

보통 다 지우는 게 좋다.

하지만 이것을 그냥 지우게 되면

Error Message

심각: Error starting static Resources
java.lang.IllegalArgumentException: Document base /home/msp_solution/web/tomcat/webapps/host-manager does not exist or is not a readable directory

이와 같은 에러를 만나게 된다.

Solution

conf\Catalina\localhost 밑에 context명.xml으로 생성하면, tomcat은 \webapps\context를 docBase 경로로 판단하고 찾는다. 그래서 서버 구동시 위와 같은 에러를 발생시킨다.
아래 xml들을 찾아서 삭제해주면 에러는 발생하지 않는다.

conf\Catalina\localhost\host-manager.xml
conf\Catalina\localhost\manager.xml

Posted by 서오석
,


1.1.1.1 -> 2.2.2.2 로 rcp를 쓰고 싶은 경우..


  1. 2.2.2.2 서버 로그인
  2. /etc/hosts.allow 파일에 rsh.d , rlogin.d 에 1.1.1.1 주소 추가
  3. 로그인 없이 사용하기 위해서는 /etc/hosts.equiv 파일에 1.1.1.1 {계정} 추가 
  4. /etc/xinetd.d 아래 rlogin, rsh 파일에서 disable = no 로 설정 
  5. /etc/init.d/xinetd restart 


Posted by 서오석
,

리눅스에서 date  명령어로 시간을 치면 가끔 다른 시간이 나오는데 이걸 동기화 하는 방법이다.

 

권한은 root에서 가능하다.

 

]$ rdate -s time.bora.net && hwclock -w

 

'서버 이야기 > Linux 이야기' 카테고리의 다른 글

리눅스 history에 시간남기기  (0) 2013.01.23
rcp 서버 설정하기.  (0) 2012.10.24
No space left on device  (0) 2012.06.28
Date 명령어 사용  (0) 2011.02.16
VI에서 인코딩 변환해서 보기  (0) 2010.12.02
Posted by 서오석
,

Oracle 에서
nvl 함수도 있고
decode 함수도 있다.
decode 함수를 자주 쓰다보면 case when then end 함수를 쓸 때
힘들어 하는 경우가 있다.

그러니 decode도 쓰고 case when then end 함수도 번갈아 쓰는것이 좋을듯하다.

mysql 에서는
nvl 함수 대신 COALESCE 함수가 있다.
ifnull은 인자갯수가 정해져 있다면 COALESCE 는 계속 넣을수 있다.

nullif 함수는 인자 두개가 같으면 null을 그렇지 않으면 첫번째 인자를 리턴하는 함수다.

equal null else if first 의 약자로 봐야 하나.

elt 함수는 첫번째 인자가 숫자고 리턴형이 스트링이며

field 함수는 첫번째 인자는 스트링이고 리턴형은 숫자형이다.

해당사항이 없으면 null을 리턴한다.

elt는 리턴형이 스트링이므로 해당사항이 없을 경우 null을 리턴하고

field 함수는 리턴형이 해당사항없을 경우 0이 리턴된다.

case when then end 를 쓸때
비교선행자를 case와 when 사이에 두는 경우
decode와 사용 용도가 동일하며
case 와 when 사이에 공백이 있을 경우 when then 사이에 조건문이 온다.

decode(qq,'1','a','2','b');
인경우 qq의 값이 해당사항이 없으면 마지막 'b'로 설정됨에 유의 한다.

case [?] when [?] then (when then ... ) (else) end 이다.

COALESCE /쿄'[올|얼]레'(쓰)/ : 하나로되다, 합체하다., 아물어 붙다 의 뜻

case [A] when [B1] then (when [B2] then ...) (else) end 문을 이용하면

A에 값을 놓아 switch case문으로 이용 가능 하고 [A]를 비워두는 경우

B부분을 조건절로 두어 if esle문으로 이용가능하다.

[출처] Mysql 함수 COALESCE|작성자 붐업

Posted by 서오석
,

출처 : http://blog.daum.net/99445015/25

 

[oracle@localhost /usr/lib/oracle/xe]$ sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on Fri Jun 26 09:54:24 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.

SQL> conn MONITOR/ahffk1029;
Connected.

SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
CPU_USER TABLE
GRAPH TABLE
HOSTINFO TABLE
PLAN_TABLE TABLE
SERVERINFO TABLE
SESSION_USER TABLE
TTT TABLE
BIN$bSXyAHGW3yzgQAB/AQAoOQ==$0 TABLE
CONNECTINFO TABLE
ALERTINFO TABLE

10 rows selected.

SQL> drop table 'BIN$bSXyAHGW3yzgQAB/AQAoOQ==$0'
2 ;
drop table 'BIN$bSXyAHGW3yzgQAB/AQAoOQ==$0'
*
ERROR at line 1:
ORA-00903: invalid table name

SQL> drop table 'BIN$bSXyAHGW3yzgQAB/AQAoOQ==$0' cascade constraints
2 ;
drop table 'BIN$bSXyAHGW3yzgQAB/AQAoOQ==$0' cascade constraints
*
ERROR at line 1:
ORA-00903: invalid table name

SQL> drop table 'BIN*'
; 2
drop table 'BIN*'
*
ERROR at line 1:
ORA-00903: invalid table name

SQL> purge recyclebin;
Recyclebin purged.

SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
CPU_USER TABLE
GRAPH TABLE
HOSTINFO TABLE
PLAN_TABLE TABLE
SERVERINFO TABLE
SESSION_USER TABLE
TTT TABLE
CONNECTINFO TABLE
ALERTINFO TABLE

9 rows selected.

SQL>

위의 실습을 보듯 Oracle 10G에는 휴지통 기능이 있다.

휴지통의 데이터 테이블은 'BIN$bSXyAHGW3yzgQAB/AQAoOQ==$0' 이다.

SQL> purge recyclebin => 이부분은 휴지통 비우기 명령어 이다.

휴지통(Recycle Bin)
오라클이 10g에서 새롭게 추가한 '휴지통' 이라는 기능.
테이블을 DROP 하더라도 언제던지 복원할 수 있게 하고자 하는 것이고요,
윈도우의 휴지통과 같다고 보시면 됩니다.

휴지통에 들은 테이블을 조회.
SQL> show recyclebin;

휴지통의 모든 내용이 비워집니다.
SQL> purge recyclebin;

삭제된 테이블을 되살리고 싶다면
SQL> flashback table 테이블명 to before drop;

만약, 특정 테이블을 휴지통에 남기지 않고 모두 삭제하려면..
SQL> drop table 테이블명 purge;

purge문 없이 그냥 drop 한 후에는
SQL> purge table 테이블명;

Posted by 서오석
,

디스크 용량이 어느정도 있는데도 불구하고 No space left on device 가 뜰 때가 있다.

 

이때는 i-node에 용량이 남아있는지 확인하기 위하여 df -i로 확인을 해야한다.

 

원인은  spool에 뭔가가 많아서 그런 것인데 해당 내용을 지우면 해결된다.

 

/var/spool/mqueue

/var/spool/clientmqueue

 

여기 안에 있는 내용을 지우자.

 

find . -ctime +0 -exec rm -f {} \;

 

 

'서버 이야기 > Linux 이야기' 카테고리의 다른 글

rcp 서버 설정하기.  (0) 2012.10.24
리눅스 시간 동기화  (0) 2012.09.05
Date 명령어 사용  (0) 2011.02.16
VI에서 인코딩 변환해서 보기  (0) 2010.12.02
Linux screen 사용하기  (0) 2010.11.30
Posted by 서오석
,

제주 다음스페이스 출장기.


이번에 프로젝트로 서울에서 일하지 않고 제주에서 한달간 일을 하게 되었다. 

그래서 제주로 오게 되었는데 옛날 GMC도 좋았지만 

이번에 새로 건축한 다음스페이스도 참 마음에 들어서 간단한 사진을 올린다.

개인적으로.. 대한민국에서 이정도 퀄리티의 사무실이 있을까 싶을 정도로 사무실이 쾌적하다.

좌측 창문 뒤에는 식당이고 요긴 사무실하고 식당 사이 쉽터 같은 곳이다.



요기는 위에 사진 반대편 부분. 저기 위층은 사무실인데 창문 쪽으로 쉴 수 있도록 테이블이 있다.



요긴 점심시간에 놀 수 있는 놀이방(?)같은 곳이다. 

포켓볼 대, 탁구대, 플스랑 액박이랑 키넥트도 있다. 무슨 보드게임같은 것도 있고 꽤나 넓다.

점심먹고 위닝 좋아하는 사람들은 여기서 위닝을 한다.




요긴 복도이다. 여느 복도랑 좀 다른 건 아래 같은 그림들이 있다.



아 그리고 계단 안에도 화장실이 있다.

계단 맨 아래 층에 보면 공간이 좀 남는 부분이 있는데 그 부분을 저렇게 인테리어로 해놨다.

꽤나 멋지다고 생각된다.




여긴 회사 내에 있는 도서관이다. 

개인적으로 무지 맘에 드는 곳인데 마치 외국 도서관에 있는 느낌이다. 

아직 책들이 그냥 박스채 쌓여 있어서 지금은 책이 좀 부족한 편이지만 박스에 쌓여 있는 책을 다 꺼내면

꽤나 멋진 도서관이 될 것 같다.



요긴 회사 밖 일부분인데 뭐 별건 없다..ㅎ; 


사무실은 이런 형태로 만들어져 있다. 

천장이 무지 높다. 한.. 2층 정도 되는 높이를 천장으로 모두 썼다.

창의성은 천장이 높은데서 많이 나온다고 해서 천장을 높게 했나보다.


여긴 지금 내가 사용하는 회의실.

난 맨발로 일하는 걸 좋아하는데 여기 바닥에 인조잔디가 깔려 있어서 너무 좋다.ㅎㅎ 


여긴 밖에 미니 골프연습장이라는데 난 골프를 안치니까 패스~

일단 오늘은 플젝으로 인해 급해서 대충 사진을 찍었는데 다른 곳도 있다.

이 블로그를 보고 다음스페이스에 궁금했던 사람들이 있다면 조금은 해소 되었으리라 생각된다..ㅎ

출장은.. 아직 3주 더 남았으니..-0-;


'사는 이야기 > 5dols story' 카테고리의 다른 글

겨울 아침엔 늘...  (0) 2009.04.06
아침이란..;  (0) 2009.02.17
모닝콜  (0) 2009.02.17
군대가는 녀석  (0) 2009.02.17
우리 엄마  (0) 2009.02.17
Posted by 서오석
,