2010년 4월 25일 일요일

[python] 파일관련

 

1. 파일쓰기
  - open(file) 내장 함수로 파일 객체를 얻음
  - 얻어진 파일 객체서 자료를 읽고 씀
  - close로 객체 사용을 종료(생략 가능)

>>> s = '''
Its power: Python developers typically report
they are able to develop application in a half
to a tenth the amount of time it takes them to do
the same work in such langueges as C.
'''
>>> f = file('t.txt', 'w')
>>> f.write(s)
>>> f.close()

2. 파일 읽기

>>> f = file('t.txt') # 두 번째 인수 생략 시, 읽기 모드로 동작
>>> s = f.read()
>>> print s

Its power: Python developers typically report
they are able to develop application in a half
to a tenth the amount of time it takes them to do
the same work in such langueges as C.

3. 라인 단위로 파일 읽기
  - 파일 객체의 반복자(Iterator) 이용하기(가장 효과적인 방법)

>>> f = open('t.txt')
>>> for line in f:
print line,

  - readline : 한 번에 한 줄씩 읽는다.

>>> f = open('t.txt')
>>> line = f.readline()
>>> while line:
print line, # line 자체에 \n이 포함되어 있어 콤마(,)를 사용
line = f.readline()

  - readlines : 파일 전체를 라인 단위로 끊어서 리스트에 저장한다.

>>> f = open('t.txt')
>>> for line in f.readlines():
print line,

  - xreadlines : readlines와 유사하지만 파일 전체를 한꺼번에 읽지는 않고, 필요할 때만 읽어서 공급한다. 큰 파일을 for 문으로 라인 단위로 읽을 때 편리하다.

>>> f = open('t.txt')
>>> for line in f.xreadlines():
print line,

4. 라인 단위로 파일 쓰기

>>> lines = ['first line\n', 'second line\n', 'third line\n']
>>> f = open('t1.txt', 'w')
>>> f.writelines(lines)
>>>
>>> lines = ['first line', 'second line', 'third line']
>>> f = open('t1.txt', 'w')
>>> f.write('\n'.join(lines))

※ 단어의 수 구하기

>>> n = len(open('t.txt').read().split())
>>> print n
35

※ 라인의 수 구하기

>>> len(open('t.txt').readlines())
5
>>> open('t.txt').read().count('\n')
5

※ 문자의 수 구하기

>>> f = open('t.txt')
>>> len(f.read()) # 줄바꾸기 : '\012'
182
>>> os.path.getsize('t.txt') # 줄바꾸기 : '\015\012'
187L

5. 파일에서 원하는 만큼의 문자 읽기

>>> f = open('t.txt')
>>> f.read(10) # 10바이트 만큼만 읽기
'\nIts power'
>>> f.read(10)
': Python d'

6. 파일 처리 모드
  - 'r' : 읽기 전용
  - 'w' : 쓰기 전용
  - 'a' : 파일 끝에 추가(쓰기 전용)
  - 'r+' : 읽고 쓰기
  - 'w+' : 읽고 쓰기(기존 파일 삭제)
  - 'a+' : 파일 끝에 추가(읽기도 가능)
  - 'rb' : 이진 파일 읽기 전용
  - 'wb' : 이진 파일 쓰기 전용
  - 'ab' : 이진 파일 끝에 추가(쓰기 전용)
  - 'rb+' : 이진 파일 읽고 쓰기
  - 'wb+' : 이진 파일 읽고 쓰기(기존 파일 삭제)
  - 'ab+' : 이진 파일 끝에 추가(읽기도 가능)
※ 플랫폼에 의존하지 않는 코드를 작성하려 한다면 이진 파일을 다룰 때 b 플래그를 사용하는 것이 좋다.
7. 임의 접근 파일
  - seek(n) : 파일의 n번째 바이트로 이동
  - seek(n, 1) : 현재 위치에서 n바이트 이동(n이 양수이면 뒤쪽으로, 음수이면 앞쪽으로 이동)
  - seek(n, 2) : 맨 마지막에서 n바이트 이동(n은 보통 음수)
  - tell() : 현재의 파일 포인터 위치를 돌려줌

>>> fn = 't.txt'
>>> f = open(fn, 'w+')
>>> s = '0123456789abcdef'
>>> f.write(s)
>>> f.seek(5)
>>> print f.tell() # 현재 위치를 돌려줌
5
>>> print f.read(1) # 1바이트 읽기
5
>>> f.seek(-3, 2) # 끝부터 앞으로 3번째 지점
>>> print f.tell()
13
>>> print f.read(1)
d

8. 파일 객체 속성들
  1) 기본 파일 메쏘드
    - file.close() : 파일을 닫는다. 더 이상 입ㆍ출력할 수 없게 된다.
    - file.read([size]) : 원하는 바이트 수만큼 파일에서 읽어 온다. 인수를 지정하지 않으면 전체 파일을 읽어 온다.
    - file.readline([size]) : 라인 하나를 읽어 들인다. size가 지정되면 읽을 수 있는 최대 바이트 수가 된다.
    - file.readlines() : 전체 라인을 readline()을 이용하여 읽어 들인 라인을 리스트에 넣어서 리턴한다.
    - file.write(str) : 문자열 str을 파일에 쓴다.
    - file.writelines(list) : 문자열 리스트를 파일에 쓴다. 줄바꾸기가 자동으로 삽입되지는 않는다.
    - file.seek(offset[, whence]) : whence의 기본 값은 0이다. 0이면 시작 기준, 1이면 현재 위치 기준, 2이면 끝 기준에서 offset만큼 떨어진 위치에 파일 포인터를 위치시킨다.
    - file.tell() : 파일의 현재 위치를 리턴한다.
  2) 기타의 파일 메쏘드
    - file.flush() : 버퍼가 다 채워지지 않았어도 내부 버퍼의 내용을 파일에 보낸다.
    - file.fileno() : file 객체의 파일 기술자(File Descriptor)(정수)를 리턴한다.
    - file.isatty() : 만일 file 객체가 tty와 같은 장치이면 1이면 0을 리턴
    - file.truncate([size]) : 파일 크기를 지정된 크기로 잘라 버림. 인수를 주지 않으면 현재 위치에서 자른다.
  3) 파일 객체 속성
    - file.closed : file이 close 되었으면 1 아니면 0
    - file.mode : 파일이 오픈된 모드
    - file.name : open()할 때 사용된 파일 이름
    - file.softspace : 1이면 print문을 사용할 때 값 출력 사이에 자동적으로 스페이스가 출력됨. 0이면 스페이스가 자동으로 삽입되지 않음
9. 파일 입ㆍ출력 예제

## 지정한 파일의 특정 문자열을 다른 문자열로 변환
# @file repalce.py
import sys  # argv를 위해서 사용
import re   # 정규식 처리 모듈, subn을 위해서 사용

def replace(fName, srcStr, desStr):
    f = open(fName)
    txt = f.read()
    txt = re.subn(srcStr, desStr, txt)[0]
    return txt

if __name__ == '__main__':
    if len(sys.argv) != 4:
        print '''Usage : replace fileName srcStr desStr'''
        sys.exit()
    print replace(sys.argv[1], sys.argv[2], sys.argv[3])

10. 표준 입ㆍ출력 방향 전환
  1) 표준 출력을 파일로 저장하기
    - 출력 방향 전환하기

import sys

f = open('t.txt', 'w')
stdout = sys.stdout # 표준 출력 파일 저장해 두기
sys.stdout = f  # 파일 객체로 변경
print 'Sample output'
print 'Good'
print 'Good'
f.close()
sys.stdout = stdout # 필요하면 복구

    - print 문을 직접 이용하기

>>> import sys
>>> print >> sys.stderr, 'Warning: action filed not supplied'
Warning: action filed not supplied
>>> f = open('t.txt', 'w')
>>> print >> f, 'spam string'
>>> f.close()

  2) 표준 출력을 문자열로 저장하기

import sys
import StringIO

stdout = sys.stdout # 표준 출력 파일 저장해 두기
sys.stdout = f = StringIO.StringIO()    # 출력 파일 방향 전환

print 'Sample output'
print 'Good'
print 'Good'

sys.stdout = stdout # 표준 출력 복구
s = f.getvalue()    # 내부 문자열 가져오기

print 'Done-----'
print s

  3) 문자열을 파일 객체처럼 읽어 내기

try:
    import cStringIO # 빠른 처리를 원한다면 C 버전 모듈인 cStringIO 사용
    StringIO = cStringIO
except:
    import StringIO

s = '''
Python is a cool little language.
It is wall designed, compact, easy to learn and fun to program in.
'''

f = StringIO.StringIO(s)    # 문자열 객체에서 파일 객체 얻어내기
print f.read().upper()  # 대문자로 변환

11. 지속 모듈 : 프로그램이 종료되고 나서도 존재하게 하고, 그 후에 다시 그 데이터를 프로그램에서 사용
  1) 종류
    - DBM 관련 모듈
    - pickle 모듈
    - marshal 모듈
    - shelve 모듈
  2) DBM 파일 관련 모듈 사용하기
    - anydbm, dbm, gdbm, dbhash, dumbdbm 등
    - anydbm 모듈 : 사용 가능한 DBM 호환 가능 최적의 모듈을 찾아 준다.
    - 키에 의한 참조(인덱싱)로 파일에서 자료를 읽어 오고, 인덱싱으로 치환하는 것으로 파일에 자료를 저장
    - 키와 값은 반드시 문자열이어야 한다.

>>> import anydbm
>>> f = anydbm.open('music', 'c') # 'c'(create)는 파일이 없으면 생성, 있으면 읽기로 오픈
>>> f['flute'] = 'wood wind' # 인덱싱으로 치환
>>> f['violin'] = 'string'
>>> f['piano'] = 'keyboard'
>>> f.keys() # keys() 메쏘드
['flute', 'violin', 'piano']
>>> f.values()
['wood wind', 'string', 'keyboard']
>>> f.items()
[('flute', 'wood wind'), ('violin', 'string'), ('piano', 'keyboard')]
>>> len(f) # 레코드 수
3
>>> 'oboe' in f # 멤버십 테스트
False
>>> f['flute'] # 인덱싱으로 값 읽어 오기
'wood wind'
>>> f['violin']
'string'
>>> f.close() # 파일 닫기
>>> ========================== RESTART ==========================
>>> import anydbm
>>> f = anydbm.open('music', 'c') # 'music' 파일 열기
>>> f.keys() # 키 목록 얻기
['flute', 'violin', 'piano']
>>> for k in f: # 전체 내용 출력
print k, f[k]

flute wood wind
violin string
piano keyboard
>>> f['oboe'] = 'wood wind' # 내용 추가
>>> f['piano'] = 'keyboard instrument' # 내용 변경
>>> del f['violin'] # 내용 삭제
>>> for k in f: # 다시 전체 내용 출력
print k, f[k]

flute wood wind
piano keyboard instrument
oboe wood wind

  3) 피클링
    - 모든 객체 저장
    - 재귀적 관계도 모두 처리
    - import pickle(또는 cPickle) : 모듈 import
      pickle.dump(출력할 객체, 파일 객체) : 파일로 객체 출력
      object = pickle.load(파일 객체) : 파일에서 객체를 읽어들임
      s = pickle.dumps(출력할 객체) : 문자열로 객체 출력
      object = pickle.loads(s) : 문자열에서 객체를 읽어들임
    - 장점 : 디버깅을 쉽게하고 문제가 생겼을 때 일반 텍스트 에디터로 복구를 쉽게할 수 있다.
    - 단점 : 파일 크기도 크고 또한 처리 속도도 느리다.
    ※ cPickle 모듈은 pickle 모듈과 같은 인터페이스를 가지고 있지만 약 1000배 빨리 수행되도록 설계되었다.

## pickle sample
# @file pickleSample1.py
try:
    import cPickle
    pickle = cPickle
except:
    import pickle

phone = {'tom': 4358382, 'jack': 9465215, 'jim': 6851325, 'Joseph': 6584321}
List = ['string', 1234, 0.2345]
Tuple = (phone, List)   # 리스트, 튜플, 사전의 복합 객체

f = open('t2.txt', 'w') # 파일 객체를 얻는다.

pickle.dump(Tuple, f)   # 파일로 복합 객체 출력(pickling)
f.close()

f = open('t2.txt')

x, y = pickle.load(f)   # 파일에서 읽어 오기(unpickling)
print x # x는 사전
print y # y는 리스트

# @file pickleSample2.py
try:
    import cPickle
    pickle = cPickle
