노무현 전 대통령 서거 - 삼가 고인의 명복을 빕니다
사이버 100만 비석리본 달기 캠페인

메모리에 남아있는 파일 handle 죽이기

종종 특정 폴더를 삭제 하려고 할 때에 삭제 할 수 없다는 메시지가 나온다. 이럴 경우에 보통은 해당 파일을 다른 application에서 사용하고 있어서 삭제가 불가능한 경우도 있지만, 분명히 모든 application을 종료 했는데도 삭제가 불가능한 경우가 있다. 이럴 때 최고의 선택은 역시 리부팅~~. 하지만 서버 상에서 이런 파일이 남아 있다던가 하면 리부팅은 좀 힘들고 다른 방법을 찾아야한다.

일단 수동으로 사용자가 직접 삭제를 하거나 그럴 경우에는 copylock(http://file.naver.com/pc/view.html?fnum=76052&cat=34)이라는 프로그램을 추천한다. 이 프로그램으로 해당 핸들을 날리면 리부팅을 하지 않아도 삭제가 가능하다. 바이러스 문제라든가 이미 날아간 핸들을 가지고 있는 드문 경우는 결국 리부팅을 해야겠지만..

리부팅를 해서도 않되고 자동으로 해당 핸들을 딱 날려주는 것을 만드려면 아래의 방법을 사용해야한다. 일단 MS에서 제공하는 아래의 프로그램을 다운 받아야한다(http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx) Handle이라는 commandline tool인데, 간단하면서도 확실하게 메모리 뒤져서 해당 파일을 삭제 시켜주는데, command line tool이라서 그리 친절하지가 않다. 참고적으로 친절한 UI를 제공하는 tool은 Process Explorer라고 비슷한 위치에서 다운 받을 수 있다.(http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx)

handle의 자세한 사용법은 위의 주소에 영어로 나와있어서(^^;), 천천히 읽어보면 그리 어렵지는 않고, 여기서는 바로 사용법과 내가 사용했던 예제를 보여줘서 서버 등의 경우에 어떤 process를 자동으로 죽여주는 방법을 보여주겠다. 일단 handle의 아래 command를 사용하면 해당 파일에 현재 winodows 메모리 상에 있는 process들이 소유하고 있는 handle의 리스트가 나온다

 

handle -a >result.txt


위의 그림과 같이 한번은 Agree를 해줘야하는데, 한번만 해주면 다시는 않뜨니 Agree 해주고 결과를 보면,



대략 위와 같은 파일이 만들어 졌을 것이다. Process Explorer를 보면 GUI가 지원되어서 현재 Process 들이 내 PC에서 무슨 일을 하는지 dynamic하게 볼 수가 있지만, 사용자가 수작업으로 지워져야하므로 반복되는 루틴에는 handle을 사용하는 편이 낫다. 아무튼 위의 파일을 해석을 하자면, pid라는게 있어서, 어떤 process인지 process ID가 있고, 해당 process가 점유하고 있는 자원들의 리스트가 나오는데, 좌측의 16진수가 handle의 ID 값이다.

이 두개의 값을 이용해서 해당 파일의 process를 날릴 수가 있다. 사실 두개를 "꼭" 알아야지만 날릴수가 있다. 일반적인 파일 이름 가지고는 handle에서 해당 파일의 핸들을 날릴 수 있는 UI를 제공하지 않는다. 그래서 hadle로 위와 같이 result.txt에 현재 process의 상태를 저장 해 놓은 다음에, result.txt에서 원하는 파일의 pid 값과 handle id 값을 가져와야지만 원하는 작업을 할 수가 있다. 여기서는 이를 하기 위해서 마법의~ vb script를 사용하였다.

저 밑에 아래의 vbs 소스는 실제 지금 사용중인 소스를 추려 놓은 것인데, 원리는 간단하다. result.txt 파일을 읽어와서 파일 이름을 검색한다. 원하는 파일이 있을 경우 해당 파일의 pid 값과 handle id 값을 배열에 저장 해 놓았다가, handle command로 해당 파일을 날려버리는 것이다. 파일의 handle을 날릴 경우의 handle command 사용법은 아래와 같다

 

  

  handle -p 프로세스아이디 -c  파일핸들아이디 -y


 

-p로 프로세스 아이디를 명시하고, -c로 핸들의 아이디를 명시한다. -y의 경우는 무조건 yes라고 지정해 주어서, 혹시나 뭐 물어볼 경우에도 자동으로 해당 command를 끝내기 위한 것이다.


 

Dim toKill(18)
toKill(0) = "AAA.dll"
toKill(1) = "BBB.dll"
..........................
toKill(17) = "\Source"    '폴더가 통째로 남아 있는 경우도 있다.

Sub Sleep_Second(intSeconds)    ' 특정 시간(초단위) wait 하는 함수
 dteStart = Time()
 dteEnd = DateAdd("s", intSeconds, dteStart)
 
 While dteEnd > Time()
  DoNothing
 Wend
End Sub
 
Sub DoNothing
 'While/Wend has quirks when it is empty
End Sub


Function stringCompare(target)    ' 결과파일(result.txt) 내에서 삭제하려는 파일이 있는지 string 비교
 Dim i, isFound

 isFound = false
 for i = 0 to 17
  if len(target) >= len(toKill(i)) then
   if right(target,len(toKill(i))) = toKill(i) then
    isFound = true
    stringCompare = len(toKill(i))
    exit for
   end if
  end if
 next
 
 if not isFound then
  stringCompare = 0 'not Found
 end if
end Function

'-------------------------------------------------------------------------------
' Kill Process
'-------------------------------------------------------------------------------
Dim strHandleURL, strHandleprefix, count, i, compareResult
Dim strResultAddress(20)

 

strHandleURL = "c:\handle.txt"
strDeleteHandleURL = "c:\deletehandle.bat"

Set Shell = CreateObject("WScript.Shell")

ReturnCode = Shell.Run("cmd /c " + strDeleteHandleURL)    ' c:\handle.txt 파일을 삭제하는 batch 파일이다. 삭제를 안해도 큰 상관없이 계속 덮이 씌우는 것 같다.
strCommand = "cmd /c handle -a > " + strHandleURL    '실제 handle command로 현재 process 상태를 저장
ReturnCode = Shell.Run(strCommand)

Sleep_Second(2)    ' 2초간 waiting


Set fs = CreateObject("Scripting.FileSystemObject")
if fs.fileExists(strHandleURL) then
 Set objFileInput = fs.OpenTextFile(strHandleURL,1)
 count = 1
 
 Do While objFileInput.AtEndOfStream = false
  strTemp = objFileInput.readLine
  strTemp = trim(strTemp)
  compareResult = stringCompare(strTemp)
  if compareResult > 0 then
   strResultAddress(count) = CStr(left(strTemp,5))
   count = count + 1
  end if
 loop
 
 for i = 1 to (count -1)    ' 발견된 핸들 날리기, process ID는 따로 검색하지 않았다. 4는 system, 2348은 explorer이다.
  strCommand = "cmd /c handle -p 4 -c " + trim(strResultAddress(i)) + " -y"
  ReturnCode = Shell.Run(strCommand)
 
  strCommand = "cmd /c handle -p 2348 -c " + trim(strResultAddress(i)) + " -y"
  ReturnCode = Shell.Run(strCommand)
 next
end if

Sleep_Second(1)


'-------------------------------------------------------------------------------
' 종료
'-------------------------------------------------------------------------------
set Shell = nothing
set fs = nothing


설명이 몇가지 빠진 부분이있는데, 이 스크립트에서는 result,txt를 처음에 무조건 지워준다. 않지워도 잘 돌아가는 것 같지만 깔끔하게 하려고 지워준다. 그리고 toKill이라는 배열에다가 핸들을 날려버릴 파일 명을 적어 놨다. 그리고 process ID 같은 경우가 좀 어려운 경우인데, 여기 case에서는 system(PID:4)과 explorer(PID:2348)에 해당되는 파일만 날려주어서 위와 같이 hard coding 하였는데, 다른 process에서도 문제가 있을 경우는 해당 프로세스를 추가 해야 할 것이다.(PID가 고정이라는 가정아래.. 아니면 PID를 찾는 루틴도 추가 해야 할 것이다)

조금 소스가 지저분 할 수도 있지만(^^;), 대략적인 flow를 보면 그리 어렵지 않기 때문에 더이상의 detail한 설명은 생략하고, 이런식으로 자동으로 핸들을 없애주는 스크립트를 만들어서 서버 상에서 scheduler 등에 걸어주면 주기적으로 메모리를 깔끔하게 청소를 해주어서, 다른 작업에 영향을 미치는(종종 뻑나게 만드는) 현상을 많이 줄일 수 있을 것이다.

by 루디 | 2009/06/28 09:34 | Programming | 트랙백 | 덧글(0)

task 죽이기

windows에서 의외로 간단한 Task 죽이기 방법이 있어서 놀랬다. 이렇게 간단할 줄이야~

command line에다가 taskkill /?를 쳐보면 간단히 사용법이 나온다


뭐 대략 remote task까지 죽일 수 있다는데, 3번째 예제를 보면 간단히 notepad.exe를 죽이는 예제가 나온다.

taskkill /F /IM notepad.exe 를 하면 notepad.exe가 죽는데, /F는 force 의 약자여서 강제 종료를 시켜준다. batch 파일같은거 만들때 맘에 않드는 프로세스를 죽이면 될듯

참고로 VB나 vbscipt 등에서는 shell로 command 작성할때 아래와 같이 하면 더 잘 먹는거 같다

cmd.exe /C taskkill /F /IM WIPIEmulator.exe /IM Auto" "Clicker" "Typer.exe

"cmd.exe /C" 를 않쓰고도 먹는 커맨드로 있는데 않먹는 커맨드도 좀 존재한다. 그리고 폴더 / 파일 이름에 스페이스가 존재 할 경우 위와 같이 큰따옴표를 쳐주면 된다.

서버 같은데에서 간단한 어플 돌렸다가 바로 죽일 때 사용하면 유용할듯

by 루디 | 2009/06/17 10:29 | Programming | 트랙백 | 덧글(2)

차세대 거포 나지완

1. 신인 4번 타자
난 나지완~ 쏴~~ 라는 외모만큼이나 독특한 응원가를 지닌 나지완의 프로 데뷔는 화려했다. 워낙 거포 없는 타선이라고는 하지만 그래도 무려 타이거즈의 신인 개막 4번타자. 홈런 10개만 쳐도 팀내 최고 거포 소리를 듣는 초리한 기아 타선이였지만 그래도 호랑이의 4번 타자라는 자리의 중압감은 그리 만만히 볼만한 것은 아니였다.
4번이라는 중책을 맡은 후에 실제 성적은 보잘 것 없었고, 않그래도 욕 많이 먹는 타이거즈 감독 자리에 욕을 한바가지 보태주는 역할을 했다. 하지만 그 때도 확실히 기억하는 것은 스윙은 시원 시원했다. 누가 뭐라든 4번 타자로써의 중압감이 스윙에 보이지는 않았다. 그래서 난 다시 돌아 올꺼라고 확신 했다.(사실 안습인 기아 타선이 별다른 대책이 없어서 ㅎㅎ)
아무튼 우리의 나지완은 프로 2년차가 되었고, 훌쩍 성장했다.

2. 2008년
2008년에서 1.5군정도로 활약한 나지완의 최종 타율은 .295였다. 사실 250정도일꺼라고 생각했는데, 생각보다는 정교한 타자였다. 4,5월에 말아먹은 것까지 생각하면 후반기에 3할 이상을 꾸준히 쳐주는 타자였다. 출루율 .391에 장타율 .455로 OPS .846으로 꽤나 수준급의 타자였다. OPS로 보면 기아 타자중에서 이재주, 장성호 다음으로 근소한 차이로 3위였다.
비록 홈런은 6개였지만(타석당 0.03개), 장성호가 293타수에 7개(타석당 0.0238), 이재주가 261타수에 12개(0.0459)인 것을 생각하면 거의 장성호급의 활약을 한 것이다. (타 팀과 비교 거부 ㅋ 안습 기아 타선 ㅠㅠ)
2008년의 기아 성적이 묻혀서 저평가 되어 있지만, 나지완은 이미 화려한 데뷔 시즌을 치뤘다.

사진 출처는 연합뉴스


3. 2009년 시즌 시작
신인으로써 성공적인 시즌을 치룬 나지완의 2009년은 2008년과 마찬가지로 부진으로 시작 되었다. 4월 타율 0.216을 찍고 74타석에서 삼진 21개나 당하는 선풍기 타법을 보여준 나지완을 계속 기용하는 것을 슬슬 의심하는 팬들도 생겼지만, 단순히 성적에 나오지 않는 그의 활용도와 이제 겨우 2년차인 신인으로써의 포텐셜을 나는 끝까지 믿었다.

4. 2009년 현재
현재 나지완의 성적은 타율 .242에 출루율이 무려 .352이다. 순수 출루율이 .110에 달한다. 이는 최희섭을 제외하고는 김상훈이 .110,  김원섭이 0.089, 홍세완이 0.092 정도로, 일반적인 인식보다 엄청 높은편이다.(사실 나도 지금 기록 보고 놀랐다) 그리고 장타율도 .427로 기아에서 최희섭, 김상현, 김원섭 다음으로 4위이고, OPS도 마찬가지로 4위이다. 홈런도 최희섭을 제외하고는 나지완 10개, 김상현 8개, 김상훈 8개로써 기아의 big bat 경쟁을 하고 있다.
선풍기나 돌리면서 가끔 로또로 운좋게 두자릿수 홈런을 치고 있는 선수는 확실히 나지완이 아니다. 32개의 볼넷으로, 최희섭을 제외하고는(희섭은 좀 특이한 상황이라서 왠만하면 제외 ㅎㅎ), 김원섭 32, 김상훈 28정도로써 좋은 선구안을 보여주고 있다.(하지만 삼진이 제일 많은건 사실 ㅎ)
이정도의 기록상의 성적을 보여주고 있어서 엔트리에서 거의 빠지지 않으면서 4번째로 많은 178타수를 출장하고 있어서, 타순빨로 많이 나오는 김원섭과 이종범 그리고 홈런왕(한때)인 최희섭 다음이다.
그리고 기록상에서 보이지 않는 그의 역할은 기아 외야의 유일한 big bat이고(채종범 시즌 아웃. 최경환 고령??), 85년생 유망주이다. 그리고 3,4,5번을 받쳐주는 하위 타선의 유일한 홈런 뇌관이고(김상훈은 후반에 또 체력 문제 있을듯 ㅎ), 여차하면 바로 중심타선으로 올라올 "차세대 거포"이다

5. 나지완의 역할
나지완이 .350에 장타율 .550 홈런 30개를 치면 물론 좋겠지만, 현재 기아 타선에서 그의 역할은 big bat이다. 다소 정교함을 버리더라도 쉽게 승부를 못거는 하위타선으로 대포가 한방 있음을 확실하게 각인 시키면 현재 기아 타선이 확실하게 강력해진다(최희섭의 시즌초 비슷한 정도 모습은 필수)
이런 모습을 확실히 보여준 것이 오늘 경기 였고, 최근 경기에서 비록 정교한 타격을 보여주지는 못하지만 그의 풀 스윙이 그리 미워보이지 않는 것은 분명 그것이 나지완의 역할이라고 생각하기 때문이다.

6. 마무리
2년차 나지완에게 작년정도의 OPS를 바라지는 않는다. 올해 1년 꾸준히 출장해서 20개의 홈런정도에 .250정도의 타율을 치더라도 끝까지 투수를 노려보고 큰거 한방 기다리는 스윙을 계속 해주기를 바란다. 그리고 2년 후쯤에는 홈런왕 경쟁에 당당히 이름을 올리고 다시 한번 기아의 4번타자로 복귀 하기를 바란다. 난~나지완 쏴~~~!
이글루스 가든 - 한국 프로야구를 좋아하는 이글루人!

by 루디 | 2009/06/13 01:09 | Baseball | 트랙백 | 덧글(2)

Pure Sleep function for VB Script

Sub Sleep(intSeconds) 
    dteStart = Time() 
    dteEnd = DateAdd("s", intSeconds, dteStart)  

    While dteEnd > Time() 
        DoNothing 
    Wend
End Sub 

Sub DoNothing 
    'While/Wend has quirks when it is empty
End
Sub



간단하지만 잘 먹히는 VB Script용 Sleep function참고로 보통 VB에서 쓰는 Sleep은 win32 API 가져와야하고(vbscript에서는 불가능, VB는 가능)
WScript.Shell의 Sleep function은 Vbscript에서는 먹히지 않음(이유는 모르겠음)
속도는 크게 신경 쓰면 않됨~! vbsciprt 쓰면서 성능 문제는 일단 포기 ㅎㅎ

by 루디 | 2009/06/11 15:18 | Programming | 트랙백 | 덧글(0)

오세훈 "비정치.비폭력 행사가 보장되면 광장 개방을 정부에 건의하겠다"

오세훈 "비정치.비폭력 행사가 보장되면 광장 개방을 정부에 건의하겠다"

일단 "비폭력"은 너무 당연한거니까 빼면

"비정치 행사가 보장되면 광장 개방을 정부에 건의하겠다"

여기서 두가지 포인트


1. 비정치 행사
대만민국 사람은 정치적인 행사를 행사면 않되는 것인가? 정치적인 행사를 하면 끌려가는 나라~ 아아 대한민국


2. 정부에 건의
서울 광장 개방이 정부에 건의를 해야만 하는 것인가? 오세훈은 그냥 허수아비일뿐? 행사 하나 열어주는 정부의 승인(이라고 쓰고 어명이라고 읽음)이 있어야만 가능한 것인지? 그럼 HID도 정부 승인(어명이라고 읽음)이 있어서 열어주셨나요?


암튼 딴나라당의 뇌구조는 너무 뻔히 보인다.

by 루디 | 2009/05/27 12:56 | Life | 트랙백 | 덧글(4)

이 분이 그렇게 무서웠습니까?


이명박 대통령님..

이 분이 그렇게 무서웠습니까? 대통령직 끝나고 바로 낙향해서 고향에서 평온한 삶을 사시는 이 분이 그렇게 무서웠습니까?

자기 뒤 구린거는 생각도 안하고, 이 분만 뭉개버리면 자기가 뭐 신이라도 되고 지지율이라도 오를꺼라고 생각했습니까?

대한민국 사람들이 우스워보이죠? 그냥 대충 좀 누르면 찍 소리 못하고 벌벌 떠는놈들로만 보이죠? 언론 조작해서 소문 몇 개 흘리면 다들 믿고 당신을 찬양 해 줄꺼라고 생각했죠?

착각하지 말고, 당신의 인생이 어떻게 끝나나 똑똑히 지켜보시지요.

대한민국 국민들 그렇게 만만한 사람 아닙니다. 무려 당신들이 학벌 낮고 기반 없다는 그 노무현 대통령을 만든 바로 그 국민들입니다. 사리분별 확실하고, 할 때는 확실히 하는 국민들입니다.

아무리 열심히 은폐하고, 거짓으로 둘러쳐도 알만한 사람은 다 압니다.

끝까지 해봅시다. 우리는 쉽게 포기안합니다. 어떻게 얻은 민주주의인데요. 눌러도 눌러도 튀어나오는게 대한민국입니다.

누가 더 질기나 해봅시다. 오늘 우리 눈에 흐른 피 눈물 평생 잊지 않을 껍니다.

by 루디 | 2009/05/23 22:41 | Life | 트랙백 | 덧글(0)

노무현 전직 대통령 서거 tv 방송 차이점(10:43 ~ 10:57)

10:43분

MBC는 열심히 긴급 뉴스 편성해서 열심히 보도 해 주고 있는데, SBS는 꿈쩍도 않하네요.

MBC는 노무현 전 대통령 사망 -> 노무현 전 대통령 서거 로 바꿨고, KBS는 노무현 사망 -> 노무현 전 대통령 사망으로 바꿨네요

KBS는 유서 발견 사실도 모르고(네이트온 긴급 속보도 떴는데), MBC가 네이트온 보다 훨씬 빨리 보도해서, 자살 판명 바로 해줬습니다.

10:44분

KBS도 서거로 바꿨네요. SBS는 잘먹고 잘살자던가 암튼 정규 방송 열심히 하고 있네요. 웰빙 스타 베스트5인가..

SBS는 자막 처리만 하는중. 이명박 대통령이 이 사건에 대해서 어떻게 하고 있나 위주로 나오네요 ㅡㅡ;;

10:50분

SBS는 아직도 "사망"이라고 내고 있습니다. 이명박 대통령, 검찰 위주로 자막 뿌려주네요

10:53분

MBC 유서 유무 확실하게 확인 되지는 않았다고 합니다.

10:57분

MBC 유서 발견 공식 확인 했습니다.

by 루디 | 2009/05/23 10:46 | Life | 트랙백 | 덧글(2)

직장인들의 재테크 친구 저축 은행

1. 서론
재테크 하는 방법에는 여러가지가 있지만, 나는 개인적으로 저축 은행을 가장 많이 사용한다. 주식형 펀드나 직접 투자도 하는 편이지만, 주식 관련 수단에는 본업을 소홀히 해가면서 신경을 써야하는 부분이 있어서, 특별히 딱 기회라는 생각이 않들면(주가 1000 언저리라거나 그런 확실한 기회), 1년정도 적당한 이자를 주면서 "지지 않는 게임"을 할 수 있는 저축 은행을 선호한다.

멀리 갈 것도 없고, 거창하게 말 할 것도 없이 내 주위만 보아도 펀드로 돈 벌었다면 펀드에 돈 넣고, 펀드가 않좋으면 펀드 돈 빼서 은행에 넣고를 반복하는 사람이 많아서, 기초 지식을 쌓기 위해서 저축 은행이 무엇인지, 왜 서민들은 이 것을 이용해야 하는지를 한번 정리 해 놓으면 좋을 것 같다는 생각에서 이 글을 작성 해 본다.

이 글을 읽기 위한 전제 조건을 하나 말하자면, 완벽한 재테크 수단은 없고, 어느 누구도 가르쳐 줄 수는 없지만, 각각의 수단의 장단점이 무엇이고,  어떻게 사용해야 하는지를 알아야 최적의 순간에 각각의 수단을 사용 할 수 있을 것이다. 한마디로 공부 많이 해야한다.

2. 은행 vs 저축은행
은행이라는 재테크 수단은 너무나 잘 알 것이다. 그럼 은행과 저축은행의 차이점은 검색만 해 보아도 많이 나오고, 여기까지는 사람들이 많이 알고 있어서 차이점만 간단히 소개하고 넘어 가겠다.

저축은행은 일단 은행보다 금리가 높다. 보통 1%이상은 높고, 심할 경우에는 3~4%까지도 높은 경우도 많다. 반면에 영업점이 보통 1~2개, 많아야 3~4개여서 상당히 불편하다. 적은 영업점으로 인해서 특히 일시적으로 금리가 높은 저축은행의 경우는 가서 30분 이상 기다릴 확률도 많다. 인터넷 뱅킹을 지원 안하는 곳도 많아서 대부분 직접 방문 한다고 생각하는게 편하고, 이자 포함 5000만원까지만 예금자 보호가 되므로, 그 이상의 돈을 맡길 경우에는 좀 리스크가 크다.

한마디로 요약하면 높은 금리에 비해서 안고 가야할 리스크과 불편함이 있다. 불편함은 예측 가능한 부분이지만, 이 리스크가 아무 정보 없는 사람한테는 크게 느껴 질 것이다. 이제부터 본론인 이 리스크를 한번 분석 해 보겠다

3. 저축은행이 하는 일
리스크를 알아보기 위해서 제일 먼저 저축은행이 뭐하는 곳인지를 알아야한다. 재테크 하는 입장에서 저축은행을 간단히 설명하면, 일반인으로 부터 예금을 받아서 그 예금으로 대출을 하는 은행이다. 보통 일반 은행에서 대출이 꽉차면 저축은행 그 다음은 대부업체 순으로 간다.

저축은행의 영업 구조는 일반인한테 예금을 받아서 그 돈으로 대출을 해 주고 중간 마진을 먹는다. 물론 대출 리스크도 감당하고, 이율은 CD금리를 기초로 알아서 정한다. 예금이자를 2%, 대출이자를 50%하면 이익은 극대화 하겠지만, 손님은 거의 없을 것이고, 예금이자 5% 대출 6%로 하면 박리다매를 해야하고, 대출 한두개 뻑나면 회사 문 닫을 일도 생길 것이다.

저축은행이 주로 돈을 빌려주는 곳은 부동산 관련과 서민 대출, 기업 자금 대출인데, 특히나 부동산 관련 대출(프로젝트 파이넨싱)에다가 무리할 정도로 대출을 해줘서 은행 망할 뻔 했고, 욕 많이 먹었다. 정부 까는 포스팅이 아니여서 대충 넘어가겠지만 MB가 여기다가도 돈 부어놨다. 서민을 살리기 위함이 아닌 부동산을 살리기 위함이었다.

정리하면, 저축은행은 은행보다 높은 금리로 돈 끌어 모아서, 여기 저기 대출 해주고 그 중간 금리 차이로 먹고 사는 은행이다. 은행이 CD 금리에만 연동해서 금리를 변경하는 반면에, 저축은행은 영업 뛰는거 봐가면서 금리를 조정해서, 금리가 매우 자주 바뀐다.

4. 금리 비교
저축은행을 사용하는 이유는 당연히 높은 금리 혹은 은행 아가씨가 예뻐서이다. 위에 잠깐 언급 했듯이 금리가 하루 단위로 변하기 때문에 항상 금리 변동을 봐야하고, 당연히 높은 금리의 저축은행을 이용해야한다. 은행 이자에 0.5%정도 더 받자고 멀리 가서 계좌 만들고 돈 찾으러 또 그 거리를 이동할 필요는 없다고 본다. 적어도 1% 이상의 금리를 바라보고 저축은행을 가는게 정석이라고 본다.

실제 금리를 비교할 사이트는 매우 많이 있어서 몇개만 소개하자면,

상호저축은행 중앙회 홈피 : http://www.fsb.or.kr/
야후 재테크 : http://kr.finance.yahoo.com/bank/ratecompare/GoodsMgr.html?act=pdt_01&menu=01&pdt_kind=&saving_amt=10000000&join_term=1Y&f_kind=ETC

야후 금융 사이트

이외에도 많은 재테크 사이트들이 금리를 비교해 줄 것이지만, 도장 들고 출발하기 전에 은행 사이트 직접 들어가서 금리 비교는 꼭 하고가는게 정신 건강에 이롭다. 금리를 낮추고는 이런 사이트에 통보 안하는 경우도 있을 수가 있는데(아직까지 경험 해 본적은 없다), 직접 가서 낮아진 금리를 보고 허무해 하는 것보다는, 한번 더 확인하는게 좋을 것이다.

그러면 이 사이트에서 무조건 최고 금리를 제공하는 저축은행을 선택하는게 정답일까? 서론에서도 얘기 했지만 정답은 없다. 참고로 지난번 PF 대출관련해서 저축은행들 망한다고 한참 기사 떴을때, 정기예금 하나를 들어야 했었는데, 많이 고심하다가 적당한 은행을 택했다. 최고 금리보다는 1% 정도 낮았지만, 그 최고 금리를 주는 곳은 은행의 영업 상황이 완전 막장이여서 아무리 예금자 보호가 된다고 해도 이건 아니다 싶었다. 그래서 결론은 그 막장 은행 잘 버티고 있다. 앞으로 어떻게 될지는 모르겠지만 꽤 큰 위기는 넘긴거라고 판명된다. 나의 선택이 틀렸다고도 말 할 수 있지만, 비록 속은 좀 쓰리지만, 개인적으로 감당 할 수 없는 리스크는 버리는게 재테크 철칙이여서 좋은 판단이였다고 생각한다.

그러면 금리도 좋고, 은행 상태도 좋은 저축은행을 한번 골라보자

5. 고정이하여신비율, 위험가중자산에대한 자기 자본 비율
저축은행의 상태를 진단하기 위해서는 기본적으로 2개의 지표를 알아야한다. 말 자체에서 어느정도 뜻은 파악 되기는 하지만, 무슨 외계어 같은 2개의 지표이다.

고정이하여신비율은 은행에서 총 빌려준 대출 중에서 대출 등급이 "고정" 이하인 대출의 총 비율이다. 이 지표가 100%면 대출해준 모든 금액이 막장 상태라는 뜻이고, 0%면 착하고 말 잘 듣는 사람들에게만 돈을 빌려줬더니 다들 착실하게 갚고 있다는 뜻이다. 당연히 낮을 수록 우수한 은행이고 망할 가능성이 낮은 은행이다. 부연 설명 하면 "고정"이라는 등급은 (정상, 요주의, 고정, 회수의문, 대손)이라는 5등급 중에서 3등급에 해당하며, (정상, 요주의)를 제외한 등급을 "고정" 이하 등급이라고 불린다. 한마디로 문제가 있는 대출이다.

위험 가중자산에 대한 자기 자본 비율은 줄여서 BIS라고 불리우고, 위험한 자산에 비해서 은행이 가지고 있는 돈의 비율을 얘기한다. BIS가 100%면 1억을 빌려줬는데, 은행 자체의 자산이 1억이므로, 대출이 다 부도가 나더라도 예금자 돈 않 건드리고 은행돈으로만 자체적으로 해결 할 수 있다는 뜻이고, 1%면 대출 100억에 은행 자산 1억이므로, 대출이 좀만 뻑나도 어떻게 될지 모른다는 뜻이다. 당연히 높을 수록 안전한 은행이다.

위의 두가지 비율은 일반적인 기준으로 8% 이상/이하 인 은행을 안전한 은행이라고 부르고 있다. 즉 고정이하여신비율(막장대출비율)이 8%이하, BIS(대출대비은행자체자산비율)가 8%이상이 되면 안전한 은행이라고 한다. 이 두 지표 외에도 많은 지표가 있으나, 우리는 은행에 투자하려는 사람이 아닌 단순히 은행에 돈을 맡기고 이자를 받으려는 것이므로, 이정도 지표만 알면 되겠다.

이 두개의 지표 외에도 많은 지표를 검색 할수 있는 곳이 금융통계정보시스템 사이트(http://fisis.fss.or.kr/)이다.

위 사이트 좌측 하단에서 검색어를 넣는 곳에다가 원하는 저축은행 이름을 넣으면,

위와 같은 창이 뜨고 원하는 저축은행을 선택하면
activeX 몇개 설치 하고 나면, 이렇게 많은 "공식" 정보를 볼 수가 있다. 여기서 자본적정성을 선택하면 BIS 기준을 볼 수 있고, 여신건전성을 선택하면 고정이하 여신 비율을 볼 수가 있다.


솔로몬 저축은행의 고정이하여신비율을 한번 보면 2007년부터 2008년까지 4~6%대를 유지하고 있으므로, 광고와 비슷하게 꽤나 튼실한 은행임을 알 수가 있다. 이 지표들은 실제 각 은행 사이트에서도 공시를 하고 있으나, 여러 은행 비교시에는 이 사이트가 확실히 편하다

6. 마무리
은행, 저축은행, 부동산, 증권 정도가 사실 위험성/변동성이 점점 더 높아지는 재테크 수단이라고 볼 수 있다. 부동산, 증권쪽이 소위 대박 날 기회가 훨씬 많기는 하지만, 시골의사 말대로 "피비린내 나는 전쟁터"인 재테크 시장에서 남들보다 우위를 점하기는 왠만한 노력 가지고는 쉽지 않다.
은행보다 조금 더 높은 금리를 안전하게 얻기 위한 적절한 대안인 저축은행이라는 재테크 Method에 대해서 이해를 해 놓고 다른 수단과 적절하게 섞어서 사용하면, 이 전쟁터에서 조금 더 승리에 가까워 질 수 있을 것이다.


덧> 혹시나 하는 마음에 개인적으로 저축은행과 아무런 관련이 없습니다. 오픈 기념 치약 몇번 받은거 외에는 아무런 관련 없습니다. 요즘은 그 것도 잘 않주더군요
덧2> 재테크 밸리는 없군요.

by 루디 | 2009/05/09 08:52 | Money | 트랙백(1) | 덧글(0)

또 사람을 패는구나..


출처 오마이뉴스

더 말해 무엇하리..

사람 패지 않고는 유지조차 되지 않는 이 정권

또 패는구나.

니들에게 바라는 것은 정치적 이념이 아닌 인간으로써의 양심이다.

by 루디 | 2009/05/01 23:39 | Life | 트랙백 | 덧글(1)

WIPI-C Memory(SKT) 사용 방법

WIPIC의 폐쇄적인 운영때문에 메모리 관리에 대해서 여러가지 설이 난무한거 같다. 실제 검색을 해봐도 명확하게 어떻게 돌아간다는 것도 없고, 추측 + 사용경험기 정도.. 그래서 나름 정리를 한번 해봐야겠다. 나와 비교도 않되는 내공으로 잘 정리해 놓은 곳도 많이 있지만, 나름 내 시각으로 정리 해 놓으면 나한테도 도움이 될 것 같아서 일단 고고싱~

기준은 SKT Innoace WIPI-C로 하고, KTF, LGT쪽은 아직 잘 모르겠고, compaction이 일어난다는 얘기도 있고, 아무래도 개발자들이 SKT 보다는 숫자가 더 적어서 폐쇄적이여서 더더욱 추측이 난무하는 것 같다.(LGT가 제대로 지원 안 해주는 것도 있고)

일단 WIPIC에서 new, delete를 쓰면 폰이 바로 뻗는다. 심지어 C++을 쓰면 온전한 동작을 보장 못한다고 한다. free하고 malloc은 각각 WIPI 함수 MC_knlFree, MC_knlAlloc으로 대체가 되지만 일반적인 C spec 상으로 사용하면 에러난다.(여기서부터 슬슬 짜증이 나기 시작했었다 ㅎㅎ)

일단 천천히 한번 정리 해보자

1. alloc
C상에서의 alloc은 해당 메모리를 잡아주고는 그 메모리의 포인터를 넘겨주는 것이다. 뭐 WIPI도 마찬가지다. 개발자보고 직접 메모리를 잡으라고 하지는 않는다. 문제는 retrun값. C에서의 return 값은 void*로 메모리 주소 값을 그대로 넘겨준다. 하지만 불행히도 WIPI는 메모리 주소값을 개발자에게 그렇게 쉽게 넘겨 주지 않는다

포인터 변수 = (포인터캐스팅) MC_GETDPTR(MC_knlAlloc(메모리할당사이즈));



위의 코드를 보면, 실제 C에서 malloc 하는 것과 동일한 효과를 내는 wipic 함수 예를 보여준다. 일단 MC_knlAlloc이 하는 일은 메모리를 할당해 준다. 하지만 그 retrun 값이 메모리 주소 값이 아닌 WIPIC에서의 memory index 값이다. 즉 실제 alloc을 통해서 메모리번지 0x0000ff에다가 메모리를 할당 하였으면, C 함수의 경우는 0x0000ff를 return 하지만, 우리의 WIPIC 함수는 지들만 알아 볼 수 있는 0x000001을 return 한다. 실제 메모리 할당은 0x0000ff에 이루어 졌으므로, 0x000001을 return 받아서 포인터로 사용하게 되면, 엉뚱한 메모리를 접근 하므로 당연히 실행시에 에러가 난다.

WIPIC가 이러한 실제 메모리값이 아닌 지들만이 이해하는 값을 사용하는 이유는 일단 메모리 관리를 위해서이다. 사심 없이 그들이 주장하는 말을 그대로 인용하면, "제한된 embeded 환경에서 효율적인 메모리 관리를 위하여서 메모리 단편화를 줄이기 위한compaction을 위한 메모리 관리 시스템"이라고 한다. But SKT의 경우에는 compaction은 일어나지 않는다. 이 말에 100% 신뢰를 줄 수는 없지만, SKT 거의 모든 폰에 올라가는 모 프로그램을 만든 회사에서도 compaction을 고려하지 않고 만들었다.

이 부분이 좀 민감한 부분이라서 한번 더 정리하면, compaction이 일어나지 않는다고 어떠한 보장도 해주지 않는다. 하지만 대부분의 s/w가 그 부분을 고려하고 만들지를 않아서 믿고 개발해도 상관 없다.(하지만 스팩 상에는 분명 compaction은 일어나게 되어있다) 마지막으로 한번 더 강조하면 SKT WIPI-C에 대한 얘기이다.

결국 MC_knlAlloc에서는 할당한 메모리값이 아닌 WIPI_C에서 관리 하는 메모리ID 값을 넘겨주게 되고, 메모리ID 값에서부터 포인터 값(주소값)을 얻어 내는 함수가 바로 MC_GETDPRT이다. 그래서 위와 같이 메모리를 할당해야지 실제 포인터 값을 얻을 수 있다. 포인터를 얻은 이후에 포인터의 사용은 compaction이 일어나지 않는다고 전해하면 일반 C에서의 사용법과 동일하다

이정도의 개념을 가지지 않고 WIPI-C 프로그래밍하면 상당히 고생한다. 확실하게 이해하고 넘어가도록 하자

2. free
사실 free를 안할꺼면 위에 개념만으로 충분하다. 하지만 free 안하면 app은 초단위로 느려지게 되고, 나중에 뻑나고 문제 많다. 당연히 free 해야한다(가능하다면 memory leak 검사도 해야한다). 그럼 free는 뭘로 할까? C에서는 당연히 메모리 주소값(포인터값)으로 한다. 하지만 WIPIC는 메모리 주소값이 아닌, 메모리ID 값을 넘겨줘야 free가 된다.(여기서 또 좌절)

위에서 우리가 생성한 포인터에서는 주소값(0x0000ff)만이 들어가 있고 메모리ID(0x000001)값은 없다. 하지만 free를 하기위해서는 메모리ID값이 필요하므로, 위에서 alloc 할 때에 메모리ID값을 따로 저장했다가 free 할 경우에 해당 메모리ID 값으로 free를 하는 것이 정석이다.(MC_GETDPTR함수가 메모리ID 값을 넣으면 메모리주소값을 넘겨주는데 그 역의 함수는 없다.)

실제 아래 예제 소스에서는 그렇게 하였으나 사실 SKT에서는 다른 방법이 있다. 그 방법은 따로 한번 더 포스팅을 할 예정이다. 내공이 워낙 없어서 제대로 설명을 못하겠다. 아무튼 잠깐 맛보기만 보여주면, 실제 MC_GETDPTR()하는 부분을 따라가게 되면, 정말 재미있게도 아래와 같은 것을 볼 수 있다.

#define MC_GETDPTR(ptr) *(void**)prt

아니 이런 충격이~!! 실제 WIPIC는 메모리 테이블 관리를 저런 간단한 포인터 연산을 통해서 하고 있었다. 혼자 저 마법의 비밀을 풀어 보는 것도 좋을 것이다. 간단히 답을 말해버리면 주소 값에서 4를 빼면 된다. 더 자세한 설명은 다음에 기회가 있으면 하고, 일단은 저 마법을 풀거나, 메모리ID를 보관하고 있다가 free 할 때 보관 했던 메모리ID 값으로 MC_knlFree를 하면 된다.

/* 마법을 풀려면 WIPI Header를 참조하고 팬과 종이에 포인터 연산을 하면서 runtime에 break 포인트 걸어서 WIPI가 메모리 관리하는 걸 감상하면 쉽게 풀릴 것이다. */

3. new & delete
위의 개념을 이해 했으면 new & delete는 공짜다. 먼저 new delete를 하기 위해서는 C++이 돌아가야한다. 하지만 WIPI-C는 C++의 동작을 보장해 주지 않는다.(이 면피성 발언 ㅡㅡ++) 내가 SKT 메니저도 아니고 WIPIC 만든 사람도 아니여서 C++의 동작을 대신 보장 해 줄 수는 없지만, 마찬가지 논리로 국내 출시폰에 대부분 들어가는 핵심 S/W 만드는 회사 코드는 C++로 되어있다. 조심히 써야할 부분은 있지만 안돌아가지는 않는다.

여기서 하나 더 개념 잡고 들어 갈 것이 WIPI-C 코드는 말그대로 C코드다(WIPI-C++ 이라고 부르지 않는다). 외부적으로는 C 형식으로 불리운 다는 뜻이다. extern C 같은 키워드 잘 사용해한다(이 부분도 C와 C++에서의 함수 호출 방법때문이다. 이건 WIPI 문제가 아닌 C와 C++ 호환 문제)

아무튼 이제 C++도 사용해서 class도 만들었는데, new 하고 delete를 하면 바로 뻗는다. 그 이유는 위의 이유와 같다. new를 하면 메모리값이 아닌 메모리ID 값을 넘겨주기 때문이다. 그래서 new, delete operator도 새로 정의 하는게 여러모로 편리하다. 정의 방법은 위와 동일한 개념이며, 한번 정의 해 놓으면 상속해서 쓰면 되니까 BaseClass 형식으로 하나만 정의 해 놓으면 된다. 아래는 내가 정의 해 놓은 예제이다. 실제 소스에서 추출한 것이라서 동작이 안할 수도 있으니, 참고용으로만 쓰는 것이 건강에 좋을 것이다. 개념 자체와 코드는 몇줄 안되니 참고해서 스스로 작성해도 될 것 같다.(사실 이 소스도 웹에서 긁어 온거 좀 변형했다. copy&paste 인생 ㅋㅋ)


#include "BaseObject.h"

BaseObject::BaseObject()
{
}

BaseObject::~BaseObject()
{
}

void BaseObject::operator new(size_t a_nSize)
{
    long nObjID = 0;
    void pRetObj = NULL;
    nObjID = MC_knlAlloc(a_nSize); // 메모리 확보
    pRetObj = MC_GETDPTR(nObjID); // pointer 얻어오기

    ((BaseObject*)pRetObj)->SetWIPIMemID(nObjID); // 메모리 ID변수에 저장(delete 시에 free용도)

    return pRetObj;
}

void BaseObject::operator delete(void* rawMemory, size_t size)
{
    if(rawMemory)
    {
        if(((BaseObject*)rawMemory)->getWIPIMemID())
        {
            MC_knlFree(((BaseObject*)rawMemory)->getWIPIMemID()); // 저장해 놓은 메모리 ID로 free
        }
    }
}

void BaseObject::SetWIPIMemID(long nMemoryID)
{
    m_nMemoryID = nMemoryID;
}

long BaseObject::getWIPIMemID()
{
    return m_nMemoryID;
}

어찌 어찌 대략적으로 WIPI-C 메모리에 대해서 정리를 해보았다. 조금이라도 삽질을 줄일 수 있다면 개인적으로 큰 영광이 될꺼 같다

by 루디 | 2009/05/01 08:12 | Programming | 트랙백 | 덧글(1)

◀ 이전 페이지다음 페이지 ▶