'분류 전체보기'에 해당되는 글 307건

  1. 2014.04.05 free 메모리 보기
  2. 2014.04.05 Linx 명령어
  3. 2014.04.05 ps 프로세스
  4. 2014.04.05 I/O 스케줄러
  5. 2014.03.24 Ubuntu jdk 1.7 설치하기
  6. 2014.02.02 Node 샘플 프로그램
  7. 2014.02.02 Node 설치하기
  8. 2014.01.20 Django 설명
  9. 2014.01.19 Git 에 대한 설명
  10. 2014.01.12 OpenStack Python 언어 사용 기법

free 메모리 보기

Linux 2014. 4. 5. 19:06

1. 메모리 보기

# free


                   total       used          free     shared    buffers     cached

Mem:       3079912    2870192      209720             0     260776     1637140

-/+ buffers/cache:     972276    2107636

Swap:      5237184             0    5237184


2. 유저 메모리


    유저 메모리 = 디스크 캐시 ( buffers + cached )   +   AnonPages

           * 디스크 캐시에는 Shmem (tmpfs) 가 포함되어 있음


    유저 메모리 = File-backend 메모리 ( Active(file) + Inactive(file) )   +   

                       Anonymous 메모리 ( Active(anon) + Inactive (anon) )

           *  Anonymous 메모리에는 Shmem (tmpfs) 가 포함되어 있음



3. 커널 메모리


    커널 메모리 = MemTotal - (MemFree + Active + Inactive + Unevictable)


    커널 메모리 = Slab + VmallocUsed (ioremap 제외) + KernelStack + PageTebles



4. VmallocUsed 에서 ioremap 제외하고 계산하는 방법

# cat /proc/vmallocinfo | grep -v "ioremap" | awk '{print $2}' | paste -s -d "+" | bc


byte 로 결과 값이 출력됨


# echo "(" $(cat /proc/vmallocinfo | grep -v "ioremap" | awk '{print $2}' | paste -s -d "+") ") / 1024" | bc


KB 로 출력됨



5. pmap

# pmap -x 1154              (sshd 의 프로세스 id 가 1154 임)


출력 예)

Address           Kbytes     RSS   Dirty Mode   Mapping

00007f55459c7000       0      16       0 r-x--  libnss_files-2.15.so

00007f55459d3000       0       0       0 -----  libnss_files-2.15.so

00007f55489a7000       0       4       4 rw---  libwrap.so.0.7.6

00007f55489a8000       0     112       0 r-x--  ld-2.15.so

00007f5548bad000       0      40      40 rw---    [ anon ]

00007f5548bc8000       0       8       8 rw---    [ anon ]

00007f5548bca000       0       4       4 r----  ld-2.15.so

00007f5548bcb000       0       8       8 rw---  ld-2.15.so

00007f5548bcd000       0     232       0 r-x--  sshd

00007f5548e47000       0      12      12 r----  sshd

00007f5548e4a000       0       4       4 rw---  sshd

00007f5548e4b000       0      36      36 rw---    [ anon ]

00007f5548e5b000       0      68      68 rw---    [ anon ]

00007fff2b5e7000         0      20      20 rw---    [ stack ]

00007fff2b687000         0       4       0 r-x--    [ anon ]

ffffffffff600000               0       0       0 r-x--    [ anon ]


[anon] 으로 표시되는 것이 AnonPages 즉 유저 영역 메모리로 malloc 등으로 확보한 메모리를 말한다.

Kbytes 는 논리 어드레스 이고 RSS 는 물리 메모리 용량(KB) 이다.





반응형
Posted by seungkyua@gmail.com
,

Linx 명령어

Linux 2014. 4. 5. 17:38

1. wait

   - 쉘에서 wait 커맨드를 실행한 곳에서 슬립상태로 대기하며 백그라운드에서 실행 중인 자식 프로세스가 완전히 종료되어 CHLD 시그널이 통지되기를 기다린다. 모든 자식 프로세스가 종료되면 wait 의 다음 처리를 진행한다.


2. redirect

# command >test.log 2>test.err &


> : 표준출력은 test.log, 에러는 test.err 에 저장한다.

& : 백그라운드 프로세스로 실행한다.


# command >test.log 2>&1 &


2>&1 : 에러출력을 표준출력에 출력한다.


# command >/dev/null 2>&1 &


/dev/null : 버린다.


# nohup command >/test.log 2>&1 &


nohup : bash 프로세스는 종료되면 자식 프로세스에 HUP 시그널을 전송한다. HUP 시그널은 프로세스 종료

            시그널이므로 bash 가 끝나면 백그라운드로 돌리는 자식 프로세스도 종료된다.

            nohup 은 bash 프로세스가 종료되더라도 HUP 시그널을 보내지 말라는 의미


3. Ctrl + Z

   - 일시 정지라는 의미로 vi 실행 중에 잘못하여 Ctrl + Z 를 하면 에디터 화면이 없어서지고 명령 프롬프트로 떨어짐

      이 때 fg 커맨드를 실행하면 다시 vi 에디터 화면으로 이동

   - 포그란운드 실행 커맨드에서 Ctrl + Z 로 일시 정지 후에 bg 를 실행하면 백그라운드 실행으로 바꿀 수 있음