except:
    import pickle

class Simple:   # 가장 단순한 클래스를 정의
    pass

s = Simple()    # 인스턴스 객체 생성
s.count = 10    # 인스턴스 이름 공간에 변수 생성

f = open('t3.txt', 'w') # 인스턴스 저장
pickle.dump(s, f, 1)    # bin=1 : 이진 모드로 저장
f.close()

f = open('t3.txt')
t = pickle.load(f)  # 인스턴스 가져오기

print t.count

 

참고 : http://creaplz.tistory.com/57

[python] 파일/폴더 존재여부 확인

디스크에 특정 파일명의 파일이  존재하는지, 또는 특정 디렉토리명의 디렉토리가 존재하는지 확인

os.path.isfile() 함수는, 지정한 패스가 파일이고 실제로 존재할 때에만 참을 반환하기에, 파일이 존재하는지 알아내는 용도로 사용할 수 있습니다.

os.path.isdir()은 디렉토리(폴더)에 적용됩니다.

파일/폴더 존재 여부 알아내기 예제

스크립트 파일명: exisfile.py

#!/usr/bin/python
# -*- coding: cp949 -*-
import os
if os.path.isfile("test.txt"):
  print "파일 있음"
else:
  print "파일 없음"
if os.path.isdir("000"):
  print "디렉토리 있음"
else:
  print "디렉토리는 없음"

2010년 4월 22일 목요일

[스크랩] Linux 에서 실행 중인 각 프로세스에 대한 가상 메모리 크기를 표시하기

  문] 실행 중인 각 프로세스에 대한 가상 메모리 크기를 표시하려면 어떻게 해야 합니까?

답] 프로세스당 총 메모리 사용량을 확인하려면 다음을 사용합니다.

# UNIX95= ps -e -o ruser,vsz,pid,ppid,args|sort -rnk2 |more

다음과 같은 형식의 내용이 출력됩니다. #

UNIX95= ps -e -o ruser,vsz,pid,ppid,args|sort -rnk2 |more 
RUSER VSZ PID PPID COMMAND
root 20096 13271 1 /opt/mx/lbin/mxagent 
항목 설명
ruser 프로세스 소유자
vsz 가상메모리 사용량(셀제 메모리 사용량을 기준으로 한 크기)
pid 프로세스 ID
args 프로세스 작성시 명렬줄 인수

명령줄 옵션
sort -rnk2 = 가장 큰 프로세스부터 내림차순으로 정렬

현재 메모리를 가장 많이 사용하는 상위 프로세스 5개의 사이즈, pid 프로세스 이름 확인 방법

tail 다음의 숫자로 찾고자 하는 프로세스의 개수를 조정

ps -elf | awk '{print $10" "$4" "$16}' | sort -n | tail -5 | sort -rn

2010년 4월 21일 수요일

ip주소로 컴퓨터의 이름알아보는법

도스창에서 nbtstat -A [ip addresss] 하세요

그럼 컴퓨터 이름이 나오고요.

아니면 ARP , mac address 를 이용하는 방법도 있읍니다.

C:\>nbtstat

C:\>arp

2010년 4월 14일 수요일

실용적인 심각도 선정 가이드

 

심각도를 정의 하던중 검색해서 찾은 글이다.

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

 

최근 필자가 재직하고 있는 품질관리 팀 내에서 심각도(Severity)에 대한 기준을 다시 정리하는 작업을 진행했다. 국내에서 테스트 엔지니어들이 그들의 현업에서 바로 적용할 수 있을 정도의 심각도에 관한 기준이 세세하게 기록된 문서를 가지고 있는 회사가 과연 얼마나 많을지 의문이다. 아무리 테스트 업무를 오랫동안 진행한 부서라고 하더라도 결함의 심각도를 판단하는 유일한 기준이 오직 개별 테스트 엔지니어의 경험과 주관뿐인 경우가 허다한 것이 현실이다. 상 황이 이러하다 보니 당연히 심각도 선정에 대한 객관성이 보장되지 않았고, 이로 인해 개발자와 테스트 엔지니어 사이에 결함의 심각도에 대한 의견 차이가 빈번하게 발생했을 뿐만 아니라, 테스트 팀 내에서도 동일한 결함에 대해 서로 다른 의견이 제시되고는 했다.

이런 문제들을 조금이라도 줄여보고자 심각도 선정에 대한 기준을 마련하는 작업을 진행하게 된 것인데, 생 각보다 그 과정이 쉽지 않았다. 최근 이와 관련된 일들을 진행하면서 필자가 경험하고 느낀 심각도 설정에 팁이 될만한 몇 가지를 추려 공유하고자 한다. 일반적으로 흔히 통용되는 심각도의 기준은 다음과 같다.

1. 치명적 결함(Critical Defects): 하드 웨어 또는 소프트웨어 장애, 시스템 중지, 시스 템 잠김(접근 불가),
데이터 손실   또는 변조

2. 주요 결함(Major Defects): 기능 상실, 잘못된 기능, 주요 기능 오작동

3. 일반 결함(Average Defects): 불완전 한 기능, 사소한 기능 오작동, 잘못 된 인터페이스

4. 사소한 결함(Minor Defects): 타이핑 에러, 사용자 불편, 스크 린 표준의 위반, 좋지 않은 인터페이스

5. 개선 사항(Enhancement): 에러는 아니지만 개선이 필요한 사항

                                                                   <출처: 개발자도 알아야 할 소프트웨어 테스팅 실무 제2판>

흔히 심각도의 수준을 위와 같은 3 ~ 5단계로 설정하는 것이 일반적이다. 상황에 따라 더욱 많은 단계를 설정할 수도 있겠지만, 개 인적인 경험으로 볼 때 최소한 3단계의 수준이라면 충분히 통용될 수 있으리라 생각된다. 중요한 것은 심각도를 몇 단계로 설정하느냐가 아니라, 발견된 결함에 대에 얼마나 객관적인 심각도를 부여할 수 있느냐 하는 것이다. 위에서 제시된 것과 같은 범용적인 기준만 가지고는 명확하게 이 결함이 어느 정도의 심각도를 가지고 있는지 판단하기 모호한 경우가 무척 많다. 이런 경우, 아래의 사항들을 참조한다면 좀 더 객관적인 심각도 선정에 도움이 될 것이라 생각된다.

■ 테스트의 목적을 고려하라

동일한 텍스트 오류라고 하더라도 단순히 텍스트 오류를 검증하는 목적의 테스트 중에 발견되었느냐, 아 니면 기능 테스트를 수행하다가 발견된 부수적인 결함이냐에 따라 그 심각도가 달라질 수 있다. 단 순히 사용자에게 메시지 전달이 충실히 되느냐를 검증하는 목적의 테스트라면, 다른 테스트에서는 사소한 문제로 간주될 수 있는 텍스트 오류도 심각한 문제가 될 수 있다. 이 처럼 동일한 증상의 결함이라고 하더라도 테스트의 목적과 얼마나 깊은 관계를 가지고 있느냐에 따라 상대적인 심각도가 달라질 수 있다.

■ 노출 빈도를 고려하지 마라

결함이 얼마나 자주 재현되느냐, 즉 결함의 노출 빈도는 심각도와 동등한 위상을 가지는 결함의 또 다른 속성이라고 할 수 있다. 일반적으로 노출 빈도는 결함의 우선순위(Priority)와 더 깊은 관련을 가진다(절 대적인 관계가 있는 것은 아니다). 심각도가 높으면서 사용자에게 적게 노출되는 문제도 있으며, 심각도가 낮지만 사용자가 쉽게 찾아낼 수 있는 결함도 존재한다. 또한 노출 빈도가 높다고 해서 그것이 바로 심각도가 높은 문제라고 판단할 수 있는 것은 아니며, 노출 빈도가 낮다고 해서 심각하지 않은 문제라고 규정하는 것은 섣부른 판단이다. 노출 빈도와 심각도의 정도가 정비례하는 절대적인 규칙은 존재하지 않는다. 이 두 개념은 서로 관련이 없는 별개의 속성으로 판단해야 한다.

객관적인 심각도 부여를 위해서는 결함의 재현과정 보다는 결함의 증상에 집중해야 한다. 재현이 잘 되지 않는다고 해서 결함의 심각도를 낮춰서는 안 된다. 수정하는 우선순위를 미루더라도 결함 자체의 심각도는 영향을 받아서는 안 된다.

■ 사용자에 집중하라

심각도 판단의 기준을 제품을 사용할 사용자에 두느냐, 아니면 제품 자체(테스트의 대상)에 두느냐에 따라 동일한 증상이라도 심각도가 달라질 수 있다. 제품에서 나타나는 단순한 기능 상의 오류라고 하더라도 사용자에게는 심각한 영향을 끼칠 수 있는 것이다. 예를 들어, 아이템을 구매한 내용을 계산해 아라비아 숫자로 총액을 표시하는 기능을 테스트한다고 가정해 보자. 계산된 값이 출력되는 창에는 디폴트로 “0”이라는 값이 기록되어 있다고 가정하자. 구매 내역을 계산하는 기능은 정상적으로 동작하나 기본 출력값인 ‘0’이 사라지지 않아 계산된 금액에 ‘0’이 하나 더 붙는 오류가 발생했다고 할 경우, 이 를 기능 자체의 관점에서 본다면 기능은 정상적으로 작동하고 출력값의 표시와 관련된 문제라 심각도가 낮아질 수 있는 문제다. 하지만 사용자의 관점에서 본다면 이는 정당하게 지불해야 할 금액의 10배를 지불해야 하는 문제가 되므로, 치명적 인 문제로 간주되어야 한다.

■ 회피 수단이 존재하는지 살펴보라

사용자가 어떤 목적을 달성하려는 도중에 발생한 결함이라면 결함이 발생하는 시점에서 사용자의 목적을 달성시킬 수 있는 우회 경로나 결함을 회피할 수 있는 방법이 존재하는지 여부를 살펴보아야 한다. 해당 결함으로 인해 사용자가 자신의 목적을 정상적으로 달성할 수 있는 방법이 사라지게 된다면 이는 심각한 결함으로 간주되어야 한다. 반면에 해당 결함으로 인해 목적을 달성할 수 있는 방법이 비록 제한되기는 하지만 결함에 영향을 받지 않는 정상적인 다른 방법으로 달성할 수 있다면 이는 전자보다는 상대적으로 심각도가 가볍다고 할 수 있을 것이다.

애플리케이션을 종료하려는 사용자에게 메인 메뉴 상에서 등장하는 프로그램 종료 버튼이 작동하지 않는 결함이 발생했다고 가정해 보자. 이 경우 메인 메뉴를 제외한 기타 옵션에서 프로그램을 종료하는 옵션을 제공한다면, 프로그램을 종료하는 경우가 메인 메뉴 상의 종료 버튼을 통해서만 가능한 경우보다는 상대적으로 가벼운 심각도를 가진 결함으로 판단할 수 있을 것이다.

■ 얼마나 많은 사람이 당신의 심각도에 동의할 지 생각해보라

앞서 살펴본 바와 같이, 기준을 무엇으로 삼느냐에 따라 동일한 이슈에 대해서도 심각도는 여러 가지로 달라질 수 밖에 없다. 프로젝트의 모든 이해당사자들이 동의할 수 있는 심각도가 부여된다면 가장 이상적이겠지만, 현실적으로는 개발팀과 테스트 팀간의 합의 조차 힘든 경우도 부지기수다. 개발팀과 테스트 팀이 합의하더라도, 동일한 이슈에 대해 사업 혹은 영업 관련 부서가 판단한 심각도는 또 다를 수 있다.

사용자의 입장을 대변하는 테스트 엔지니어가 제안하는 심각도가 가장 객관적인 심각도로 판명되어야만 한다. 프 로젝트와 관련된 이해당사자들이 가장 존중해야 할 기준은 제품을 구매하고 직접 사용할 사용자가 될 수 밖에 없다. 테스트 엔지니어 역시 개인의 감성적인 판단이나 경험에 의존하는 것이 아니라, 해당 결함이 실제 사용자에게 어떤 영향을 끼칠 수 있을지를 객관적으로 판단하고 적합한 심각도를 부여해야만 많은 사람들이 당신이 부여한 심각도에 동의할 것이다.

원주율 값은 소수점 이하 무한대로 확장될 수 있지만 일반적으로 소수점 2자리 이하의 값들을 버린 3.14 라는 값이 널리 통용된다. 이와 같이 심각도를 선정하는 작업에서도 고려해야 할 수많은 사항들을 얼마나 깊이 고려할 것인가라는 문제도 무척 중요하다. 이를테면, 엔드 유저 대상의 소프트웨어에서 발생한 결함이 사용자에게 어떤 영향을 끼칠 것인가를 고려할 때, 가상의 사용자를 연령별 혹은 직업별로 분류해 각각의 사용자에게 끼칠 영향을 별도로 설정한다던가 하는 것은 경우에 따라 투자한 노력 대비 얻을 수 있는 효과가 미미할 수도 있다. 즉, 배 보다 배꼽이 더 큰 작업이 될 수 있는 것이다. 의료나 군사 분야와 같이 안전(Safety)이 가장 우선시 되는 분야가 아닌 이상, 가 장 일반적인 사용자를 가정하되, 그 ‘일 반적인’ 사용자가 어떤 사람인가를 분석하는 것도 어느 정도의 리소스를 어떻게 투입해서 진행할지를 고민해 보아야 한다.

심각도를 선정하는 기준은 앞서 제시된 기준들 뿐만 아니라 훨씬 더 다양한 기준이 제시될 수 있다. 우 선순위나 결함의 원인, 그리고 해당 결함을 개선하는 데 필요한 시간 및 인력 등을 파악하고 이 요소들을 심각도와 함께 관리한다면 결함을 통한 품질평가라는 측면에서 좀 더 의미있는 지표가 될 수 있을 것이다.

심각도를 판단하는 절대적인 기준은 있을 수 없다. 때에 따라서는 앞서 제시한 기준들이 서로 모순되게 나타날 수도 있고, 제시되지 않은 기준이 더 중요하게 작용할 수도 있다. 결함의 심각도를 판단하는 데 있어 무엇보다 중요한 것은 발견된 결함을 객관적으로 판단하되 사용자의 입장을 충분히 반영할 수 있어야 한다는 것이다. 결함의 심각도를 판단할 때 사용자의 편을 들어줄 수 있는 사람은 오직 테스트 엔지니어 뿐이라는 사실을 잊지 말아야 한다.

 

출처 : http://angel927.tistory.com/82

훌륭한 테스트 팀을 만들고 유지하기

서핑중 좋은글이 있어서..

 

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

소프트웨어 엔지니어는 테스터의 역할 중에서 소프트웨어 개발자 역할을 수행한다. 이들은 소프트웨어 개발자들과 동일한 교육을 받고, 동일한 백그라운드 및 기술들을 보유하고 있다; 단 지 다른 것은 그러한 기술들을 사용하는 애플리케이션일 뿐이다.

즉, 개발자로서의 소프트웨어 엔지니어는 테스트 중인 애플리케이션을 만든다. 테스터로서의 소프트웨어 엔지니어는 애플리케이션의 기능성을 검증하기 위한 시스템을 개발하고 이를 무력화하려고 시도해 본다.[3]

이러한 기술들은 테스트 엔지니어에게 제품이 테스트 용이성에 적합하게 디자인되었는지, 그리고 적합하게 유닛 테스트를 수행했는지 확인하기 위해 개발 담당 팀과 같이 일할 수 있도록 해준다. 테 스트 엔지니어가 비록 개발자와 유사한 일련의 스킬과 단어를 사용한다고 하더라도, 테 스트 엔지니어는 (개발 담당 엔지니어에 비해) 제 품을 더 잘 평가하고 제품의 테스트 용이성이 개선될 수 있는 부분을 더 잘 지적할 수 있다. 이 러한 테스터는 단지 사용자가 키보드 앞에 앉아있는 것을 흉내 내는 것[4]과는 다른 수준의 테스트 자동화를 디자인하고 만들어 낼 수 있다. 그 대신 그는 훌륭하게 설계되고 테스트 중인 시스템만큼이나 정교한 자동화 프로그램을 만들어 낼 수 있을 것이다. 덧붙여, 소 프트웨어 엔지니어는 고객이나 실제 환경을 더 밀접하게 시뮬레이션 하거나 모델링 하기 위해 적절한 소양을 갖추어야 하며, 이러한 소프트웨어 엔지니어가 작성하는 자동화 프로그램은 스스로 에러를 복구할 수 있어야 한다.

Recruiting Software Engineers

어떻게 팀을 꾸릴 것인가? 대부분의 개발자들은 단지 개발만을 하고 어떤 대가를 치르더라도 테스트를 피하고 싶어하는 것이 현실이다. 아마도 테스트 조직에서 소프트웨어 엔지니어를 채용하는 데 있어 가장 큰 장애물은 테스트 엔지니어링에 대한 인식일 것이다. 테 스트 컨퍼런스에 참가하는 도중, 나는 많은 테스트 엔지니어와 그들의 매니저로부터 개발자들이 그들에 대해 어떻게 말하는지를 들려달라는 요청을 받았다. 그 말들 중 가장 날카로운 것들 몇 가지는 다음과 같다: “테스터들은 멍청이들이야”, “테스팅은 지루하고, 수동적이고 반복적이야”, “테스팅은 창조적이지 못하고 혁신할 기회가 부족해”, “테스팅은 전문직이 아니야”, “테스트 엔지니어들은 프로세스가 품질에 공헌하던, 그렇지 않던지 간에 맹목적으로 프로세스를 따라가려고 해” 등등이다. 그리고 물론, 내가 개발을 할 때 가졌던 태도도 “테스트는 나의 훌륭한 창작 행위와 사용자 사이에 서있는 필요악이다” 였다.

이런 말들을 얼마나 많이 들었는가? 당신은 더 나쁜 경험도 가지고 있지 않은가? 우리가 뛰어난 성과를 발휘하는 테스트 팀을 만들기 위해 직면한 하나의 장애물이 바로 이러한 개념을 극복하는 것이다.

자, 이쯤에서, 아마 당신은 개발분야의 직업을 구하고 있는 후보자에게 소프트웨어 엔지니어가 테스팅 부서에서 어떤 일을 해야 하는지를 어떻게 설명해야 할지 궁금해 할 것이다. 이 한 마디로 당신은 설명을 시작할 수 있을 것이다:

“우리 테스트 팀의 소프트웨어 엔지니어는 시스템의 기능성을 검증하고, 성능을 보장하고 요구사항의 범위를 설정하며 신뢰성과 에러로부터 복구되는 것을 증명하기 위한 정교한 소프트웨어를 디자인한다.”

만약 그 후보자가 당신이 위의 문장을 다 말하기 전에 전화를 끊지 않았다면, 더 자세한 논의를 해보면 된다. 사실, 내가 모집하는 이 포지션은 개발직과 동일할 뿐만 아니라, 오히려 더 많은 것을 요구하는 것이다. 여기에 그 이유가 있다:


정교한 소프트웨어(Sophisticated software).
당신은 아주 기술적이고, 정교하고, 에 러에서 복구가 가능한 소프트웨어를 디자인하고 개발할 것이다. 단지 소프트웨어의 목적이 다를 뿐이다. 작은 규모의 애플리케이션을 만드는 대신, 당신은 기능성, 확장성(Scalability), 신뢰성을 검증할 수 있는 완벽한 시스템을 개발해야 하는 것이다. 여기에 더해, 당신의 소프트웨어는 사실상 수동으로 구동되지 않으면서도 각 제품 빌드를 다시 만드는데 많은 시간을 소모하지 않는 방법과 기술을 사용하며, 아울러 이러한 테스트 환경에서 시험중인 시스템을 파괴하는 창조적인 방식도 포함하고 있어야 한다.


당신은 무엇을 만들지를 결정해야 한다(You decide what to build).
대부분의 “소프트웨어 개발자”들 이 마케팅 부서나 혹은 제품관리 부서에서 만든 요구사항에 충족하는 시스템을 만들려고 한다. 새 로운 기능과 특성은 제품에서 구현되기 이전에 제품 관리자의 마음을 제일 먼저 사로잡아야 한다(New features and capabilities must first be sold to the product managers before they can be put into a product). 마케팅 팀은 그들이 이미 마음 속에 가지고 있던 기능에 대해 개발자가 제안한 기능의 비용을 측정해 어떤 것을 탈락시킬지 결정할 필요가 있다. 테스팅에 있어서, 당신은 당신의 보스에게 어떻게 소프트웨어가 생산성을 향상시키고, 품질 확인을 도와주고, 더 많은 버그를 찾게 해주는지를 보여줌으로써, 보스가 당신에게 그 기능이나 시스템을 만들기 시작하라고 지시하도록 할 것이다. 마케팅 회의, 조사 그룹(Survey groups) 혹은 비용 분석은 없다.


소규모 팀(Small Teams).
테스트 팀은 그들의 파트너인 개발 파트보다 규모가 작기 때문에, 당신은 프로젝트에서 일부분이 아니라 무척이나 많은 부분(혹은 어쩌면 프로젝트 전체일수도)을 담당하고 있을 것이다. 여기에 더해, 당신은 당신의 측정 부분이 어떻게 구현되는지에 대한 깊이 있는 이해보다는 제품 전체의 더 많은 기능을 이해함으로써 “큰 그림(big picture)”에 대한 더 나은 인식을 가져야 한다.


창조성(Creativity).
개발자들은 전형적으로 관리자가 기술한 제품을 만들기 때문에, 그들의 창조성은 일반적으로 기능 구현에만 제한되기 마련이다. 즉, 어떻게 이러한 기능들을 최대한의 성능과 품질을 발휘하도록 구현하는 가만을 고민하게 된다. 이와는 반대로, 테스트 엔지니어는 어떤 기능의 구현 방법에서뿐만 아니라 그들이 만들어 내는 기능 자체에 대해서도 창조적이라고 할 수 있다.

창조성의 일반적인 두 가지 영역은 테스팅을 위해 어떤 툴을 사용할 것인가와, 얼마나 새롭고 창조적인 방식으로 테스팅을 수행할 것인가 이다. 여기에는 아마도 시스템에 스트레스를 주거나, 모델-베이스 테스팅을 수행하는 것과 같은 새로운 방식과, 애플리케이션의 품질을 자동적으로 측정하는 다양한 방법과 자동화 자체도 포함된다.


당신은 당신 동료의 코드를 파괴할 필요도 있다(You get to break your buddy’s code).
더 이상의 설명이 필요 없다(No explanation required).


혁신(Innovation).
테스트 자동화 – 특히 기술적으로 고도화된 자동화의 경우 – 는 순수한 소프트웨어 개발에 비해 더 새롭고, 덜 탐구된 영역인 경향이 있다. 이는 혁신할 여지를 더 많이 남겨두는 것이다. 이는 창조성과 겹치는 부분도 있지만, 여기 에서 강조하고자 하는 것은 (테스트 자동화가) 여 전히 개발되고 있는 단계이며 새로운 단계라는 것이다. 높은 품질의 소프트웨어를 개발하는 방법에 중점을 두는 산업에서는 새로운 테스팅 기법과 방법론이 끊임없이 개발되고, 전 파되고 정제된다. 팀에 이러한 혁신을 도입하고 이를 특정한 제품에 적용하는 것은 제품의 품질과 팀의 생산성을 증대시키면서도 한편으로는 (이를 도입한) 엔지니어에 대한 보상이 될 수도 있다.


고객 상호작용/비즈니스 지식(Customer interaction / Business Knowledge).
가장 효과적인 테스트 엔지니어 – 그들이 고전적이거나 스크립터이거나, 혹은 소프트웨어 엔지니어라고 할지라도 – 는 제품에 대한 총체적인 이해를 하는 것이 필요하다. 이러한 총체적인 이해는 (개발자보다는) 테스터에게 있어 좀 더 보편적인데, 그 이유는 테스터들이 특정한 기능의 구현에 덜 관련되어 있고 소프트웨어 검사에 좀 더 연관이 되어 있기 때문이다. 우리는 종종 우리의 테스트 팀을 제품의 한 영역에서부터 새로운 기능이 구현되었거나, 혹은 현존하는 기능이 강화되거나, 버그가 수정된 또 다른 영역으로 전환하기도 한다. 여 기에 더해, 고객이 찾아내는 버그들은 우리에게 어디에 문제가 있는지에 대한 단서를 제공해 주는 것이므로, 우리는 고객들이 어떻게 제품을 사용하는지를 스스로 분석해야 하고 그러한 정보들이 다음 릴리즈를 위해 어떻게 사용되는지를 분석해야 한다. 테스트 엔지니어들은 종종 외부 테스트가 시행되는 동안 고객과의 상호작용을 하는 데에도 무척 적합한데, 이는 고객들이 아마도 제품에 대해 전반적인 이해를 가진 사람의 도움이 필요하기 때문일 것이다. 많은 엔지니어들이 고객과의 상호작용과 종종 이를 동반한 사업적인 여행을 즐긴다. 만약 이 경우가 당신에게도 해당이 된다면, 이 것은 매우 적합한 구인(Recruiting) 포인트가 된다.