4. 파이프라인 (|)

    - 프로세스 A | 프로세스 B  : 프로세스 A 의 표준출력을 받아서 프로세스 B 의 표준입력으로 처리한다.


5. tr, cut, grep

# ps -ef | head -5


출력 예)

UID        PID  PPID  C STIME TTY          TIME CMD

root         1        0   0  16:22   ?              00:00:02 /sbin/init

root         2        0   0  16:22   ?              00:00:00 [kthreadd]

root         3        2   0  16:22   ?              00:00:00 [ksoftirqd/0]

root         5        2   0  16:22   ?              00:00:00 [kworker/u:0]


head -5 : 처음 5줄만 출력


# ps -ef | head -5 | tr -s " " | cut -d " " -f 2 | grep -v "PID"


출력 예)

1

2

3

5


tr -s " " : 여러 공백이 있으면 하나의 공백으로 변환

cut -d " " -f 2 : -d 로 지정한 문자를 기준으로 구분(여기서는 공백) -f 로 지정한 위치필드(여기서는 2) 출력

grep -v "PID" : -v 뒤에 지정한 조건은 제외하고 출력


# ps -ef | grep -E -v "^(root|UID)"


grep -E : 확장 정규표현 식을 사용

^(root|UID) : 처음에 오는 문자가 root 이거나 UID

-v : 일치하는 조건은 제외


6. awk

# ps -ef | head -5 | awk '{print $2}' | grep -v "PID"


awk '{print $2}' : 연결 공백을 구분 문자로 2번째 위치필드를 출력


# cat /etc/passwd | awk -F ":" '{print $1}'


awk -F ":" '{print $1}' : -F 로 지정한 문자를 기준으로 구분(여기서는 :) 첫번째 필드를 출력


7. ps

# ps -e --no-headers -o pid | head -5


출력 예) : 프로세스 id 가 우측 정렬로 되어 있어 앞에 공백이 있음

    1

    2

    3

    5

    6


--no-headers : 헤더는 출력에서 제외

-o pid : pid 만 출력


8. sed

# ps -e --no-headers -o pid | head -5 | sed "s/^ *//"


출력 예)

1

2

3

5

6


s : 변환

/ : 시작

^ : 첫행

(스페이스)* : 정규표현으로 공백이 여러개(*)

/ : 끝

(Null)/ : null 로 치환


# ps -ef | grep -E -v "^(root|UID)" | sed "s/^/kill -9 /"


s/^/kill -9 : 처음문자 앞에 kill -9 를 삽입


9. $()

   - $() 안의 커맨드 출력 결과를 넣어라

# ps -ef | wc -l


출력 예)

196


# ps -ef | head -$(ps -ef |wc -l)


ps -ef | wc -l 의 결과 즉, 196 을 넣어서 ps -ef | head -196 과 같은 뜻이 됨


10. yes

# yes "kill" | head -5


출력 예)

kill

kill

kill

kill

kill


yes "kill" : kill 이라는 문자를 계속 출력


11. pgrep

# pgrep -v -u root


유저가 root 가 아닌 pid 를 출력


12. pkill

# pkill -9 -v -u root


유저가 root 가 아닌 모든 프로세스를 kill -9 로 죽인다.


13. tcp dump

# tcpdump -i any -vv 'tcp port 80' -w hostname.out

혹은

# tcpdump -i br100 -n -v udp port 53


14. tcp time_wait 세션 개수 보기

# netstat -an | grep -i wait | wc -l



반응형
Posted by seungkyua@gmail.com
,

ps 프로세스

Linux 2014. 4. 5. 17:29

1. 프로세스 조회

# ps -ef | grep ssh[d]


출력 예)

root       1154      1  0 16:23 ?         00:00:00 /usr/sbin/sshd -D

root       3424  1154  0 16:41 ?        00:00:00 sshd: stack [priv]

stack     3578  3424  0 16:41 ?        00:00:00 sshd: stack@pts/0


-ef : 출력을 유저 id, 프로세스 id, 부모 프로세스 id 순으로 표시한다.

[]  : grep 자기 자신에 대한 명령은 제외한다.


# ps aux | grep ssh[d]


출력 예)

root       1154  0.0  0.0  50036  2932 ?        Ss   16:23   0:00 /usr/sbin/sshd -D

root       3424  0.0  0.1  92304  3984 ?        Ss   16:41   0:00 sshd: stack [priv]

stack     3578  0.0  0.0  92304  1848 ?        S     16:41   0:00 sshd: stack@pts/0


S : Sleep

Z : 좀비 프로세스   (끝에 <defunct> 라 표시)



반응형
Posted by seungkyua@gmail.com
,

I/O 스케줄러

Linux 2014. 4. 5. 17:20

1. I/O 스케줄러의 종류

   - noop (No Optimization) : 1개의 sub queue 를 가지고 순서대로 처리

   - cfg (Complete Fair Queuing) : 64개의 sub queue 로 분배하여 각 프로세스마다 공평하게 처리

   - deadline(Deadline) : Read sub queue 와 Write sub Queue 를 가진다. 

   - anticipatory : deadline 기능에 다음에 올 요청을 예상하는 기능을 추가