모든 엔지니어가 영원히 엔지니어로 남는 것을 바라지 않는다는 것을 명심하는 것도 도움이 된다. 나 는 많은 개발자 및 테스터들이 마침내는 더 중요한 사업적인 역할을 수행하는 자리로 이동하는 것을 수없이 보아왔다. 대다수의 경우, 테스터 직으로부터 이러한 변환이 더 쉽다: 제품에 대한 훌륭한 이해, 비 즈니스 이슈를 해결하는 능력 및 고객과의 상호작용과 같은 경험 등이 이러한 변환을 도와줄 것이다.

실망한 사람들을 채용하기(Recruiting Disappointments)

만약 당신이 여기에서 주어진 모든 가이드 라인을 따르고 당신 스스로 겪었던 다른(혹은 더 나은)문제를 제시한다고 하더라도, 당신이 대화를 나누는 모든 후보자들을 이길 수는 없다. 어쩌면 대부분을 이기지 못할지도 모른다. 그렇다고 실망하지는 마라. 우리가 개발자에게 테스팅을 고려하게 하는 것은 언덕 아래에서 위로 올라가는 힘겨운 싸움을 하고 있는 것과 마찬가지이다. 훌륭한 엔지니어가 한 번 테스팅에 관한 가능성을 생각하기 시작하면, 그것이 점점 커져간다는 것을 기억하라. 나는 여러 가지 이유에서 테스팅을 시작하고 결국엔 그것을 즐기게 되는 많은 엔지니어들과 이야기를 나누어봤다. 그리고 또한 개발부서만이 모든 훌륭한 엔지니어들을 끌어들이는 것은 아니라는 것도 명심하라. 개발 엔지니어 후보들은 그들이 인터뷰하는 팀이 너무 크거나, 너무 작거나, 너무 젊거나(junior) 너무 나이 들었다고(senior) 생 각할 수도 있다: 혹은 프로젝트나, 개 발 부서나 회사가 자신들의 목적에 맞지 않는다고 생각할 수도 있다. 테스팅에 종사하는 우리들처럼, 개발부서의 관리자들도 인원 채용에 있어 어느 정도의 영업 정신이 필요한 것이다.

대안적인 접근방법(Alternative Approaches)

후보자를 끌어들이는 상호 보완적인 접근법이 있다: 인턴, 내 부적인 후보자와 “먼저 테스트를 하게 하고 나중에 개발하도록 하는” 전략이 있다.


인턴(Interns).
내 경험상 고용된 인턴(졸업이 가까워진 소프트웨어 엔지니어링을 공부하는 학생들)들 은 지극히 효과적인 고용 기술이다. 인턴들은 학기 중의(전문대학이나 대학교가 당신의 직장 가까이에 있다고 가정할 경우) 여름이나 일부 기간 동안 풀 타임으로 근무하며, 확 장된 두 가지 방식[5]의 인터뷰를 통해 프로젝트에 종사하는 두 가지 역할을 모두 고려해 볼 수 있다.

대부분의 경우, 인턴들은 종종 그들이 첫 “실질적인” 직업을 가졌다는 기쁨 때문에 열심히 일하곤 한다. 그 들은 경험 있는 프로그래머나 이제 갓 학교를 졸업해 소프트웨어 개발자로서의 역할 모델을 가지지 못한 신입 사원들보다 덜 걱정하는 편이다. 내가 기억하는 가장 행복했던 날은, 가 스 주유소를 그만두고 그 다음날부터 진짜 사무실에서 이전보다 두 배의 임금을 받으며 프로그래머 인턴으로서 일을 시작한 날이다. 비록 아직 대학에 몸을 담은 상태고, 실질 적으로 새로운 위치에서 행한 일들이 그렇게 중요하지는 않았지만, 결국엔 내가 고되게 행한 일들이 회사에 이익을 가져다 줄 것이라고 믿었었다. 나는 요즘의 인턴들이 나와 그렇게 틀리리라고는 생각하지 않는다.

이렇듯 인턴을 통해 양성되고 있는 엔지니어들은 조직에 신선하고, 새롭고, 틀에 박히지 않은 아이디어를 가져다 줄 수 있다. 그 들이 한 번 당신의 테스트 그룹에서 몇 달 혹은 일 년씩 근무하고 나면 그들은 테스트의 장점을 절대적으로 이해하게 되고 졸업 이후에는 풀 타임 근무자로 전환이 가능할 것이다.


내부적인 지원자(Internal Candidates).
때때로 당신은 변화를 준비하거나, 혹은 그들의 리더십 역할을 수행할 곳을 찾거나 혹은 발전을 위해 다른 기회를 찾고 있는 개발 조직의 엔지니어들을 만날지도 모른다. 상 대적으로 더 많은 경험을 가진 상급 소프트웨어 개발자일수록 테스트 부서의 훌륭한 리더가 될 수 있다. 이것은 엔지니어들의 성장과 함께 잠재적인 리더십의 성장을 이끌어 낸다는 두 가지 장점을 제공한다.


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

전문은 원본출처에서 : http://angel927.tistory.com/75

Linux Performance Metrics

리눅스의 성능을 모니터링 할려고 검색하니 좋은 자료가 있어서..

http://support.uptimesoftware.com/article.php?id=117#6

http://tael.egloos.com/3669592

http://kldp.org/node/93155

https://www.ibm.com/developerworks/kr/library/au-analyze_aix/

http://blog.daum.net/_blog/BlogView.do?blogid=0Mdzp&articleno=7186366#

http://www.itmoa.co.kr/gzboard.php?code=study&mode=gz_read&Page=&no=797

젠투 리눅스에서 NAT 설정

젠투 리눅스에서 NAT(Network Address Translation) 을 사용하는 방법입니다.
NAT을 사용하기 위해서는 커널에 MASQUERADE가 활성화 되어있어야 합니다만.. 커널에 기본적으로 모듈로 올라와 있습니다.
- 네트워크 설정
외부, 내부 네트워크 설정을 해줍니다.

ruo91 ~ # nano /etc/conf.d/net
config_eth0="dhcp"
config_eth1="192.168.0.1 netmask 255.255.255.0"

런레벨에 eth0, eth1 인터페이스를 부팅시 자동 시작 하도록 설정 해줍니다.
ruo91 ~ # rc-update add net.eth0 default
ruo91 ~ # rc-update add net.eth1 default

- iptables 설정
트래픽 정책 설정을 해줍니다.
ruo91 ~ # iptables -P INPUT ACCEPT
ruo91 ~ # iptables -P OUTPUT ACCEPT
ruo91 ~ # iptables -P FORWARD DROP

외부와 내부 인터페이스를 지정합니다.
ruo91 ~ # export WAN=eth0
ruo91 ~ # export LAN=eth1

LAN 설정
ruo91 ~ # iptables -I INPUT 1 -i ${LAN} -j ACCEPT
ruo91 ~ # iptables -I INPUT 1 -i lo -j ACCEPT
ruo91 ~ # iptables -A INPUT -p UDP --dport bootps ! -i ${LAN} -j REJECT
ruo91 ~ # iptables -A INPUT -p UDP --dport domain ! -i ${LAN} -j REJECT

외부에서 SSH 접속 허용
ruo91 ~ # iptables -A INPUT -p TCP --dport ssh -i ${WAN} -j ACCEPT

포워딩과 마스커레이드를 설정 합니다.
ruo91 ~ # iptables -I FORWARD -i ${LAN} -d 192.168.0.0/255.255.255.0 -j DROP
ruo91 ~ # iptables -A FORWARD -i ${LAN} -s 192.168.0.0/255.255.255.0 -j ACCEPT
ruo91 ~ # iptables -A FORWARD -i ${WAN} -d 192.168.0.0/255.255.255.0 -j ACCEPT
ruo91 ~ # iptables -t nat -A POSTROUTING -o ${WAN} -j MASQUERADE

커널에서 아이피 포워딩을 사용 하도록 설정합니다.
ruo91 ~ # echo 1 > /proc/sys/net/ipv4/ip_forward
ruo91 ~ # for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 1 > $f ; done

iptables 룰을 저장하고 부팅시 자동으로 실행 하도록 런레벨에 등록합니다.
ruo91 ~ # /etc/init.d/iptables save
ruo91 ~ # rc-update add iptables default

sysctl.conf 에 아이피 포워딩 설정을 활성화 해줍니다.
ruo91 ~ # nano /etc/sysctl.conf
#net.ipv4.ip_forward = 0
net.ipv4.ip_forward = 1

내부 LAN 인터페이스를 시작 합니다.
ruo91 ~ # /etc/init.d/net.eth1 start
   또는 재부팅 하면 됩니다.
ruo91 ~ # shutdown -r now

속도 측정 해본 결과 만족한 결과가 나오네요!! 역시 젠투인듯.. (-ㅅ-)/

출처 : http://www.cyworld.com/ruo91/3473457

참고
http://www.gentoo.org/doc/en/home-router-howto.xml

프로세스 메모리볼때

ps -elf | awk '{print $10" "$4" "$20}' | sort -n | tail -5 | sort -r

(프로세스중에서 메모리 사용량 큰거부터 내림차순으로 정렬 5개) - 확인해봅세~

리눅스는 실행중인 어플리케이션에서 요구하는 메모리를 제외한 대부분의 메모리를 디스크 캐쉬로 활용한다. 이러한 사실을 모르고 있다면, 메모리 현황 조회시 왜 free 메모리가 부족한지를 이해할 수 없을 것이다.
사실은 내가 그랬다. ^^;
Linux 에서는 메모리 사용 현황을 top 명령으로 조회할 수 있으며, 아래는 top 결과 샘플이고 샘플 내의 여러 항목들 중에서 free 와 cached 의 값이 이번 주제에서 중요 항목이다.

top - 09:40:42 up 74 days, 16:47,  3 users,  load average: 0.00, 0.02, 0.08
Tasks: 212 total,   1 running, 210 sleeping,   0 stopped,   1 zombie
Cpu(s):  0.0% us,  0.0% sy,  0.0% ni, 99.9% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:  16630888k total, 16559108k used,    71780k free,   100516k buffers
Swap: 16771776k total,    31920k used, 16739856k free, 16034200k cached

free 메모리가 작지만, cached 메모리는 어플리케이션이 메모리를 필요로 할 때 바로 반환될 수 있으므로 cached 메모리를 실질적으로는 free 메모리로 보아도 무방하다.
따라서 리눅스에서 가용 메모리 계산은 free + buffers + cached 로 할 수 있다.
위의 top 명령 결과로 메모리 용량을 분석해 본다면,
  - 전체 Pyhsical 메모리 : 16630888k total
  - 실질적으로 사용중인 메모리 : 16559108k used - 16034200k cached - 100516k buffers = 424392k
  - 실질적으로 가용한 메모리 : 71780k free + 100516k buffers + 16034200k cached = 16206496k
아래는 free -m 명령으로 조회한 결과이다. (m 옵션으 MB 단위 표시임)

             total       used       free     shared    buffers     cached
Mem:         16241      16188         52          0         98 15669
-/+ buffers/cache:        419      15821
Swap:        16378         31      16347

Mem: 라인에서의 free + buffers + cached 의 값은 -/+ buffers/cache: 라인의 free 값과 비슷하다

[출처] 프로세스 메모리 사용량 볼때|작성자

FFmpeg 설명

 http://blog.naver.com/mrcoram/60095813997

http://kref.naver.com/doc.naver?docid=6688483 USB웹캠을 이용한 임베디드 감시카메라 시스템

http://kin.naver.com/db/detail.php?d1id=1&dir_id=108&eid=lm2IoKCHLZWlBkWhGMKBYX5QZcg2NlNh&qb=UlNTIMD7v+s= RSS적용

http://www.nzeo.com/ 제로보드

http://cafe.naver.com/linuxcare.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=8224 리눅스 캠 녹화 관련.

http://cafe.naver.com/linuxcare.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=9272 5. 웹 감시 카메라 주목.

http://tong.nate.com/ggtong/22772905 Linux와 USB-Camera를 사용한 웹 카메라 개발

http://usr/share/ubuntu-artwork/home/index.htm

`-L' license 보여준다

`-h' 도움말

`-formats' 이용가능한 포맷,코덱,프로토콜 ....

`-f fmt' 포멧을 강제한다.

`-i filename' 입력 파일 이름

`-y' 출력 파일에 덮어쓰기

`-t duration' 레코딩 하는 시간 설정 hh:mm:ss[.xxx] syntax 또한 지원.

`-title string' 타이틀 설정

`-author string' 권한자 설정

`-copyright string' copyright 설정

`-comment string' comment 설정

`-target type' target 파일 타입 명시 ("vcd", "svcd" 또는 "dvd"). 모든 포맷 옵션들(bitrate, codecs, buffer sizes)은 자동적으로 이 옵션에 의해 설정 된다. 단지 ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg이렇게 쳐넣기만 하면 된다

`-hq' 높은 질의 설정들을 활성화

[ Video Options ]

`-b bitrate' video bitrate 설정 (default = 200 kb/s)

`-r fps' frame rate 설정 (default = 25)

`-s size' frame size 설정. WidthxHeight (default 160x128) 다음의 약어들은 정의 되어있다

set frame size. The format is `WxH' (default 160x128). The following abbreviations are recognized:

`sqcif'

128x96

`qcif'

176x144

`cif'

352x288

`4cif'

704x576

`-aspect aspect' 화면 비율 설정(4: 3, 16: 9 or 1.3333, 1.7777)

`-croptop size' 위로 잘리는 band 사이즈 설정(in pixels)

`-cropbottom size' 밑으로 잘리는 band 사이즈 설정 (in pixels)

`-cropleft size' 왼쪽으로 잘리는 band 사이즈 설정 (in pixels)

`-cropright size' 오른쪽으로 잘리는 band 사이즈 설정 (in pixels)

`-vn' 비디오 저장 되지 않게 함

`-bt tolerance' 비디오 bitrate 오차 설정(in kbit/s)

`-maxrate bitrate' 최대 비디오 bitrate 오차 설정(in kbit/s)

`-minrate bitrate' 최소 비디오 bitrate 오차 설정(in kbit/s)

`-bufsize size' 속도조절 buffere 사이즈 설정 (in kbit)

set ratecontrol buffere size (in kbit)

`-vcodec codec' 'codec'에 비디오 코덱 으로 강제 한다. 특별한 값이 있는 카피 사용 그것은 원레의 코덱 데이타가 존재 해야 한다.

`-sameq' 원본과 같은 비디오 질 사용 (포함 VBR)

`-pass n' pass number (1 or 2) 선택. 이것은 두가지 패스 encoding 에 유용하다. 비디오의 통계는 저장되어진다 첫번째 패스에 그리고 정확한 비트 속도가 요구된 비디오는 두번째 패스에 생성 되어진다.

select the pass number (1 or 2). It is useful to do two pass encoding. The statistics of the video are recorded in the first pass and the video at the exact requested bit rate is generated in the second pass.

`-passlogfile file' 두 패스 로그 파일 네임을 파일에 선택

[ Advanced Video Options ]

`-g gop_size' 사진 사이즈 그룹 설정

`-intra' 내부 프레임만 사용

`-qscale q' 고정된 양자화 비율 사용 (VBR)

`-qmin q' 최소 양자화 비율 사용(VBR)

`-qmax q' 최대 양자화 비율 사용(VBR)

`-qdiff q' 양자화 비율 사이의 차이를 최대화 (VBR)

`-qblur blur' 비디오 양자화 비율 흐리게 (VBR)

`-qcomp compression' 비디오 양자화 비율 압축(VBR)

`-rc_init_cplx complexity' 1-pass encoding 를 위한 초기의 복잡함

`-b_qfactor factor' p와 b 프레임 사이의 qp 요인

`-i_qfactor factor' p와 i 프레임 사이의 qp 요인

`-b_qoffset offset' p와 b 프레임 사이의 qp offset

`-i_qoffset offset' p와 b 프레임 사이의 qp offset

`-rc_eq equation' 속도조절 균등화 설정 tex^qComp 가 초기화

`-rc_override override' 구체적인 간격을 위한 override 속도 조절

`-me method' 동작 방법의 method 에 설정. 이용 가능한 메소드는 (from lower to best quality)

set motion estimation method to method. Available methods are (from lower to best quality):

`zero'

Try just the (0, 0) vector.

`phods'

`log'

`x1'

`epzs' (초기 메소드)

`full' 거대한 서치( 느리고 epzs보다 더 많은 마진이 있다)

`-dct_algo algo' dec 알고리즘을 algo에 설정

`-idct_algo algo' idct알고리즘 설정

`-ec bit_mask' bit_mask에 오류 은폐 설정

`-bf frames' B 프레임 사용 (MPEG-1, MPEG-2 and MPEG-4가 지원됨)

`-mbd mode' 매크로 블럭 결정

`-4mv' 매크로블럭에 의한 four motion vector 사용(오직 MPEG-4)

`-part' data partitioning 사용(only MPEG-4)

`-bug param' workaround 는 자동으로 encoder bugs를 검출하지 않는다

`-strict strictness' 얼마나 엄격하게 표준을 따르느냐

`-aic' advanced intra coding 활성화

`-umv' 무제한 모션 백터 활성화

`-deinterlace' 사진을 얽히지 않게 함

`-interlace' encoder 상에서 interlacing 강제 (only MPEG-2 and MPEG-4) 만일 입력파일이 interlaced 됬거나 최소 손실을 위해 interlaced 를 유지하길 원한다면 이옵션 사용. 반대는 deinterlace '-deinterlace'와 함께 입력, 그러나 deinterlacing 는 좀 더 손실이 있다.

force interlacing support in encoder (only MPEG-2 and MPEG-4). Use this option if your input file is interlaced and if you want to keep the interlaced format for minimum losses. The alternative is to deinterlace the input stream with `-deinterlace', but deinterlacing introduces more losses.

`-psnr' 압축된 프레임의 PSNR 측정

`-vstats'  `vstats_HHMMSS.log'에 dump 비디오 코딩 통계

`-vhook module' 비디오 프로세싱 모듈 삽입. 모듈은 모듈이름과 그것의 파리미터 들은 공간으로 분리하여 포함하고 있다

[ Audio Options ]

`-ab bitrate' 오디오 비트속도 설정

`-ar freq' 오디오 샘플링 freq 설정 (초기값=44100 Hz)

`-ab bitrate' 오디오 비트레이트를 in kbit/s 설정 (초기값 -64)

`-ac channels' 오디오 채널의 수를 설정 (초기값 =1)

`-an' 오디오 사용 안함

`-acodec codec' codec에 오디오코덱 입력. 원본 데이타 codec 이 존재하는 특별한 값을 갖는 copy사용.

[ Audio/Video grab options ]

`-vd device' grab 비디오 장치 설정(e.g. `/dev/video0')

`-vc channel' grab 비디오 채널 설정(DV1394 only)

`-tvstd standard' TV 표준 설정(NTSC, PAL (SECAM))

`-dv1394' DV1394 grab 설정

`-ad device' 오디오 장치 설정(e.g. `/dev/dsp')

[ Advanced options ]

`-map file: stream' 맵핑할 입력 스트림 설정

`-debug' 특정 디버그 정보 출력

`-benchmark' 벤치마킹을 위한 타이밍 추가

`-hex' 각 입력 패킷 dump

`-bitexact' 오직 정확한 알고리즘 비트 사용 (for codec testing)

`-ps size' bits로 패킷 사이즈 설정

`-re' 본래의 프레임 속도에 입력. 주로 가상 그랩 디바이스에 사용

`-loop' 입력 스트림을 loop. 일반적으로 이미지 스트림에만 사용. 이옵션은 ffserver 자동 테스팅을 위해 사용되어진다.

[출처] ffmpeg 한글 옵션 설명|작성자 펩스삼촌

 

여기도 참고. http://www.ruliweb.com/ruliboard/read.htm?main=psp&table=etc_psp&db=2&sort=reply&num=2025

2010년 4월 13일 화요일

FFmpeg 설명

 http://blog.naver.com/mrcoram/60095813997

http://kref.naver.com/doc.naver?docid=6688483 USB웹캠을 이용한 임베디드 감시카메라 시스템

http://kin.naver.com/db/detail.php?d1id=1&dir_id=108&eid=lm2IoKCHLZWlBkWhGMKBYX5QZcg2NlNh&qb=UlNTIMD7v+s= RSS적용

http://www.nzeo.com/ 제로보드

http://cafe.naver.com/linuxcare.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=8224 리눅스 캠 녹화 관련.

http://cafe.naver.com/linuxcare.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=9272 5. 웹 감시 카메라 주목.

http://tong.nate.com/ggtong/22772905 Linux와 USB-Camera를 사용한 웹 카메라 개발

http://usr/share/ubuntu-artwork/home/index.htm

`-L' license 보여준다

`-h' 도움말

`-formats' 이용가능한 포맷,코덱,프로토콜 ....

`-f fmt' 포멧을 강제한다.

`-i filename' 입력 파일 이름

`-y' 출력 파일에 덮어쓰기

`-t duration' 레코딩 하는 시간 설정 hh:mm:ss[.xxx] syntax 또한 지원.

`-title string' 타이틀 설정

`-author string' 권한자 설정

`-copyright string' copyright 설정

`-comment string' comment 설정

`-target type' target 파일 타입 명시 ("vcd", "svcd" 또는 "dvd"). 모든 포맷 옵션들(bitrate, codecs, buffer sizes)은 자동적으로 이 옵션에 의해 설정 된다. 단지 ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg이렇게 쳐넣기만 하면 된다

`-hq' 높은 질의 설정들을 활성화

[ Video Options ]

`-b bitrate' video bitrate 설정 (default = 200 kb/s)

`-r fps' frame rate 설정 (default = 25)

`-s size' frame size 설정. WidthxHeight (default 160x128) 다음의 약어들은 정의 되어있다

set frame size. The format is `WxH' (default 160x128). The following abbreviations are recognized:

`sqcif'

128x96

`qcif'

176x144

`cif'

352x288

`4cif'

704x576

`-aspect aspect' 화면 비율 설정(4: 3, 16: 9 or 1.3333, 1.7777)

`-croptop size' 위로 잘리는 band 사이즈 설정(in pixels)

`-cropbottom size' 밑으로 잘리는 band 사이즈 설정 (in pixels)

`-cropleft size' 왼쪽으로 잘리는 band 사이즈 설정 (in pixels)

`-cropright size' 오른쪽으로 잘리는 band 사이즈 설정 (in pixels)

`-vn' 비디오 저장 되지 않게 함

`-bt tolerance' 비디오 bitrate 오차 설정(in kbit/s)

`-maxrate bitrate' 최대 비디오 bitrate 오차 설정(in kbit/s)

`-minrate bitrate' 최소 비디오 bitrate 오차 설정(in kbit/s)

`-bufsize size' 속도조절 buffere 사이즈 설정 (in kbit)

set ratecontrol buffere size (in kbit)

`-vcodec codec' 'codec'에 비디오 코덱 으로 강제 한다. 특별한 값이 있는 카피 사용 그것은 원레의 코덱 데이타가 존재 해야 한다.

`-sameq' 원본과 같은 비디오 질 사용 (포함 VBR)

`-pass n' pass number (1 or 2) 선택. 이것은 두가지 패스 encoding 에 유용하다. 비디오의 통계는 저장되어진다 첫번째 패스에 그리고 정확한 비트 속도가 요구된 비디오는 두번째 패스에 생성 되어진다.

select the pass number (1 or 2). It is useful to do two pass encoding. The statistics of the video are recorded in the first pass and the video at the exact requested bit rate is generated in the second pass.

`-passlogfile file' 두 패스 로그 파일 네임을 파일에 선택

[ Advanced Video Options ]

`-g gop_size' 사진 사이즈 그룹 설정

`-intra' 내부 프레임만 사용

`-qscale q' 고정된 양자화 비율 사용 (VBR)

`-qmin q' 최소 양자화 비율 사용(VBR)

`-qmax q' 최대 양자화 비율 사용(VBR)

`-qdiff q' 양자화 비율 사이의 차이를 최대화 (VBR)

`-qblur blur' 비디오 양자화 비율 흐리게 (VBR)

`-qcomp compression' 비디오 양자화 비율 압축(VBR)

`-rc_init_cplx complexity' 1-pass encoding 를 위한 초기의 복잡함