2. 특정 디바이스 (sda) 에 대한 I/O 스케줄러 변경

# cat /sys/block/sda/queue/scheduler        (스케줄러 조회)

# echo "cfg" > /sys/block/sda/queue/scheduler       (스케줄러를 cfg 로 변경)


3. 시스템 전체 I/O 스케줄러 변경하려면 /boot/grub 아래의 grub 파일을 변경해야 한다.

    예) elevator=deadline 으로 지정


4. SAN 과 같이 외부 디스크 장치를 사용하는 경우에는 LUN 에 대해서 deadline 스케줄러가 cgf 보다 더 효과적이다.


5. ionice 를 활용한 프로세스 스케줄러 조정

# ionice -c 1 dd if=/dev/zero of=test bs=1M count=500 oflag=direct &


-c 1 : Real time

-c 2 : Best effort

-c 3 : Idle


/dev/zero : 바이트 코드 0 (NULL) 값

oflag=direct : 디스크 캐시를 사용하지 않음




반응형
Posted by seungkyua@gmail.com
,

1. 최신 버전의 JDK 다운로드 : jdk-7u51-linux-x64.tar.gz

http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html


2. 압축을 푼 후 /usr/local/jdk1.7.0_51/ 로 복사  (root.root 권한으로 변경)


3. vi /etc/profile 에 경로 추가

export JAVA_HOME=/usr/local/jdk1.7.0_51

PATH="$JAVA_HOME/bin:$PATH"

반응형
Posted by seungkyua@gmail.com
,

1. Hello World 샘플 프로그램

vi ~/Node/chapter01/helloworld.js

var http = require('http');

http.createServer(function (req, res) {

res.writeHead(200, {'content-type': 'text/plain'});

res.write('Hello World!\n');

res.end();

}).listen(8124);


console.log('Server running on 8124');

$ node helloworld.js


2. 비동기 함수로 만들기 (process.nextTick 사용)

var asynchFunction = function(data, callback) {

    process.nextTick(function() {

        callback(data);

    }); 

}


function log(data) {

    console.log(data);

}


asynchFunction("123", log);


3. 비동기 함수로 만들기 (setTimeout 사용)

function log(data) {

    console.log(data);

}


setTimeout(log, 0, "456");


4. Server Socket

var net = require('net');


var server = net.createServer(function(conn) {

    console.log('connected');


    conn.on('data', function(data) {

        console.log(data + ' from ' + conn.remoteAddress + ' ' +

            conn.remotePort);

        conn.write('Repeating: ' + data);

    }); 


    conn.on('close', function() {

        console.log('client closed connection');

    }); 

}).listen(8124);


console.log('listening on port 8124');


5. Client Socket

var net = require('net');


var client = new net.Socket();

client.setEncoding('utf8');


client.connect('8124', 'localhost', function() {

    console.log('connected to server');

    client.write('Who needs a browser to communicate?');

});


process.stdin.resume();

process.stdin.on('data', function(data) {

    client.write(data);

});


client.on('data', function(data) {

    console.log(data);

});


client.on('close', function() {

    console.log('connection is closed');

});


6. dns 찾기

var dns = require('dns');

var querystring = require('querystring');


dns.lookup('burningbird.net', function(err, ip) {

    if (err) throw err;

    console.log(ip);

});


dns.reverse('173.255.206.103', function(err, domains) {

    domains.forEach(function(domain) {

        console.log(domain);

    }); 

});


var url = require('url');

var urlObj = url.parse('http://examples.burningbird.net:8124/?file=main');

console.log(urlObj);


var qs = urlObj.query;

console.log(qs);


var urlString = url.format(urlObj);

console.log(urlString);


var vals = querystring.parse('file=main&file=secondary&type=html');

console.log(vals);


var qryString = querystring.stringify(vals);

console.log(qryString);


7. 객체 상속

var util = require('util');


function first() {

    var self = this;

    this.name = 'first';

    this.test = function() {

        console.log(self.name);

    };  

}


first.prototype.output = function() {

    console.log(this.name);

}


function second() {

    second.super_.call(this);

    this.name = 'second';

}


util.inherits(second, first);


var two = new second();


function third(func) {

    this.name = 'third';

    this.callMethod = func;

}


var three = new third(two.test);


two.output();

two.test();

three.callMethod();     // this 는 three 객체를 참조하지만, var self 변수는 two 객체의 값임


8. EventEmitter 를 활용한 사용자 정의 Event 만들기

var events = require('events');

var em = new events.EventEmitter();

var counter = 0;


setInterval(function() {

em.emit('timed', counter++);

}, 3000);


em.on('timed', function(data) {

console.log('timed ' + data);

});


9. 일반 객체에 사용자 정의 Event 만들기

util.inherits(someobj, EventEmitter);

someobj.prototype.somemethod = function() { this.emit('eventname'); };

someobjinstance.on('eventname', function() { });


var util = require('util');

var eventEmitter = require('events').EventEmitter;

var fs = require('fs');


function inputChecker(name, file) {

    this.name = name;

    this.writeStream = fs.createWriteStream('./' + file + '.txt',

        {'flags': 'a',

         'encoding': 'utf8',

         'mode': 0666});

};