`-b_qfactor factor' p와 b 프레임 사이의 qp 요인

`-i_qfactor factor' p와 i 프레임 사이의 qp 요인

`-b_qoffset offset' p와 b 프레임 사이의 qp offset

`-i_qoffset offset' p와 b 프레임 사이의 qp offset

`-rc_eq equation' 속도조절 균등화 설정 tex^qComp 가 초기화

`-rc_override override' 구체적인 간격을 위한 override 속도 조절

`-me method' 동작 방법의 method 에 설정. 이용 가능한 메소드는 (from lower to best quality)

set motion estimation method to method. Available methods are (from lower to best quality):

`zero'

Try just the (0, 0) vector.

`phods'

`log'

`x1'

`epzs' (초기 메소드)

`full' 거대한 서치( 느리고 epzs보다 더 많은 마진이 있다)

`-dct_algo algo' dec 알고리즘을 algo에 설정

`-idct_algo algo' idct알고리즘 설정

`-ec bit_mask' bit_mask에 오류 은폐 설정

`-bf frames' B 프레임 사용 (MPEG-1, MPEG-2 and MPEG-4가 지원됨)

`-mbd mode' 매크로 블럭 결정

`-4mv' 매크로블럭에 의한 four motion vector 사용(오직 MPEG-4)

`-part' data partitioning 사용(only MPEG-4)

`-bug param' workaround 는 자동으로 encoder bugs를 검출하지 않는다

`-strict strictness' 얼마나 엄격하게 표준을 따르느냐

`-aic' advanced intra coding 활성화

`-umv' 무제한 모션 백터 활성화

`-deinterlace' 사진을 얽히지 않게 함

`-interlace' encoder 상에서 interlacing 강제 (only MPEG-2 and MPEG-4) 만일 입력파일이 interlaced 됬거나 최소 손실을 위해 interlaced 를 유지하길 원한다면 이옵션 사용. 반대는 deinterlace '-deinterlace'와 함께 입력, 그러나 deinterlacing 는 좀 더 손실이 있다.

force interlacing support in encoder (only MPEG-2 and MPEG-4). Use this option if your input file is interlaced and if you want to keep the interlaced format for minimum losses. The alternative is to deinterlace the input stream with `-deinterlace', but deinterlacing introduces more losses.

`-psnr' 압축된 프레임의 PSNR 측정

`-vstats'  `vstats_HHMMSS.log'에 dump 비디오 코딩 통계

`-vhook module' 비디오 프로세싱 모듈 삽입. 모듈은 모듈이름과 그것의 파리미터 들은 공간으로 분리하여 포함하고 있다

[ Audio Options ]

`-ab bitrate' 오디오 비트속도 설정

`-ar freq' 오디오 샘플링 freq 설정 (초기값=44100 Hz)

`-ab bitrate' 오디오 비트레이트를 in kbit/s 설정 (초기값 -64)

`-ac channels' 오디오 채널의 수를 설정 (초기값 =1)

`-an' 오디오 사용 안함

`-acodec codec' codec에 오디오코덱 입력. 원본 데이타 codec 이 존재하는 특별한 값을 갖는 copy사용.

[ Audio/Video grab options ]

`-vd device' grab 비디오 장치 설정(e.g. `/dev/video0')

`-vc channel' grab 비디오 채널 설정(DV1394 only)

`-tvstd standard' TV 표준 설정(NTSC, PAL (SECAM))

`-dv1394' DV1394 grab 설정

`-ad device' 오디오 장치 설정(e.g. `/dev/dsp')

[ Advanced options ]

`-map file: stream' 맵핑할 입력 스트림 설정

`-debug' 특정 디버그 정보 출력

`-benchmark' 벤치마킹을 위한 타이밍 추가

`-hex' 각 입력 패킷 dump

`-bitexact' 오직 정확한 알고리즘 비트 사용 (for codec testing)

`-ps size' bits로 패킷 사이즈 설정

`-re' 본래의 프레임 속도에 입력. 주로 가상 그랩 디바이스에 사용

`-loop' 입력 스트림을 loop. 일반적으로 이미지 스트림에만 사용. 이옵션은 ffserver 자동 테스팅을 위해 사용되어진다.

[출처] ffmpeg 한글 옵션 설명|작성자 펩스삼촌

Ffmpeg 기본 사용법

ffmpeg파일이 있는 폴더에서 아래와 같은 커맨드 명령어를 사용하여 인코딩할수있다.

C:\> ffmpeg -i [인코딩할파일이름] -t 300 -acodec ac3 -ar 48000 -ab 640k -ac 6 -vcodec libx264 -b 3695k -r 24 [저장할파일이름]

ex)ffmpeg -i e:\video\2001.720p.x264.mkv -t 300 -acodec ac3 -ar 48000 -ab 640k -ac 6 -vcodec libx264 -b 3695k -r 24 E:\091217_trans\2001_h264_ac3.mp4

옵션

-i e:\video\2001.720p.x264.mkv – 인코딩할 파일

-t 300 – 동영상 처음부터 시간 300초

-acodec ac3 – 오디오코덱 ac3

-ar 48000 – 샘플링레이드 48.0Khz

-ab 640k – 오디오비트레이트 640k

-ac 6 – 오디오체널 6체널

-vcodec libx264 – 비디오 코덱 h264

-b 3695k – 비트레이트 3695k

-r 24 – 프레임레이트 24

E:\091217_trans\2001_h264_ac3.mp4 – 컨테이너= mp4 ,저장할 파일이름

기타 옵션

-aspect 16:9

화면비율을 16:9로 만든다.

-s 1280x720

해상도를 1280x720으로 만든다. –aspect 옵션과 같이 사용 해야 적당히 맞춰진다. 정확히 1280x720으로 맞춰지지 않는 경우가 많다.

-ss 00:07:30

인코딩시작시간을 00:07:30으로 맞춘다.

-ss 00:07:30

–t 00:05:00

인코딩시작시간을 00:07:30으로 맞추고 그 지점부터 5분을 인코딩한다.(00:07:30 ~ 00:12:30)

-sn

mkv파일을 mkv로 인코딩할 때 필요한 옵션.

-acodec libmp3lame

오디오코덱 mp3 사용

-acodec libfaac

오디오코덱 aac 사용

-acodec ac3

오디오코덱 ac3 사용

-vcodec libx264

비디오코덱 h264 사용

-vcodec mpeg4

비디오코덱 mpeg4

xxxxx.mp4

컨테이너를 mp4로 인코딩한다.

xxxxx.avi

컨테이너를 avi로 인코딩한다.

xxxxx.mkv

컨테이너를 mkv로 인코딩한다.

그 외 옵션도 많이 있으므로 더 정확한 사용을 원하거나 정보가 필요할시에는 ffmpeg홈페이지의 옵션 페이지를 참고한다.

Ffmpeg 옵션 페이지 - http://ffmpeg.org/ffmpeg-doc.html

Ffmpeg 버전별 사용

Ffmpeg은 버전에 따라 코덱의 버전도 다르기 때문에 원활한 재생을 위해 위해서 여러 버전사용

또다른관점의 기능명세

개발을 진행하다 보면 다 같은 기능인데 사용자 , 기획자 , 개발자가 보는 관점이 모두 다르다. 그런데 이 내용은 기획자 중심으로 정리가 되고 최근에는 유저 중심에서 정리가 되다 보니 개발자와의 기획자간의 잡음이 항상 끊이지 않는다.
그래서 이런 형식은 어떨지 생각을 해 보았다.
각 관점별로 기능에 대한 것들을 정리 하고 그것들에 대한 내용들을 적어 보고 그것들을 기획자 및 개발자가 서로 이야기를 해서 합의를 보는 것에 대해서..
아래는 좀 적다만  SAMPLE 제공 ...

프로젝트명

기능 분류 1

기능 분류 2

기능 코드

작성자

GENIUS

Setting 관련

권한 관리

AT_10001

장운봉

1. 사용자 관점

쉽게 하위 관리자들을 추가,권한을 주고 대회를 운영.

A. WCG는 특정인을 고용해서 특정 리그를 대행할 수 있다.

B. WCG는 특정 SP에게 특정 국가들의 대회를 관리하게 할 수 있다.

C. SP는 특정 Referee에게 특정 리그를 관리하게 한다. (Q&A , Appeal , Match 결과 등 )

D. 각 권한을 주는 프로세스는 간단했으면 한다.

E. 사용자는 관리자를 쉽게 신청할 수 있으면 좋겠다. ( 이메일이 아니라 웹을 통해서 )

2. 기획자 관점

쉽고 직관적인 인터페이스를 통해서 사용자가 관리자를 등록 / 승인.

전제 :

WCG = 모든권한 / OP = Operator (WCG가 고용) / SP=파트너 / Admin = Referee, Moderator 로 분리가 되며 이 권한구조는 하이라키 형태를 갖는다.

Referee의 권한 중에 리그 관리를 하는 기능에 있어 Event 및 League를 생성수정 하는 기능외의 리그가 진행 중일 때 관리하는 Match , Appeal , Q&A처리는 그 기능은 데이터 상에서는 명시가 되어 있으나 화면상에서 따로 권한을 부여하지 않는다. ( 예를 들면 A Referee는 Match만 B Referee는 Appeal만 이런 식으로는 관리하지 않는다. 단 , 데이터에서는 관리를 하고 있어 차후에 상세한 권한관리가 더 필요할 경우 이를 적용할 수 있게 한다. )
각 등급에는 필요한 기능들이 모두 명세되어 데이터화 되어 있으며 만약 추가로 더 필요한 예외의 기능들이 있다면 예외 권한 주기를 통하여 예외로 권한을 주는 방식을 택한다.

권한을 주고 나면 그 사람의 Email 로 권한에 대한 처리 결과를 나타내는 이메일이 자동으로 발송 된다. 권한을 막거나 삭제하게 되면 실시간으로 사용자에게 적용된다.

관리자 화면이라 함은 관리자들이 신청 또는 신청된 Tab으로 분리된 형태로 각 권한등급에 따라 WCG , OP , SP는 접근이 가능하고 자신이 관리하는 국가의 신청된 사용자를 볼 수 있으며 , 하위 등급에 대해서는 수정이 가능하나 , 상위 등급에 대해서는 수정이 불가능하고 , Referee는 이 메뉴자체에 접근이 불가능 하다.

자세한 사항은 # 권한 등급별 하이라키 와 # 권한 구조 의 별첨 문서를 참고 한다. 아래에서 관리자 화면이라고 되어 있는 부분은 관리자들을 신청한

A. 관리자 설정화면에서 권한 등급을 OP로 설정하고 [모든 국가의 리그 관리됨 ] ,이미 OP의 권한 등급에는 사용 가능한 기능들이 명세되어 있다. 특정한 리그에 대해서만 권한을 주려면 권한 등급을 Referee를 선택하고 국가와 리그를 선택한다.

B. 관리자 화면에서 권한 등급을 SP로 선택하고 관리하는 국가를 선택한다.
이미 권한 등급 SP에는 SP가 할 수 있는 권한들이 명세되어 그룹화 되어 있다.

C. 관리자 화면에서 SP가 관리하는 국가의 사용자들이 보이고 사용자 아이디를 클릭하면 관리자인지 신청한 사람인지 보이고 신청을 처리하고 나면 이에 권한을 줄 수 있다. 이에 특정 리그를 선택하여 권한을 주도록 한다.

D. 권한 그룹이라는 개념을 통해 미리 각 권한등급에 대한 권한을 데이터에 명세하고 이를 한번에 데이터에 처리 할 수 있도록 준비 한다.

E. GENIUS Main 에서 Register를 통해서 WCGZONE ID 를 입력하고 필요한 권한 등급을 선택하고 관리할 국가를 선택하면 신청이 되고 이를 관리자는 확인하고 이에 대한 권한을 주도록 한다. 대신 의미 없는 사람이 계속해서 신청할 경우가 있는데 이를 막을 방법을 생각해 본다. (IP BAN / 반려할 경우 데이터에서 삭제되고 , History Table로 이동 )

3. 개발자 관점

기능,권한에 대한 유연성 유지 , 복잡한 구조를 단순하게 표현 및 관리

구조 : 권한 등급을 먼저 설계하고 , 메뉴 및 기능을 분류하고 , 이에 대한 권한 등급에 대한 메뉴 및 기능에 권한들을 미리 정의한 Table을 만들고 승인시 이 테이블에 정리되어 있던 권한들이 데이터에 적용되도록 한다.