util.inherits(inputChecker, eventEmitter);


inputChecker.prototype.check = function check(input) {

    var command = input.toString().trim().substr(0,3);

    if (command == 'wr:') {

        this.emit('write', input.substr(3,input.length));

    } else if (command == 'en:') {

        this.emit('end');

    } else {

        this.emit('echo', input);

    }   

};


var ic = new inputChecker('Shelley', 'output');


ic.on('write', function(data) {

    this.writeStream.write(data, 'utf8');

});


ic.on('echo', function(data) {

    console.log(this.name + ' wrote ' + data);

});


ic.on('end', function() {

    process.exit();

});


process.stdin.resume();

process.stdin.setEncoding('utf8');

process.stdin.on('data', function(input) {

    ic.check(input);

});






반응형
Posted by seungkyua@gmail.com
,

[ Ubuntu 12.04 LTS 에서 관련 라이브러리 설치 ]

$ sudo apt-get update

$ sudo apt-get upgrade

$ sudo apt-get install build-essential openssl libssl-dev pkg-config


패키지로 설치되어 있는 Nodejs 먼저 제거하기

$ sudo apt-get purge nodejs

$ sudo apt-get autoremove



시스템 전역으로 설치하기 ]

1. source tarball 을 다운받아 설치한다.

http://nodejs.org/dist/ 에서 최신 버전인 node-v0.10.26.tar.gz 을 다운받는다.

$ mkdir Node

$ cd Node

$ wget http://nodejs.org/dist/v0.10.26/node-v0.10.26.tar.gz

$ tar -zxf node-v0.10.26.tar.gz

$ cd node-v0.10.26.tar.gz


$ ./configure            # 다른 디렉토리에 설치하고 싶으면 ./configure --prefix=경로

$ make

$ sudo make install


삭제하고 싶으면

$ sudo make uninstall



2. binary tarball 을 다운받아 설치한다.

http://nodejs.org/dist/latest/ 에서 최신 버전인 node-v0.10.26-linux-x64.tar.gz 을 다운받는다.

/usr/local 아래의 bin, include, lib 등의 디렉토리에 node 관련 파일들을 복사한다.

$ mkdir Node

$ cd Node

$ wget http://nodejs.org/dist/latest/node-v0.10.26-linux-x64.tar.gz

$ tar -zxf node-v0.10.26-linux-x64.tar.gz

$ cd /usr/local

$ sudo tar --strip-components 1 -xzf ~/Node/node-v0.10.26-linux-x64.tar.gz



로컬 설치하기 ]

nvm (Node Version Manager) 를 이용하여 설치한다.


/home/stack/.nvm/v0.10.26 에 설치됨

/home/stack/.profile 파일 맨 마지막에 nvm.sh 명령을 사용할 수 있게 추가됨

$ wget -qO- https://raw.github.com/creationix/nvm/master/install.sh | sh

$ . /home/stack/.profile

$ nvm install v0.10.26                 # Node v0.10.26 버전을 설치

$ nvm run v0.10.26                    # Node v0.10.26 버전을 사용

$ nvm ls                                  # Node 설치버전 리스트 조회 및 현재 사용하는 버전 조회



[ Mac 에 brew 로 설치하기 ]

# xcode 설치

# homebrew 설치

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"


$ brew install node --without-npm

$ vi .bash_profile

export PATH=/usr/local/Cellar/node/5.6.0/bin:$PATH


# npm 설치

$ curl -L https://www.npmjs.com/install.sh | sh



[ npm으로 관련 모듈 설치하기 ]

- 전역 영역에 설치하기 (-g 옵션 사용)

$ npm -g install <모듈명>


- 특정 버전을 설치하기 (0.1 버전)

$ npm -g install <모듈명>@0.1


- 전역 영역에 설치된 모듈 삭제하기

$ npm -g uninstall <모듈명>


- 전체 모듈 업데이트 하기

$ npm update


- 단일 모듈만 업데이트하기

$ npm update <모듈명>


- 최신 버전이 아닌 패키지가 있는지 확인만 하고 싶을 경우

$ npm outdated


- 설치된 모듈 종속 관계 보기

$ npm ls ll





반응형
Posted by seungkyua@gmail.com
,

1. Django 설치하기

$ sudo apt-get install python-django

$ django-admin.py --version


2. Django 프로젝트 만들기

$ django-admin.py startproject django_example


3. Database 연동

$ vi django_example/settings.py


 12 DATABASES = {

 13     'default': {

 14         'ENGINE': ''django.db.backends.sqlite3',

 15         'NAME': 'exampledb',

 16         'USER': '',

 18         'PASSWORD': '',

 19         'HOST': '',

 20         'PORT': '',

 21     }

 22 }


$ python manage.py syncdb


4. 서버 실행

- 서버는 기본으로 8000 번 포트로 실행되므로 포트를 생략할 수 있다.

   $ python manage.py runserver <8000>


5. 프로젝트 만들기

$ python manage.py startapp example


6. view 작성

$ vi example/views.py


  1 # -*- coding: utf-8 -*-      (다국어 표현을 위한 주석)

  2

  3 # Create your views here.

  4 from django.http import HttpResponse

  5

  6 def main_page(request):

  7     output = '''

  8         <html>

  9         <head><title>%s</title></head>

 10         <body>

 11             <h1>%s</h1>

 12         </body>

 13         </html>

 14     ''' % (

 15         'Django Example',

 16         'Hello World !!'

 17     )

 18     return HttpResponse(output)


7. URL 과 view 매핑

$ vi django_example/urls.py


  1 from django.conf.urls import patterns, include, url

  2 from example.views import *

  3

  4 urlpatterns = patterns('',

  6     (r'^$', main_page),

  7 )


8. Model 만들기

- Model 에서 사용하는 Field type

   IntegerField

   TextField

   CharField

   DateTimeField

   EmailField

   URLField

   FileField


- Department 모델 만들기

   $ vi example/models.py


  1 from django.contrib.auth.models import User

  2 from django.db import models

  3

  4 class Department(models.Model):

  5     department_name = models.TextField()

  6     user = models.ForeignKey(User)


- settings 파일에 INSTALLED_APPS 에 APP 을 등록하여 model 활성화

   $ vi django_example/settings.py


116 INSTALLED_APPS = (

117     'django.contrib.auth',

118     'django.contrib.contenttypes',

119     'django.contrib.sessions',

120     'django.contrib.sites',

121     'django.contrib.messages',

122     'django.contrib.staticfiles',

123     'example',

128 )


- Model DB 테이블 생성

   $ python manage.py syncdb


- DDL 문 SQL 확인

   $ python manage.py sql example


- Data 저장 및 확인

   $ python manage.py shell


>>> from example.models import *

>>> from django.contrib.auth.models import User

>>> User.objects.all()


>>> user = User.objects.get(id=1)

>>> print user

>>> dir(user)


>>> department1 = Department(department_name='Cloud Team', user=user)

>>> department1.save()


9. Template 만들기

- template 디렉토리 지정하기

   $ mkdir -p templates

   $ vi django_example/settings.py


  3 import os.path

     ...

112 TEMPLATE_DIRS = (

113     os.path.join(os.path.dirname(__file__), '../templates'),

114 )


- template 파일 만들기

   $ vi templates/main_page.html


  1 <html>

  2 <head><title>{{ title }}</title></head>

  3 <body>

  4     <h1>{{ greeting }}</h1>

  5 </body>

  6 </html>


- view 파일 수정

   $ vi example/views.py


  1 # -*- coding: utf-8 -*-

  2

  3 from django.http import HttpResponse

  4 from django.template import Context

  5 from django.template.loader import get_template

  6

  7 def main_page(request):

  8     template = get_template('main_page.html')

  9     variables = Context({

 10         'title': 'My Example',

 11         'greeting': 'Hello Stephen !!',

 12     })

 13     output = template.render(variables)

 14     return HttpResponse(output)


10. 복잡한 화면 만들기

- url 을 user/username 형식으로 매핑 (username 은 stack 이라는 user 명을 사용)

   $ vi django_example/urls.py


  8 urlpatterns = patterns('',

  9     (r'^$', main_page),

 10     (r'^user/(\w+)/$', user_page),

 11 )


- view 를 수정

   $ vi example/views.py


  3 from django.contrib.auth.models import User

  4 from django.http import Http404


 18 def user_page(request, username):

 19     try:

 20         user = User.objects.get(username=username)

 21     except:

 22         raise Http404('Cant not found user')

 23

 24     dept = user.department_set.all()

 25

 26     template = get_template('user_page.html')

 27     variables = Context({

 28         'username': username,

 29         'department': dept,

 30     })

 31     output = template.render(variables)

 32     return HttpResponse(output)


- page 생성

   $ vi templates/user_page.html


  1 <html>

  2 <head><title>User: {{ username }}</title></head>

  3 <body>

  4     <h1>{{ username }}'s Department</h1>

  5     {% if department %}

  6         <ul>

  7             {% for dept in department %}

  8                 <li>{{ dept.department_name }}</li>

  9             {% endfor %}

 10         </ul>

 11     {% else %}

 12         <p>There's is no department</p>

 13     {% endif %}

 14 </body>

 15 </html>





반응형
Posted by seungkyua@gmail.com
,

1. git 에서 제일 큰 파일사이즈 찾아내서 없애기

$ git count-objects -v    (size-pack 항목이 Packfile 의 크기임)

$ git verify-pack -v .git/objects/pack/pack-3f8c0...bb.idx | sort -k 3 -n | tail -3  (3번째 항목이 파일 크기임)

$ git rev-list --objects --all | grep 7a9eb2fb   (blob(파일)의 이름을 찾는다)

$ git log --pretty=oneline -- git.tbz2   (git.tbz2 파일의 커밋을 찾는다.)

$ git filter-branch --index-filter 'git rm --cached --ignore-unmatch git.tbz2' 6df7640^..  (6df76 이후의 커밋을 모두 재작성 된다)

$ rm -Rf .git/refs/original   (filter-branch 실행의 상태를 삭제)

$ rm -Rf .git/logs/     (Reflog 삭제)

$ git gc


2. 데이터 복구