관리자 관련

관리자 신청 기능 , 관리자 권한 설정 , 관리자 권한 변경 , 관리자 리스트 , 관리자 정보 뷰 ( 프로필 및 권한 내용 그리고 권한 추가 변경 )

권한 그룹 관리

권한 그룹 생성 , 권한 그룹 수정

출처 http://goodboys.egloos.com/2324681

기능명세서의 적용

 

오늘 간단한 미팅을 통해서 요구사항명세, 기능명세에 대한 이야기를 나누었는데, 매우 유익한 시간이었다고 생각합니다.

주요한 개발 산출물인 위의 2가지 명세에 대하여 역시나 각자의 생각의 정도나 활용의 목적도 다른 부분이 많았고,

이를 통하여 어느 정도 우리 조직에 맞는 공통된 언어를 사용하는 것은 개발에 큰 힘이 될 것으로 생각합니다.

오늘을 기점으로 저희 팀원 모두가 명세서 작성에 있어서 좀더 관심을 가지고 의미있는 산출물이 나올 수 있었으면 합니다.

금일 미팅을 진행하면서 사실 저도 제가 알고 있는 개념들에 있어서 정확하게 정의하지 않고 혼돈스럽게 이해한 부분들이 있었음을 느꼈습니다.

걍 습관적으로 하다보니 개념적으로 이해하기 보다는 기계적으로 혹은 느낌으로 적용하였던 것들이 있었고,

개념적으로 다시금 정리하고 정확히 정리된 개념들이 몸으로 체득되어 다시 “기계적으로 적용”될 수 있도록 노력해 보겠습니다.

다시 잡아야 할 개념들:

금일 회의가 끝나고 생각해 보니까 제가 지속적으로 언급했던

“Implementation의 구체적 사항을 제외한 나머지 세부 구현 기능을 열거하는 문서”의 정체는

요구사항명세가 아니라 기능명세서 입니다.

제가 잘못 개념잡고 있었던 큰 이유는 “요구사항명세는 기능 명세를 포함한다”라는 사실 때문이었습니다.

엄격한 의미의 요구사항명세서는 상세기능명세서를 한 꼭지로 포함하는 상당히 큰 범주의 보통은 분량도 좀 많은 문서로서

과제의 목적, 관련된 용어 및 개념, 사용자 특성, 제약 사항, 가정 및 의존성, 상세 기능, 유스케이스 분석 등이 포함됩니다.

(샘플문서는 이거를 한번 참조해보심이… 눈에 참 익은 포맷인데, 다시는 쓰고 싶지 않은 괴물과 같은 놈이지요.)

PDPv2.0은 이러한 무거운 요구사항명세서를 지양하기 때문에,

요구사항명세서의 일부인 기능명세서를 충실히 작성하는 것만으로도 과제 진행에 충분하다고 생각됩니다.

(이 시점에서 PDP의 요구사항 템플릿을 보면 요구사항명세서라고 하지 않고, “요구사항목록”이라고 정의하고 있습니다.

고객이 요구한 주요 기능을 열거하는 것이 목적인 듯 합니다.)

어떻게 적용할까 :

1. 요구사항목록(요구사항명세서가 아닙니다) 문서를 통하여 고객이 요구하는 주요 기능들을 열거합니다.
이를 통하여 시스템이 이루고자 하는 방향성을 잡을 수 있을 듯 합니다. 주요 요구 기능이 적은 플랫폼 입장에서는 그닥 쓸모있는 문서가 되지는 않겠습니다….
필수적인 문서일 필요는 없을 것 같습니다. 되도록 이면 과제 계획 단계에서 PM이나 팀장이 작성하는 것으로 하는게 좋을 듯 하네요. ( --> 아래 댓글에 요구 사항 목록에 대한 제 회의감을 피력했습니다.)

2. 기능명세서는 Acceptance Test가 가능한 레벨의 Complete한 set으로 작성합니다. 개발자 뿐만 아니라 고객이나 QA입장에서도 의미 있는 내용이어야 하며, 지속적인 변경이 있을 수 있습니다.
이 부분은 구현을 담당할 개발자가 고객이 요구한 명시적 기능과 시스템에 요구되는 암시적 기능을 포함하여 작성하여야 겠습니다.

3. 스크럼의 product backlog는 2번에서 작성한 기능명세 개념을 기반으로 작성합니다. product backlog는 기능명세서와 동급의 문서이며 이를 작성하는 경우에 기능명세서를 대체할 수 있습니다.

4. 스크럼의 sprint backlog는 product backlog에서 해당 sprint에서 구현할 목록을 추출한 subset이 되는 것을 기본으로 합니다. 추가적으로 세부 구현 사항을 언급하기 위하여 product backlog의 항목을 분해할 수도 있습니다.

[출처] 요구사항명세와 기능명세의 줄타기...|작성자 스탤론

2010년 4월 12일 월요일

엑셀에서 줄바꿈제거

엑셀에서 셀의 내용을 편집할 때 Alt+Enter키를 누르면 여러줄로 셀의 내용을 채울 수 있습니다.

이때 Alt+Enter키를 누른 부분에는, 눈에 보이지 않는 줄바꿈 문자, 즉 개행문자(CR-LF)가 들어갑니다.

이 엑셀 셀(Cell)의 개행문자를 검색, 치환하는 방법입니다. 즉, 줄바꿈문자 찾기와 바꾸기입니다.

 

요점은 줄바꿈 문자를 Alt+10 으로 변환하여 찾기와 바꾸기를 하는 것입니다. Alt+10 이란 키보드의 Alt키를 누르면서, 우측 키패드에 있는 1과 0을 연달아 눌러주는 것입니다.

 

(1) 셀 속의 개행문자를 찾으려면, Ctrl+F키로 찾기 대화상자를 꺼낸 후

 

(2) "찾을 내용"이라는 입력칸을 마우스로 클릭한 후,

 

(3) 키보드의 Alt키를 누른 상태에서,

 

(4) 키보드의 맨 우측의 "숫자 키패드(Numeric Keypad; 계산기 모양으로 숫자만 나열된 작은 자판)"에 있는 아라비아 숫자 1과 0을 연속으로 눌러 줍니다.

 

(5) 이제 키보드에서 손을 뗍니다. 눈에 보이지는 않지만 개행문자가 "찾기 대상 문자열"로서 입력되었습니다.

 

(6) "다음 찾기" 버튼을 누르면, 셀 속에 개행문자가 들어 있는 셀을 찾아줄 것입니다.

 

바꾸기 작업도 마찬가지입니다.

만약 Alt+10 이 먹히지 않는다면, Alt+010 을 눌러 줍니다.

잘 안될 수도 있는데 여러번 시도해 보면 됩니다.

Alt키를 누르면서, 십진수 아스키 코드 번호를 누르면, 그 번호에 해당하는 문자들이 찍히는데 그것을 이용하는 것입니다.
엔터키의 십진수 아스키 코드 번호는 10 입니다. (13 일 수도 있지만 엑셀에서는 10 으로 해야 합니다.)

 

출처 : http://mwultong.blogspot.com/2008/03/excel-find-replace-cell-newline.html

2010년 4월 8일 목요일

쓰레드의 최대 생성 갯수확인

쓰레드의 최대 생성 갯수 확인 법

cat /proc/sys/kernel/threads-max

쓰래드 확인

ps –efm | grep 이름.

2010년 4월 7일 수요일

PDF 편집기

PDF 편집기를 찾던 중 정리가 잘된 블로그가 있어 퍼옴.

출처 : http://www.thirdtype.net/1567

이제 공용 포맷으로 광범위하게 사용하고 있는 PDF 화일. 편집이 안되는 것이 장점일 수도 있지만 사실 불편한 점이 많은게 사실입니다. 그래서 오늘은 PDF 파일의 편집과 생성에 관련된 포터블 프로그램을 모아봤습니다.

1. Foxit PDF Editor

PDF_Editor_Portable_2.1.0.0702_En.paf.exe

PDF 파일을 편집할 수 있습니다만 워드처럼 자유로운 것은 아니고 개별 단어를 객체화 시켜서 수정할 수 있습니다. 단순 오타 정도 수정하는데 유용할 것 같네요.

2. PDF Split/Merge

Ap PDF Split Merge.zip

말 그대로 PDF 파일을 잘라서 여러개로 만들거나, 여러개의 PDF 파일을 하나로 합쳐주는 프로그램입니다. 아이팟터치에서 큰 용량의 PDF를 잘라서 저장하면 쉽게 읽을 수 있습니다.

3. PDFtoJPG

PDFtoJPG.zip

이 프로그램은 PDF의 개별 페이지들을 각각의 이미지 파일로 변환시켜 주는 프로그램입니다. PDF 파일을 볼 수 없을 경우 사용하면 유용합니다. 단점이라면 실제 보이는 PDF 페이지 레이아웃과 100% 동일하게 이미지화 되지는 않습니다.

4. Image to PDF

Image To PDF v3.1.zip

여러개의 이미지들을 하나의 PDF로 만들어 주는 프로그램 입니다만 딱히 써먹을데가...

5. PDF2Word

PDF2Word.zip

PDF 파일은 워드로 바꿔주는 프로그램 입니다. 한글 PDF 파일도 문제없이 변환됩니다.

전문적으로 오피스 파일을 PDF로 변환해 주는 프로그램들 중에 포터블로 제작되어서 제대로 작동되는걸 본적이 없는 것 같습니다. 아무래도 대부분의 PDF 변환 프로그램들이 프린터 드라이버를 통해 변환시켜 주기 때문이라고 생각되는데요.

MS오피스와 호환되는 무료 오피스 프로그램인 오픈오피스 자체가 PDF 문서 변환을 지원해 주니까 포터블 오픈오피스를 가지고 다니시면 간단히 PDF로 변환하실 수 있습니다.

TOP명령어

top이라고 친 후 h라고 입력 하면 도움말이 나옵니다. 거기에서 보고싶은 걸 입력하면 됩니다.

>#top

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

top - 11:35:19 up 44 days,  5:09,  5 users,  load average: 0.03, 0.05, 0.05

Tasks: 343 total,   1 running, 342 sleeping,   0 stopped,   0 zombie

Cpu(s):  1.2% us,  0.1% sy,  0.0% ni, 96.7% id,  1.9% wa,  0.0% hi,  0.0% si

Mem:   2070100k total,  1748748k used,   321352k free,   233704k buffers

Swap:  2096472k total,      236k used,  2096236k free,   642728k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                             

1629 webadmin  16   0  2808 1116  756 R    1  0.1   0:00.15 top

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

@각 행별 내용

1) 1행 : 시스템의 가동 시간과 평균 부하의 숫자를 출력

top - 11:35:19 up 44 days,  5:09,  5 users,  load average: 0.03, 0.05, 0.05

-> 현재시간(11:35:19 )과 uptime 값(up 44 day)를 알수 있으며, 현재 로그인 된 사용자의 수(5 users)와

    시스템의 최근 1분, 5분, 15분에 대한 각각의 평균 부하율(load average: 0.03, 0.05, 0.05)를 나타냄

->

i.  Load average: 작업의 대기시간을 말한다. 값이 1이 나왔다면 1분 동안 평균 1개 정도의 프로세서가 대기상태에 있다는 것이다. 서버마다 차이가 있긴 하지만 5 정도면 서버가 부하를 받는 다고 생각한다. 과부하는 10 ~ 15이상이면 과부하라고 본다.

@ 시스템 평균 부하율 정보 : uptime

- 시스템의 평균 부하율을 확인할 수 있는 명령어

-1분, 5분, 15분간의 시스템 평균 부하율을 출력

-# uptime

11:35:19 up 44 days,  5:09,  5 users,  load average: 0.03, 0.05, 0.05

-현재시간(11:35:19), 44일 동안 시스템 재부팅 없이 운영중임(up 44 day),  로그인한 시간(5:09), 현재 시스템에 접속한 사용자(5 users), 1분, 5분, 15분간의 시스템 평균 부하율(load average: 0.03, 0.05, 0.05) 정보를 출력

2) 2행 : 현재 실행중인 프로세스들의 상황

Tasks: 343 total,   1 running, 342 sleeping,   0 stopped,   0 zombie

-> 전체 실행된 현재 프로세스의 수는 (343 total), 실행중인 프로세스 ( 1 running), 유휴상태의 프로세스(342 sleeping),

정지 된 프로세스( 0 stopped), 좀비 프로세스(0 zombie)들의 상황을 알려줌