$ git log --pretty=oneline

$ git reset --hard 1a410e   (이전 커밋으로 복구)

$ git log -g   혹은   git reflog    (HEAD 가 바뀔 때 마다 저장된 기록을 확인)

$ git branch recover-branch ab1afef   (recover-branch를 만듬)

$ git log --pretty-oneline recover-branch

$ git fsck --full   (길잃은 객체를 찾아 줌,  히스토리 중 2번째 칼럼에서 commit 을 찾음)


0. Git 설정

- Windows Git 설치

   http://code.google.com/p/msysgit


- Git config 적용 순서

   1. $ git config

       .git/config

   2. $ git config --global

       ~git/.gitconfig

   3. $ git config --system

       /etc/gitconfig


- Git config 로 조회될 때 중복되어 있으면 나중에 나오는 값이 적용된다.

   $ git config --list


- config 값이 중복될 때 어떤 값이 적용되는지 볼 수 있음

   $ git config <Key이름>


- config 관련 help 보기

   $ git help config


1. 상태 변화

    ※ 신규파일이든 수정한 파일이든 모두 add 해야 한다.

       생성하거나 수정하고 나서 git add 명령으로 추가하지 않은 파일은 commit 하지 않는다.

- 신규 파일을 생성한 경우 : Untracked (Untracked files)

- 신규 파일을 add 한 경우 : Untracked -> Tracked and Staged (Changed to be committed)

   $ git add <file or directory>


- 기존 파일을 수정한 경우 : Tracked and Unstage (Changed but not updated)

- 기존 수정된 파일을 add 한 경우 : Tracked and Unstage -> Staged (Changed to be committed)

   $ git add <file or directory>


- 상태의 변화

   (Untracked : 신규)              (Tracked)

   (Tracked    : 수정)              (Tracked)

    Unstage               -->         Staged          -->         Committed         -->        Remote Repository

                           (git add)                  (git commit)                      (git push)

 

2. 상태 변경 내용 보기

- Staged 와 Unstage (워킹 디렉토리) 상태의 변경 내용 보기

   $ git diff


- Staged 와 Committed (저장소) 상태의 변경 내용 보기

   $ git diff --staged


3. Staged 상태 커밋하기

$ git commit


4. Staging Area 파일 삭제하기

- 워킹디렉토리 파일을 삭제하고 Staged 파일을 삭제한다.

   $ rm <file>

   $ git rm <file>


- Staged 와 워킹 디렉토리 파일 모두 삭제한다.

  $ git rm <file or directory>


- Staged 파일은 삭제하고 워킹 디렉토리 파일은 남겨둔다.

   $ git rm --staged(or cached) <file or directory>


5. 커밋 히스토리 조회하기

- log는 히스토리를 보여주며 -p는 diff 결과를 보여주고 -2는 최근 두 개의 결과만 보여준다

   $ git log -p -2


- since 나 until 을 사용할 수 있다.

   $ git log --since=2.weeks

   $ git log --since="2013-01-01"


- author 나 grep 을 사용할 수 있다.

   $ git log --author="stephen" --grep="local storage"


- 로그를 옵션으로 볼 수 있다.

   $ git log --pretty=oneline (short, full, fuller)


- 로그를 특정 포맷으로 볼 수 있다. (h:hash, an: author name, ad: author date, s: subject)

   $ git log --pretty=format:"%h %s" --graph


- 수정한 파일, 추가된 줄, 삭제된 줄만 표시

   $ git log --shortstat


- 수정된 파일의 목록과 파일을 추가한 것인지, 수정한 것인지, 삭제한 것인지 보여준다

   $ git log --name-status


- HEAD 가 가리켰던 커밋을 조회하기

   $ git reflog

   $ git log -g master


- master 에는 없지만 local-storage 에는 있는 커밋 조회

   $ git log master..local-storage


- 리모트 저장소 master 에는 없고 현재의 브랜치에만 있는 커밋

   $ git log origin/master..HEAD


- git log graph 로 보기

   $ vi ~/.gitconfig


[alias]

lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)\

%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)\

- %an%C(reset)%C(bold yellow)%d%C(reset)' --all

lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)\

%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)\

%C(bold yellow)%d%C(reset)%n''          %C(white)%s%C(reset) %C(dim white)\

- %an%C(reset)' --all

lg = !"git lg1"


6. 되돌리기

- 커밋 한 후 빠진 파일을 다시 포함시키거나, 커밋 메세지를 수정할 때, 커밋을 합치고 싶을 때 마지막 커밋으로 모두 덮어쓴다.

   $ git commit --amend


- Staged 상태 파일을 Unstage (워킹 디렉토리에만 수정된 상태)로 되돌리기

   $ git reset HEAD <file>


- Unstage (워킹 디렉토리에만 수정된 상태)를 Commit (저장소)와 동일한 초기 상태로 되돌리기

   $ git checkout -- <file>


- 커밋을 취소하기 

   $ git reset HEAD^            최종 커밋을 취소, 워킹 디렉토리를 보존

   $ git reset HEAD~2          마지막 2개의 커밋을 취소, 워킹 디렉토리를 보존

   $ git reset --hard HEAD~2 마지막 2개의 커밋을 취소, 워킹 디렉토리와 Staged 모두 취소

   $ git reset --hard ORIG_HEAD    머지한 것을 커밋했을 때 취소

   $ git revert HEAD        커밋을 push 했을 때 HEAD에 변경한 내용을 취소하는 커밋 추가 


7. 리모트 저장소

- 리모트 저장소 리스트 보기, Clone 으로 가져온 저장소의 이름은 origin 으로 자동으로 붙혀진다.

   $ git remote -v


- 리모트 저장소 추가하기

   $ git remote add <리모드 저장소 별명> <URL>


- 리모트 저장소의 브랜치 포인터를 로컬로 가져오기

   fetch 는 실제 데이터를 가져오는 것이 아니라 리모트 브랜치에 대한 모든 정보를 가져와 포인터가 생기는 것

   $ git fetch <리모트 저장소 별명>


- 리모트 저장소 Branch 의 데이터를 가져와서 자동으로 로컬에 머지하기

   $ git pull <리모트 저장소 별명> <리모트 브랜치 이름>:<로컬 브랜치 이름>


- 리모트 저장소에 브랜치 데이터를 올리기

   $ git push <리모트 저장소 별명> <로컬 브랜치 이름>:<리모트 저장소 브랜치 이름>

   $ git push


- 로컬의 local-storage 브랜치를 리모트 저장소 origin 에 storage 브랜치라는 이름으로 올리기

   $ git push origin local-storage:storage


- 리모트 저장소 상세보기

   push 할 때 와 pull 할 때 어떤 브랜치로 작동하는지 보여준다.

   $ git remote show <리모트 저장소 별명>


- 리모트 저장소 이름 바꾸기

   $ git remote rename <현재 이름> <바꿀 이름>


- 리모트 저장소 삭제하기

   $ git remote rm <리모트 저장소 별명>


8. 태그

- 태그 조회하기

   $ git tag


- 1.x 버전의 태그를 조회하기

   $ git tag -l '1.*'


- 태그 1.1 붙히기

   $ git tag 1.1


- 특정 commit 에 대해서 태그 붙히기

   $ git tag -a 1.1 <체크섬>


- 리모트 저장소에 태그 데이터 올리기

   $ git push <리모트 저장소 별명> <태그 이름>


- 리모트 저장소에 모든 태그를 올리기

   $ git push <리모트 저장소 별명> --tags


9. 브랜치

- HEAD 는 현재 작업하는 로컬 branch 를 가리키는 포인터


- 브랜치 생성하기

   $ git branch local-storage


- 생성한 브랜치로 이동하기

   $ git checkout local-storage


- 브랜치를 만들고 생성한 브랜치로 이동하기

   $ git checkout -b local-storage


- checkout 으로 브랜치를 바꾸면 워킹 디렉토리의 파일들을 추가, 삭제, 수정하여 이전 스냅샷으로 돌린다.


- 브랜치 삭제하기 (Merge 하지 않은 브랜치는 삭제되지 않음)

   $ git branch -d local-storage


- 브랜치 삭제하기 (Merge 하지 않은 브랜치도 강제로 삭제하기)

   $ git branch -D local-storage


- 브랜치 리스트 조회하기

   $ git branch


- 브랜치 리스트에 마지막 커밋 메세지까지 조회하기

   $ git branch -v


- 현재의 브랜치에 Merge 하지 않은 브랜치 보기

   $ git branch --no-merged


- 리모트 저장소의 브랜치를 로컬 브랜치로 Tracking 하여 생성하기 (둘 중 하나를 사용)

   $ git checkout -b local-storage origin/local-storage

   $ git checkout --track origin/local-storage


- 리모트 브랜치 삭제하기 (리모트의 local-storage 라는 브랜치 삭제)

   $ git push origin :local-storage


9. Merge 하기

- Merge 하기 위해서는 중심이 되는 브랜치로 이동 후 합친다. (여기서 master 에 local-storage를 합치기)

   $ git checkout master

   $ git merge local-storage


- 리모트 저장소의 브랜치를 로컬의 현재 브랜치에 합치기 (여기서는 master 에 리모트 local-storage를 합치기)

   $ git checkout master

   $ git merge origin/local-storage


- Merge 시 Conflict 발생하면 상태를 확인

   $ git status


- 리모트 저장소의 master 가 수정되었을 때 로컬 master 와 Merge 하기

   $ git fetch origin

   $ git merge origin/master


- 브랜치 (local-storage)를 만든 후 리모트 저장소의 master 가 변경되고, 브랜치에서 개발 한 후 리모트 master 와 브랜치 commit 차이를 보고 Merge 하기 ( Merge 는 브랜치든 master든 둘 중 아무거나 먼저한다.)

   $ git fetch origin

   $ git log --no-merges origin/master ^local-storage


   $ git checkout master

   $ git merge local-storage

   $ git merge origin/master 


10. Rebase 하기

      ※ 리모트 저장소에 Push 한 내용을 Rebase 하면 안된다.

- Rebase 하기 위해서는 개발한 브랜치로 이동 후 중심이 되는 브랜치로 rebase 한다.

  (여기서는 local-branch 에서 개발하는 중간에 master 에 최신 내용들을 local-branch 에 합친다)

   $ git checkout local-branch

   $ git rebase master