3) 3행 : CPU의 사용에 대한 상황 (이 정보를 통해 CPU의 사용현황을 파악하여 CPU의 추가적인 보강 계획이나

업그레이드 등의 계획을 세울수 있슴)

Cpu(s):  1.2% us,  0.1% sy,  0.0% ni, 96.7% id,  1.9% wa,  0.0% hi,  0.0% si

-> 사용자가 사용중인 CPU의 사용율(1.2% us), 시스템이 사용하는 CPU의 사용율(0.1% sy), NICE 정책에 의해 사용되는 CPU의 사용율( 0.0% ni), 사용되지 않는 CPU의 미사용율(96.7% id), 입출력 대기상태의 사용율(1.9% wa)등의 상황에 대해

알려줌

4) 4행 : 메모리의 사용에 대한 상황 (이 정보를 통해 메모리의 사용 현황에 대해 파악하고 메모리의 부족 현상 등을 분석하여 추가적인 메모리의 확장에 대해 고려할수 있슴)

Mem:   2070100k total,  1748748k used,   321352k free,   233704k buffers

-> 전체 물리적인 메모리(2070100k total), 사용중인 메모리(1748748k used), 사용되지 않는 여유 메모리(321352k free), 버퍼된 메모리의 ㅣ양(233704k buffers)등의 상황에 대해 알려줌

5) 마지막행 : 스왑메모리의 사용에 대한 상황(스왑 메모리의 사용이 증가할 경우에는 물리적 메모리의 확장을 고려)

Swap:  2096472k total,      236k used,  2096236k free,   642728k cached

-> 전체 스왑 메모리(2096472k total), 사용중인 스왑 메모리( 236k used), 남아있는 스왑메모리(2096236k free), 캐싱메모리(642728k cached)등의 상황에 대해 알려줌

@ 세부 정보 필드별 항목

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                

PID : 프로세스 ID (PID)

USER : 프로세스를 실행시킨 사용자 ID

PRI : 프로세스의 우선순위 (priority)

NI : NICE 값. 일의 nice value값이다. 마이너스를 가지는 nice value는 우선순위가 높다.

VIRT : 가상 메모리의 사용량(SWAP+RES)

SHR : 분할된 페이지, 프로세스에 의해 사용된 메모리를 나눈 메모리의 총합.

S : 프로세스의 상태 [ S(sleeping), R(running), W(swapped out process), Z(zombies) ]

%CPU : 프로세스가 사용하는 CPU의 사용율

%MEM : 프로세스가 사용하는 메모리의 사용율

COMMAND : 실행된 명령어

RES : 현재 페이지가 상주하고 있는 크기(Resident Size)

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

A. CPU 과부하를 인지하는 것은 매우 어렵다.

    씨피유의 과부하는 실제로 메모리 문제들과 I/O 문제들 사이의 틈에 끼워져 있다. CPU과부하 여부를 확인하는 방법

    i. Uptime을 사용해 로드 평균값을 확인해 증가 하는지 혹은 감소 하는지 본다. 통상 시스템의 CPU개수에 2를 곱한 값을

       로드 평균의 적정 수준으로 보기 때문에 해당 시스템의 CPU개수에 따라 적절한 로드 평균값은 달라질 수 있다.

    ii. 디스크 접근이나 페이징을 위해 대기하고 있는 프로세스가 있나?

1. 그럼 프로세스가 있다면 I/O와 메모리 서브 시스템을 검사한다.

    iii. CPU의 대부분을 사용하고 있는 프로세스는 무엇인가?

1. CPU를 많이 사용하고 있는 프로세스들을 적절히 재배치 해 워크 로드를 보다 좋게 분산 시키도록 도와 준다.

    iv. 시스템 스테이트에서 CPU의 대부분 50% 이상의 시간을 소비 하고 있는가?

1. 그렇다면 I/O를 의심해 볼 필요가 있다. 소스 코드를 액세스 할 때 애플리케이션이 I/O를 효과적으로 사용하고 있는지 검사한다.

    v.  CPU로드가 높은데도 불구하고 IDLE 스테이트에서 CPU를 많이 10% 이상 사용하고 있는가?

1. 그렇다면 I/O나 메모리에 의심

    vi. CPU IDLE시간이 끊임 없이 0인가?

1. CPU가 활동량이 많은 것은 시스템을 잘 사용하고 있는 것이지만 항상 100% 사용하고 있다면 일은 어떤 곳에서 계속 쌓인다는 것이다. 즉, CPU 오버로드 발생하고 있다는 것이다.

B. 처방

     i. 불필요한 데몬 프로세스를 제거한다. Rwhod, routed는 성능에 문제를 주는 프로세스이다. Kill 한다.

     ii. at이나 다른 큐잉시스템을 이용해 사용자의 일을 야간에 수행하도록 한다. CPU(메모리, I/O 시스템)가 야간에는

        과부하가 걸린다고 하더라도 아침에 그 작업이 끝나면 보통 별 문제가 되지 않는다.

    iii. CPU에 의존적인 일의 우선순위를 낮추는데 nice를 사용함으로써 인터랙티브 퍼포먼스를 향상시킬 수 있다.

        여기서 CPU내에 의존적인 일의 우선순위를 높이는데 nice를 사용함으로써 그 일은 성능을 향상시키겠지만

        인터랙티브 퍼포먼스는 해치게 된다. Nice를 사용하는 것은 임시 방편적인 방법으로만 써야 한다. 만약 시스템의

        워크로드가 증가하게 된다면 이런 방법으로는 충분하지 않으며, 시스템을 업그레이드 하든지 교체 혹은 다름 시스템을

        구입해 로드를 공유, 분산해야 한다.

http://kdaq.empas.com/knowhow/view.html?num=1222412&ht=p

2010년 4월 1일 목요일

Windows 에서 확인 가능한 CMD 명령어들.

Network Setting
ipconfig 를 사용하여 일단 현재의 네트워크 설정 상태를 본다.

 

Server Core - ipconfig

또는, netsh 를 사용 할 수도 있다.
C:\>netsh interface ipv4 show interfaces
이 커맨드의 output 에 나오는 Idx 는 아래의 모든 커맨드에서 참조 되므로 확인 해 둘 필요가 있다.
"Local Area Connection" 에  static 으로 IP가 할당 된 모습이 보인다.
변경하고 싶다면, 다음과 같이 cmd 를 날려준다.
C:\>netsh interface ip set address "Local Area Connection" static 192.168.1.200 255.255.255.0 192.168.1.1
대강 눈치 채셨겠지만, "인터페이스 이름",  고정, IP, Netmask, Default Gateway 의 순서이다.
더 있어 보이는 커맨드는 이거다.
C:\>netsh interface ipv4 set address name="" source=static address="X.X.X.X" mask="X.X.X.X" gateway="X.X.X.X"
물론, DHCP 로 할당 할 수도 있다.
C:\>netsh interface ip set address "Local Area Connection" source=dhcp
네임서버 설정은 다음과 같다.
C:\>netsh interface ip set dns "Local Area Connection" static 192.168.1.1 primary
이런 방법도 있다.
C:\>netsh interface ipv4 add dnsserver name="" address=X.X.X.X index=1
DHCP 인경우, 네임 서버 설정을 DHCP에서 받고 싶다면 다음과 같이 한다.
C:\>netsh interface ip set dns "Local Area Connection" source=dhcp
때로는, 인터페이스 이름을 바꾸고 싶을 수도 있다.
C:\>netsh interface set interface name="Local Area Connection" newname="eth0"
Administrator Password 변경
C:\>net user administrator *
패스워드를 묻는 프롬프트가 나오면 입력하고 엔터친다.
Hostname 변경
hostname 을 확인한다.
C:\>hostname  
WIN-C2C2XXXXXX
변경한다.
C:\>netdom renamecomputer WIN-C2C2XXXXXX /NewName:XXXXXX
서비스 관련 경고가 나타나면, 이상이 없는  경우 Y 를 눌러 진행한다.
재부팅
C:\>shutdown /r /t 0
Windows Activation
Windows Activate 에는 slmgr 툴을 사용한다.
서버 라이센스 상태 확인
C:\>slmgr.vbs /dli
서버 키 확인
C:\>slmgr.vbs /dlv
서버 키 재입력
C:\>slmgr.vbs /ipk
서버키 만료에 대한 정보
C:\>slmgr.vbs /xpr
트라이얼 상태로 되돌림
C:\>slmgr.vbs /upk
라이센스 활성화
C:\>slmgr.vbs /ato
KMS 서버 설정
C:\>slmgr.vbs /skms activationservername:port 
cscript ScregEdit.wsf  시스템 설정 도구
자동 업데이트 ( /AU )
현재 설정 확인
C:\>cscript C:'Windows'System32'Scregedit.wsf /au /v
4 - 자동 업데이트 활성
1 - 자동 업데이트 비활성
/v 설정 확인
Terminal Service - Remote Administration Connection Set ( /AR )
- 사용 방법 동일 ( 0 enable, 1 disable )
Terminal Service - 다른 윈도 버전 및 CredSSP 설정
  /v  터미널 서비스 CredSSP 설정 확인
  0, 이전 윈도우 버전 접근 허용, 1 CredSSP 필요
IPSEC Monitor - 원격 Management 허용 ( /IM )
/v 설정 확인
0 허용하지 않음,  1 허용
기타 참조 가능 명령
Pagefile 관련 설정
pagefile 할당, 사이즈는 서버 물리메모리 크기에 따라 유동적으로 할당한다.
C:\>wmic pagefileset where name="C:\\pagefile.sys" set InitalSize=500,Maximimsize=1000
pagefile 시스템 관리 Disable
C:\>wmic computersystem where name="%computername%" set AutomaticManagedPagefile=False
Optional Feature 설치
List 확인
C:\>oclist
설치
C:\>Start /w Ocsetup [packagename]
  -> 옵션 적용이 잘못되거나 , /? 로 나타나는 Help 참조
워크그룹 변경
C:\>Wmic computersystem where name="%computername%" call joindomainorworkgroupname="NEWWORKGROUPNAME"
타임존 변경
C:\>control timedate.cpl
설치된 드라이버 목록
C:\>Sc query type = driver
윈도우에 포함되지 않은 드라이버 설치
- 적절한 위치에 드라이버를 먼저 복사
C:\>Pnputil -i -a WHERE\DRIVER.inf
지역 설정
C:\>control intl.cpl
파일 버전 확인
C:\>wmic database where name="C:\\windows\\system32\\ntdll.dll" get version
설치된 패치 확인
C:\>wmic qfe list
패치 설치
C:\>Wusa.exe [Patchname].msu
Error Reporting 설정
현재 설정  확인
C:\>serverWerOption /query
자세한 리포트 보냄
C:\>serverWerOption /detailed
요약된 리포트 보냄
C:\>serverWerOption /summary
해제
C:\>serverWerOption /disable
설치된 .msi 도구 확인
C:\>wmic product
로그 아웃
C:\>Logoff
위의 커맨드를 기반으로, 다음과 같이 테스트 시스템을 준비하였다.
주석은 #처리 하였다.

#Network Setup
netsh interface set interface name="Local Area Connection" newname="eth0"
netsh interface ip set address "eth0" static 192.168.1.23 255.255.255.0 192.168.1.254
netsh interface ip set dns "eth0" static 192.168.1.200 primary
#Application Install
#oclist 로 의존성 및 추가 설치할 패키지 확인  | more 로 파이프 걸어서 볼 수있다.(당연)
start /w ocsetup NetFx2-ServerCore
start /w ocsetup NetFx3-ServerCore
start /w ocsetup NetFx2-ServerCore-WOW64
start /w ocsetup NetFx3-ServerCore-WOW64
start /w ocsetup MicrosoftWindowsPowerShell
start /w ocsetup MicrosoftWindowsPowerShell-WOW64
#Windows Activation
slmgr.vbs /ipk XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
slmgr.vbs /ato
#Timezone Setting
control timedate.cpl
#Region and Locale
control intl.cpl
#Reboot
shutdown /r /t 0

일단 기본 설정은 끝났다.  향후 필요한 윈도우 기본 패키지는 oclist 를 참조하여 설치하면 되고, 필요한 어플이 있으면 받아서 진행하면 되겠다.
원래는 네트워킹 쪽만 업데이트 하려 했으나, 내용을 정리 하다보니 아예 다 하는게 나을 것 같아 Active Directory 부분만 제외했다.
키보드로 제어하는 윈도우는 아~~주 매력적인듯.