- Master 에서 브랜치 (local-storage)를 만들고, 또 여기서 추가로 브랜치 (storage)를 만들어 storage 브랜치를 먼저 rebase 하고 local-storage 를 rebase 한다.

   $ git rebase --onto master local-storage storage

   $ git checkout master

   $ git merge storage


   $ git rebase master local-storage

   $ git checkout master

   $ git merge local-storage








반응형
Posted by seungkyua@gmail.com
,

1. Dictionary 안에 Dictionary 가져올 때

scheduler_hints = filter.properties.get('scheduler_hints') or {}

group = scheduler_hints.get('group', None)


or


if snapshot:

    try:

        availability_zone = snapshot['volume']['availability_zone']

    except (TypeError, KeyError):

        pass


2. Dictionary arguments 로 부터 가져올 때

execute(self, context, **kwargs):

    scheduler_hints = kwargs.pop('scheduler_hints', None)


3. exception 처리

try:

    ...

    return {

        'reservation': reservations,

    }

except exception.OverQuota as e:

    overs = e.kwargs['overs']

    quotas = e.kwargs['quoata']

    if _is_over('gigabytes'):

        msg = _(Quota exeeded for %(s_pid)s.")

        LOG.warn(msg % {'s_pid : context.project_id})

        raise exception.VolumeSizeExeedsAvailableQuota(

            requested=zise)

    elif _is_over('volumes'):

        raise exception.VolumeLimitExceeded(allowed=quotas['volumes'])

    else:

        raise


4. package 아래 특정 파일을 default 로 지정하는 방법

[ package 구조 ]

-- cinder

    -- db

        -- __init__.py

        -- api.py

        -- base.py


db 아래의 api.py 의 quota_get() function 을 호출하고자 할 때


cinder/db/__init__.py 에 다음과 같이 설정

from cinder.db.api import *


사용하고자 하는 파일에서 다음과 같이 사용

from cinder import db

...

db.quata_get()


혹은

[ package 구조 ]

-- nova

    -- virt

        -- libvirt

            -- __init__.py

            -- driver.py    (여기에 LibvirtDriver 클래스를 사용하고자 함)

            -- vif.py


nova/virt/libvirt/__init__.py 에 다음과 같이 설정

from nova.virt.libvirt import driver

LibvirtDriver = driver.LibvirtDriver


이렇게 설정하면 nova.virt.libvirt.LibvirtDriver 클래스를 읽어들어서 사용할 수 있음


5. dictionary 가 null 일 수 있을 때 null 을 회피하고 기본{} 값을 넣는 법

migrate_data = dict(migrate_data or {})


6. set 기본값 생성

block_device_mapping = set()


7. String 합치기, String 좌우 스페이스를 없애기

import_value = "%s.%s" % (name_space, import_str)

s = s.strip()


8. String 을 특정 delemeter 로 우측 string 을 구분하기, String 을 delemeter로 구분하여 List 에 담기

mod_str, _sep, class_str = import_str.rpartition('.')

flaglist = CONF.libvirt.live_migration_flag.split(',')


9. class 나 function 자체를 변수에 넣고 사용하고 싶을 때

getattr(import 모듈경로, 클래스명)   => .py 파일에 class 가 있을 때

getattr(import 모듈경로, 함수명)      => .py 파일에 def 함수가 바로 있을 때


__import__('nova.virt.libvirt')            => 모듈을 import

class_LibvirtDriver = getattr(sys.modules['nova.virt.libvirt'], 'LibvirtDriver')    +. 클래스를 로딩하여 리턴


10. xml 파싱

from lxml import etree


doc = etree.fromstring(xml)

disk_nodes = doc.findall('.//devices/disk')


11. list 를 순번과 값으로 순차적으로 가져오기

for cnt, path_node in enumerate(['a', 'b'])

print cnt

print path_node



12. list 를 Json string 으로 만들기

from nova.openstack.common from jsonutils


disk_info = []

disk_info.append({'type': 'block',

                          'path': '/dev/disk/by-path/ip-192.168.230.136:3260-iscsi-iqn.2010-10.org.openstack:volume-1000de04-6603-41d8-bae4-7bc16af0bc15-lun-1',

                          'virt_disk_size': 0,

                          'backing_file': '',

                          'over_committed_disk_size': 0})

disk_info = jsonutils.dumps(disk_info)


13. Class 를 Json String 으로 만들기

from nova.openstack.common from jsonutils


instance = jsonutils.to_primitive(instance)


14. 리스트의 내용을 조건절로 걸러내고 새로운 리스트에 담기

bdms = [bdm.legacy() for bdm in block_device_mapping if _has_legacy(bdm)]


15. 로직 중간에 새로운 쓰레드 생성하기

from eventlet import greenthread


greenthread.spawn(self._live_migration, context, instance, dest .......)


def _live_migration(self, context, instance, dest .......)


16. list 의 값을 하나의 string 으로 만들기

cmd = ('ssh', 'host')

cmd = ' '.join(cmd)






반응형
Posted by seungkyua@gmail.com
,