import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JApplet;
import javax.swing.JPanel;

public class MyApplet extends JApplet {
 MyPanel p = new MyPanel();

 public MyApplet() {
  setContentPane(p);
 }

 public void init() {
	 // String value = getParameter("font");
	 // p.setFSize(Integer.parseInt(value));	 
	 p.repaint();
 }

 public void start() {
 }

 public void stop() {
 }
}

class MyPanel extends JPanel {
 int fSize = 40;

 public MyPanel() {
  setBackground(Color.YELLOW);
 }

 void setFSize(int s) {
  fSize = s;
 }

 public void paintComponent(Graphics g) 
 {
	  super.paintComponent(g);
	  g.setColor(Color.RED);
	  g.setFont(new Font("Ravie", Font.ITALIC, 40));
	  g.drawString("Hello", 100, 100);
 }
}
블로그 이미지

맨오브파워

한계를 뛰어 넘어서..........

,

Java에서 대량의 자료를 추가/삭제하며 처리하기 위해서는 무엇을 사용해야 할까요?

연구실에서 Java를 한번쯤 공부해 본 사람이라면 보통 “Vector Class”라고 대답을 할 것입니다. 정답이죠. Vector Class는 대량의 자료를 가질수 있으며, 추가/삭제또한 자유롭게 처리가 가능합니다. 그럼 뭐가 문제라서 이런 글을 쓰는것일까요?

단순히 “처리되는가” 를 넘어서 “빠르게 처리할수 있는가” 를 생각해 본다면,
위에서의 대답 “Vector Class” 는 X에 가까운 답이라고 할 수 있기 때문입니다.

우선, Java에서 제공하는 “대용량 자료처리 개념” 은 여러가지 상위 인터페이스를 통해서 구현할 수 있습니다. (Collection, Iterator, Enumeration, Map등등) 각각 독특한 특징을 가지고 있습니다만, 이번에 다룰 내용은 Collection이하의 객체들이 되겠습니다.(나머지에 대해서도 다음 기회에 이야기 하도록 하겠습니다.)

Collection Interface는 “내부에 포함되는 요소는 순서를 가진다” 라는 특징을 가지고 있습니다. (이와 반대로 포함요소가 순서에 관계없이 저장되는녀석이 Map계열입니다.)
Collection을 계승(상속)해서 실제 구현된 객체들도 여럿 있습니다만, 그중에서도 대표적인 ArrayList, LinkedList, Vector 의 특징을 간단하게 설명하면 다음과 같습니다.
(HashSet, TreeSet같은 특이한 녀석들도 있습니다만… 일반적인 경우에 사용되는 녀석들은 아닌관계로, 설명은 다음기회로 넘기겠습니다…)

사용자 삽입 이미지

1. Vector

Java 1.0때 만들어져, 지금까지 유지되어온 클래스.
1.0버젼에서는 지금과 같은 List관련 객체들은 없었습니다.
이 버젼대에서 애용되었던 것이 Vector입니다.

Vector의 기본적인 동작은 다음에 설명할 ArrayList와 동일하기 때문에 넘어가기로 하고, 다른점만 설명하겠습니다.
Vector와 이후에 등장하는 List객체의 다른점은 “동기화(synchronize)”처리에 있습니다.
우선 “동기화” 라고 하는 개념에 대해서 간단하게 짚고 넘어가도록 하겠습니다.

두명의 학생이 하나의 컴퓨터를 사용하려고 합니다. 사용순서에 제한이 없기 때문에 서로 먼저 사용하려고 싸우게 되죠. 그러다보니 다음과 같은 상황이 발생합니다. 학생A가 워드로 “가나다라마바사…. ”를 적고 있는도중에 학생B가 키보드를 가로채서 “ABCDEFG…”를 입력해 버립니다. 두 학생은 하나의 자원(컴퓨터)를 공유하지만, 사용 순서에 대한 제한이 전혀 없기때문에 서로 상대방의 자료를 덮어써 버리는 일이 발생하게 되죠.
이것을 방지하기 위해서 자바에서는 synchronized 라는 키워드를 만들어 두었습니다. 이 키워드를 사용하면 공통된 자원에 접근하는것은 [반드시 한번에 하나!] 라는 조건이 붙게 되죠. 한 스레드(학생A)이 공유자원(컴퓨터)에 작업을 마치기 전 까지는 다른 스레드(학생B)가 공유자원(컴퓨터)에 접근을 할 수 없도록 약속해 버리는 것입니다. 이런 과정을 “동기화” 라고 합니다.

복수의 스레드로부터 데이터의 추가/삭제처리가 이루어졌을경우에도 내부의 데이터는 “안전”하게 한번에 한 스레드씩 처리가 이루어지도록 되어있다는 것이죠. 데이터의 안정성을 놓고 보았을때, 정말 좋은 일이 아닐수 없습니다.
… 만, 동기화가 문제시 되는 경우는 어디까지나 “공유자원”과 “복수사용자” 가 존재할때 성립되는 것입니다. 한개의 자원을 하나의 스레드가 사용하는 경우에도 동기화를 고려해서 처리를 하게 되면, 오히려 성능의 저하를 가져오게 되는 문제가 발생하죠. Vector의 경우는 “무조건 동기화” 이기 때문에 단일 스레드 처리에서는 앞으로 설명할 ArrayList나 LinkedList보다 성능이 떨어집니다. 자바 1.2 부터의 Vector의 주 사용목적은 1.0버젼과의 호환성이라고 생각하시는게 가장 좋을겁니다. 거의 쓸 일이 없다는 거죠. 혹시 동기화처리가 필요한 경우는 Vector를 이용하기 보다는 Collection. synchronizedCollection(Collection c)나synchronizedList, Map을 이용하는것이 성능상 바람직하겠습니다.

2. ArrayList

Java2 (1.2)에서 새로이 도입된 Collection의 구현객체입니다.

자료의 추가/삭제 등 기본적인 기능은 Vector와 동일하나, 내부적인 자동 동기화 기능이 삭제되어있죠. 때문에 다수의 스레드 환경에서 사용하기 위해서는 Vector설명에서 이야기했었던 Collection. synchronizedCollection(Collection c)를 이용해서 동기화 옵션을 설정해 주면 됩니다.
이름에서 알 수 있듯이, 내부적으로 자료를 Array(배열)구조로 가지고 있는 객체이죠. 데이터의 추가 / 삭제를 위해서 내부적 임시배열을 작성후 데이터를 복사하는 방법을 사용하고 있습니다.

사용자 삽입 이미지

때문에, 대량의 자료를 추가 / 삭제하는 경우에 내부적인 처리량이 늘어나서 상당한 성능저하를 가져옵니다. (C에서 배열에 데이터 추가/삭제 해 보신분은 아시리라 믿습니다.)
대신, 각 데이터의 인덱스를 가지고 있기 때문에, 필요한 데이터에의 접근이 한번만에 가능하죠. (C에서 포인터를 이용해서 한방에 원하는 데이터에 접근하는것과 같습니다.)
보통, 많은 데이터를 한번에 몽땅 가져와서 여러번 참조해 쓸 때 최상의 성능을 나타내는 객체가 되겠습니다.
간단한 예로 정리를 하면,
물건을 사기위해서 5명의 사람이(손님 A,B,C,D,E) 의자에 앉아 차례를 기다리고 있는데,미리 순서를 예약해 둔 F라는 사람이 C의 앞에 불쑥 들어서서 자리를 비켜달라고 합니다. 예약을 했기때문에 C는 비켜야 하죠. 결국, C는 D의 자리로. D는 다시 E손님의 자리로 한칸씩 밀려나게 됩니다. 그럼 E는? 의자 옆에 빈 공간에 쭈그려 앉던지, 아니면 새로 의자를 요구해야 하겠죠.
이런 손님이 몇백명 있을경우에 도중에 한사람이 끼어들게 되면 뒤로 밀려야 할 사람의 수가 장난이 아니겠죠? 그런 처리를 내부적으로 해 주는것이 ArrayList객체가 되겠습니다.

 

3. LinkedList

연구실에서 C를 배우고 계시거나, 이미 C단계를 지나신 분들이 이해하기 쉬운 말로 바꾸면 “연결리스트” 입니다. 앞과 뒤의 구조체 주소를 가진 녀석들이 죽 ~ 나열된 모습. 그것이 바로 LinkedList객체의 실체입니다.

사용자 삽입 이미지

LinkedList의 내부구현


이녀석은 순서대로 늘어선 것이 아니라, 다음에 나올 자료의 위치정보만 가지고 있습니다. (앞과 뒤 모두 가진 객체도 있습니다.) 자기가 몇번째인지의 정보는 관심도 없죠.
Vector, ArrayList같이 인덱스정보를 가진 녀석들과의 차이점은 무엇일까요?
바로 추가 / 삭제의 용이함에 있습니다.

사용자 삽입 이미지

LinkedList에서의 데이터 추가


위의 그림에서 알 수 있듯이, 어떤 정보를 도중에 추가하기 위해서 다른 정보들을 뒤로 밀어내는 처리가 필요없습니다. 간단하게 글로 표현해 보면,
A-B-C-D 4명이 눈을 가린채, 서로 손을 잡고 있다고 하죠. 손을 잡기 전에 서로 다음에 오는 사람이 누군지만 확인을 한 상황입니다. 이 상태에서 E라는 사람을 B다음에 세우려면 어떻게 해야 할까요?
간단합니다. B의 손을C가 아닌 E를 잡도록 하고, E의 손이 C를 잡도록 살짝~ 도와만 주면 끝입니다. 요것이 LinkedList내부의 추가 처리입니다.(삭제는 역순임으로 설명은 생략)
데이터의 추가가 빈번하게 일어나는 자료를 처리하기 위한 객체라고 할 수 있습니다. 하지만, 데이터의 검색면에서는 어떨까요?

사용자 삽입 이미지

LinkedList에서의 데이터 검색

조금전의 예 – 손을 마주잡고있는 사람들 A-B-E-C-D 중에서 C를 찾아내서 물어볼것이 있습니다. 이 경우 어떻게 해야 하나요? ArrayList의 경우는 “몇번째 녀석이 C이다. “ 라는 목록을 내부적으로 가지고 있기 때문에 한번에 접근이 가능합니다. ... 만, LinkedList는 그런 목록을 가지고 있지 않기때문에, 최초의 정보A로부터 하나씩 검토를 해 나가야만 합니다.
A에게가서 C의 위치를 물어봐도 A는 B가 어디있는지 밖에 모르기때문에 B에게 가서 다시 C의 위치를 물어봐야 합니다. B는 E의 위치밖에 모르니 E에게 가서 또 물어봐야 하죠. 결국 E가 C의 위치를 알려주게 됩니다만… 확률적으로 n개의 데이터가 들어있을경우에 운이 좋으면 1번에, 운이 나쁜경우는 n번 움직여야만 원하는 데이터를 찾을 수 있게 됩니다. 데이터의 검색에는 그다지 적합하지 않은 녀석이죠.
(자료구조 같은 과목에서 검색패턴에 대한 좋은 이야기를 많이 들을 수 있을거에용~ ^^)

이야기를 정리하면,

  • Vector – 구버젼 호환용. 그다지 사용되지 않음. 동기화 처리가 내부적으로 일어남으로 다른 객체보다 무거움.

  • ArrayList – 배열의 복사에 의한 데이터 저장처리를 내부적으로 행하며, 각 데이터에 대한 인덱스를 가지고 있기때문에 검색이 매우 빠르다. 다만, 많은 데이터의 추가 / 삭제시에는 배열의 복사가 빈번하게 일어나, 성능이 떨어지는 단점이 있다.

  • LinkedList – 다음 자료의 위치정보를 가지며, 내부적인 인덱스는 가지고 있지않다. 데이터의 추가 / 삭제는 위치정보의 수정만으로 가능하기 때문에 많은 정보의 추가 / 삭제처리가 필요할때 유용하다. 다만, 데이터가 많은 경우의 검색시 처음 자료로부터 순차적으로 찾아 나가야 하기 때문에 느려지는 단점이 있다.

아직 설명하지 못한 많은 저장 객체들이 존재합니다만…
일반적으로 사용되는 3가지에 대해서 간단하게 적어보았습니다.
왜 비슷한 기능을 가진 녀석들이 여러개 존재하는걸까~ 라고 생각하신다면 각각의 객체가 가지는 특징과 성능차에 대해서 공부해 보는것도 좋을거라고 생각합니다.

실제로 프로그램이라는건 “동작” 하는건 당연한거죠. 보다 좋은 “성능”을 낼 수 있느냐가 중요하다고 생각합니다.
0.01초의 성능차이도 동작하는 환경에 따라서는 생명선이 될 수도 있으니까요.

모두들 좀 더 재밌게~ 그리고 깊게 공부하시는데 조금이나마 보탬이 되었으면~

하는 마음에서 간단하게 적어보았습니다. ~  m(_ _)m

원본 - http://shagall.tistory.com/36

블로그 이미지

맨오브파워

한계를 뛰어 넘어서..........

,

STL 컨테이너는 각각 자신만의 특징을 가지고 있습니다. 각 컨테이너의 특징은 성능('시간 복잡도' '공간 복잡도')
STL
여러 요소에 영향을 주기 때문에 각 컨테이너의 특징을 이해하는 것은 상당히 중요합니다. 그래야 자신의 프로그램에 맞는 적절한 컨테이너를 선택하여 사용할 수 있습니다
.

vector
의 주요 특징은 앞장에서 배운 것처럼 '시퀀스 컨테이너'이면서 '연속 메모리 기반 컨테이너'입니다
.
또 컨테이너에 데이터가 삽입될수록 메모리가 자라나게 됩니다. 연속 메모리 기반이므로 메모리가 자라나면

기존 메모리를 삭제하고 새로운 메모리를 재할당하여 사용합니다.

v.size() = 인덱스 사이즈
v.clear() =
초기화
v.capacity() =
할당된 메모리 공간 크기 보기
v.empty() =
비어있는지 확인 true/false
v.push_back(data) =
끝에 자료 추가

v.pop_back() =
끝에꺼 삭제
v.erase( v.begin() + 3) = 3
번째 내용 삭제
v.insert( v.begin()+0, "aa") = 0
번째 aa추가
v.reserve( 10 ) = capacity(
공간 크기 설정)
v.begin() =
시작위치
iterator
v.end() =
끝위치
iterator
v.swap( vector) = 
벡터간 SWAP

 

전형적 일반 벡터 생성하기
vector< Templete > v; // v
란 이름으로 < > 타입의 벡터 리스트를 생성하기


생성자를 이용한 메모리공간과 크기 확보하여 초기화 생성하기
vector<int> v(10);
v.size() // 10개의 빈공간이 생성되잇다.


간단한 예제

#include<iostream>
#include<vector>
using namespace std;

int main()
{
        vector<
int> i_list; //
벡터 변수 선언
        i_list.push_back(10);//
끝에 추가
        i_list.push_back(20);
        i_list.push_back(
30);

       
for(int i=0;i<i_list.size();i++)
               
if( !i_list.empty() )
                        cout <<
"size: " << i_list.capacity() << " content: " << i_list[i] << endl;

        i_list.erase(i_list.begin()+
1); // 1
번인덱스 삭제
        i_list.insert(i_list.begin()+1, 20); // 1
번째 인덱스에 자료 추가

        i_list.pop_back(); //
끝에꺼 삭제

        i_list.clear(); //
완전삭제
        return 0;
}


반복자를 이용한 벡터 접근하기

#include<iostream>
#include<vector>
using namespace std;

int main()
{
    vector<
int> v;

   
for(int i = 0 ; i < 10 ; i++)
        v.push_back(i);

    vector<
int>::iterator iter;

   
for( iter = v.begin() ; iter != v.end() ; iter++)
        cout << *iter << endl;

    cout << *iter << endl;
    cout << *iter+
1 << endl;
    cout << *iter+
2 << endl;
   
return 0;
}

#include<iostream>
#include<vector>
using namespace std;

int main()
{
    vector<int> v;

    for(int i = 0 ; i < 10 ; i++)
        v.push_back(i);

    vector<int>::iterator iter;

    for( iter = v.begin() ; iter != v.end() ; iter++)
        cout << *iter << endl;

    cout << *iter << endl;
    cout << *iter+1 << endl;
    cout << *iter+2 << endl;
    return 0;
}

 

블로그 이미지

맨오브파워

한계를 뛰어 넘어서..........

,
#pragma comment(lib,"ws2_32.lib")
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <process.h>
#define BUFSIZE 1024

int main(int argc, char** argv){
    WSADATA wsaData;
    SOCKET hServSock;
    SOCKET hClntSock;

    HANDLE hThread;
    DWORD dwThreadID;

    SOCKADDR_IN servAddr;
    SOCKADDR_IN clntAddr;
    int clntAddrSize;

    if(argc != 2){
        printf("Usage: %s <port> \n", argv[0]);
        exit(1);
    }
    if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
        ErrorHandling("WSAStartup() error!");

    hServSock = socket(PF_INET, SOCK_STREAM, 0);
    if(hServSock == INVALID_SOCKET)
        ErrorHandling("socket() error");

    memset(&servAddr, 0, sizeof(servAddr));
    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servAddr.sin_port = htons(atoi(argv[1]));

    if(bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
        ErrorHandling("bind() error");

    if(listen(hServSock, 5) == SOCKET_ERROR)
        ErrorHandling("listen() error");

    while(1){
        clntAddrSize = sizeof(clntAddr);
        hClntSock = accept(hServSock, (SOCKADDR*)&clntAddr, &clntAddrSize);
        if(hClntSock == INVALID_SOCKET)
            ErrorHandling("accept() error");

        printf("연결 요청: %s:%d \n", inet_ntoa(clntAddr.sin_addr), ntohs(clntAddr.sin_port));

        hThread = (HANDLE)_beginthreadex(NULL, 0, ClntConnect, (void*)hClntSock, 0, (unsigned int*)&dwThreadID);
        if(hThread == 0){
            puts("쓰레드 생성");
            exit(1);
        }
    }

    WSACleanup();
    return 0;
}

DWORD WINAPI ClntConnect(void* arg){
    SOCKET hClntSock = (SOCKET)arg;
    char buf[BUFSIZE];

    recv(hClntSock, buf, BUFSIZE, 0);
    send(sock, protocol, strlen(protocol), 0); 

    return 0;
}

void ErrorHandling(char* message){
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}
블로그 이미지

맨오브파워

한계를 뛰어 넘어서..........

,

#pragma 키워드는 컴파일러 제작 회사가 특정 플랫폼에 의존하는 기능을 확장하기위해 기능을 추가한 키워드이다.

해당 컴파일러가 지시명을 인식하지 못한다면 에러 또는 경고 메세지를 수반하지 않고서 #pragma의 지시를 무시하게  된다.

 

#pragma 옵션

  옵션

  설명

 allock_text

 

 comment

 코드 안에 특별한 주석을 기입함

 init_seg

 

 optimize

 

 auto_inline

 

 component

 

 inline_depth

 

 pack

 변수 정렬을 인위적으로 변경

 bss_seg

 

 data_seg

 다른 파일에서 데이터를 공유하고자할때

 inLine_recursion

 

 pointers_to_members

 

 check_stack

 

 function

 

 intrinsic

 

 setlocale

 

 code_seg

 

 hdrstop

 

 message

 컴파일시 메시지를 출력함

 vtordisp

 

 const_seg

 

 include_alias            

 

 once

 해당 파일이 한번만 포함

 warning

 컴파일러 경고 메시지를 만들거나 안보이게 함

 link

 실행화일에 파일을 링크

 

#pragma once

ex> #pragma once

전처리기가 이 행을 처리하려고 할 때, 이 파일은 오직 한 번 추가되어야 한다는 것을 알게 된다.

 

#pragma pack

ex>

#pragma pack(n)   //n으로 정렬방식을 바꾼다.

#pragma pack()     //Default 정렬방식을 바꾼다.

#pragma pack(push, n)  //n의로 정렬 방식을 바꾸고 기존정렬방식을 스택에 저장한다.
#pragma pack(pop)       //
스택에 저장한 정렬방식으로 다시 돌린다.

 

pack 지시자는 이 후 부터 선언되는 구조체의 정렬 방식을 지정하는 것이다. n은 컴파일러가 저장된 메모리에 데이터를 정렬하는 방법을 결정하는 byte의 크기이다.

 

ex>

#pragma pack(1)

typedef struct _TEST_STRUCT
{
    char CharValue;   
//1byte
    char CahrValue2;  //1byte
    int  IntValue;         //4byte
    char* pCharValue; //4byte
    int* pIntValue;       //4byte

} TEST_STRUCT, *PTEST_STRUCT;
#pragma pack()

 

위 구조체를 sizeof() 로 구조체의 크기를 알아보면 문제가 있음을 알 수 있다. 위 구조체의 크기는 14byte이다. 하지만 sizeof()로 크기를 알아보면 16byte로 나타나는 것을 알 수 있다. 이 떄 pack을 사용하면 빈공간 없이 14byte로 구조체가 선언된것을 알 수 있다.

 

#pragma warning

ex>

 

#pragma warning (disable:4101)                            // 경고를 무시하도록 한다.

#pragma warning (once:4101)                               // 4101경고를 한 번만 출력한다.

#pragma warning (error:4700)                                          // 경고 대신 에러를 출력한다.

#pragma warning (3:4706)                                     // 4706번 경고를 레벨 3으로 올린다.

이 지시자는 컴파일시 나오는 경고를 설정한다. 이것으로 매 컴파일 마다 나오는 경고를 없애거나 한번만 나오게 할 수있다.

제어문

설명

once : 번호

반복되는 경고를 번만 출력한다.

default : 번호

원래 설정대로 되돌린다.

disable : 번호

경고를 출력하지 않는다.

error : 번호

경고를 에러로 처리한다.

level : 번호

경고의 레벨(1~4) 변경한다.

push[,n]

모든 경고의 레벨을 저장한다. n 있을 경우 저장과 동시에 전역 경고 레벨을 n으로 변경한다.

pop

스택에 마지막으로 저장된 경고 레벨을 복원한다.

 

#pragma comment

ex>

#pragma comment(lib, "d3d8.lib")

 

이 지시자는 해당 옵션에 따라 다양한 주석문 및 문자를 코드에 추가한다.

  옵션

  설명

 lib

 코드 내에서 명시적으로 라이브러리의 링크를 지정해준다

 exestr

 기록된 string 실행파일 내부에 기록되어지며, 이것은 결코 메모리로 load되지 않는다. 다만 파일 검색 유틸리티를 사용하여 실행파일에서 string 찾아볼 수 있다.

 user

 ".OBJ" file string을 기록합니다. 하지만 linker에 의해 string은 무시되어집니다. object 파일에만 그 내용이 남게 됩니다

 

#pragma data_seg

ex>

#pragma data_seg(".mine$a")  //.mine 명으로 공유, Section 이름은 8자 또는 그 이하로 해야한다.
int g_nCount1 = 0;

#pragma data_seg(".mine$z")  //'$' 기호 전에 동일 이름인 섹션들은 한 개의 섹션으로 통합이 된다. 여기서 통합의 순서는

                                               '$'다음의 문자 정렬로 순서를 결정한다.
int g_nCount2 = 0;
#pragma data_seg()               
//Default
로 복원

 

 #pragma comment( linker, "/SECTION:.mine, RWS" )  // R:Read, W:Write, S:Shared

 

우선은 공유할 데이터(변수) Global 변수로 선언하고 #pragma data_seg 위와 같이 추가한 다음 Linker 코드를 추가하면 g_nCount1 g_nCount2데이터를 DLL 외부에서 공유할 수 있게 된다.

 

#pragma link

ex>

#pragma comment( linker, "/SECTION:.SHAREDATA, RWS" )  // R:Read, W:Write, S:Shared

 

이 지시자는 실행파일에 해당 파일을 Link 시킨다.

옵션

 설명

/ALIGN:number

Specifies the alignment of each section

/BASE:{address | @filename,key}

Sets a base address for the program

/COMMENT:["]comment["]

Inserts a comment string into header

/DEBUG

Creates debugging information

/DEBUGTYPE:CV
/DEBUGTYPE:COFF
/DEBUGTYPE:BOTH

Creates particular formats of debugging information

/DEF:filename

Passes a module-definition (.DEF) file to the linker

/DEFAULTLIB:library

Searches specified library when resolving external references

/DELAY

Controls the delayed loading of DLLs

/DELAYLOAD

Causes the delayed loading of the specified DLL

/DLL

Builds a DLL

/DRIVER[:UPONLY]

Creates a Windows NT kernel mode driver

/ENTRY:function

Sets the starting address

/EXETYPE:DYNAMIC

Builds a virtual device driver

/EXPORT

Exports a function

/FIXED[:NO]

Creates a program that can be loaded only at its preferred base address

/FORCE[:{MULTIPLE|UNRESOLVED}]

Forces link to complete in spite of unresolved or multiply defined symbols

/GPSIZE:#

Specifies the size of communal variables for MIPS and Alpha platforms

/HEAP:reserve[,commit]

Sets the size of the heap in bytes

/IMPLIB:filename

Overrides the default import library name

/INCLUDE:symbol

Forces symbol references

/INCREMENTAL:{YES|NO}

Controls incremental linking

/LARGEADDRESSAWARE

Tells the compiler that the application supports addresses larger than two gigabytes.

/LIBPATH:path

Allows the user to override the environmental library path

/LINK50COMPAT

Generates import libraries in Visual C++ Version 5.0 format

/MACHINE:{IX86|ALPHA|ARM|MIPS|MIPSR41XX|PPC|SH3|SH4}

Specifies the target platform

/MAP

Creates a map file

/MAPINFO:{EXPORTS|FIXUPS|LINES}

Includes the specified information in the map file

/MERGE:from=to

Combines sections

/NODEFAULTLIB[:library]

Ignores all (or specified) default libraries when resolving external references

/NOENTRY

Creates a resource-only DLL

/NOLOGO

Suppresses startup banner

/OPT:{REF|NOREF|ICF[,iterations]|NOICF}

Controls LINK optimizations

/ORDER:@filename

Places COMDATs into the image in a predetermined order

/OUT:filename

Specifies the output file name

/PDB:filename

Creates a program database (.PDB) file

/PDBTYPE:{con[solidate]|sept[ypes]}

Specifies where to store the Program Database (PDB) debug type information.

/PROFILE

Enables profiling (creates a mapfile)

/RELEASE

Sets the checksum in the .EXE header

/SECTION:name,attributes

Overrides the attributes of a section

/STACK:reserve[,commit]

Sets the size of the stack in bytes

/STUB:filename

Attaches an MS-DOS stub program to a Win32 program

/SUBSYSTEM:{CONSOLE|WINDOWS|NATIVE|POSIX|WINDOWSCE} [,major[.minor] ]

Tells the operating system how to run the .EXE file

/SWAPRUN:{NET|CD}

Tells the operating system to copy the linker output to a swap file before running it

/VERBOSE[:LIB]

Prints linker progress messages

/VERSION:major[.minor]

Assigns a version number

/VXD

Creates a virtual device driver (VxD)

/WARN[:level]

Specifies warning level

/WS:AGGRESSIVE

Aggressively trim process memory

옵션

 설명

/ALIGN:number

Specifies the alignment of each section

/BASE:{address | @filename,key}

Sets a base address for the program

/COMMENT:["]comment["]

Inserts a comment string into header

/DEBUG

Creates debugging information

/DEBUGTYPE:CV
/DEBUGTYPE:COFF
/DEBUGTYPE:BOTH

Creates particular formats of debugging information

/DEF:filename

Passes a module-definition (.DEF) file to the linker

/DEFAULTLIB:library

Searches specified library when resolving external references

/DELAY

Controls the delayed loading of DLLs

/DELAYLOAD

Causes the delayed loading of the specified DLL

/DLL

Builds a DLL

/DRIVER[:UPONLY]

Creates a Windows NT kernel mode driver

/ENTRY:function

Sets the starting address

/EXETYPE:DYNAMIC

Builds a virtual device driver

/EXPORT

Exports a function

/FIXED[:NO]

Creates a program that can be loaded only at its preferred base address

/FORCE[:{MULTIPLE|UNRESOLVED}]

Forces link to complete in spite of unresolved or multiply defined symbols

/GPSIZE:#

Specifies the size of communal variables for MIPS and Alpha platforms

/HEAP:reserve[,commit]

Sets the size of the heap in bytes

/IMPLIB:filename

Overrides the default import library name

/INCLUDE:symbol

Forces symbol references

/INCREMENTAL:{YES|NO}

Controls incremental linking

/LARGEADDRESSAWARE

Tells the compiler that the application supports addresses larger than two gigabytes.

/LIBPATH:path

Allows the user to override the environmental library path

/LINK50COMPAT

Generates import libraries in Visual C++ Version 5.0 format

/MACHINE:{IX86|ALPHA|ARM|MIPS|MIPSR41XX|PPC|SH3|SH4}

Specifies the target platform

/MAP

Creates a map file

/MAPINFO:{EXPORTS|FIXUPS|LINES}

Includes the specified information in the map file

/MERGE:from=to

Combines sections

/NODEFAULTLIB[:library]

Ignores all (or specified) default libraries when resolving external references

/NOENTRY

Creates a resource-only DLL

/NOLOGO

Suppresses startup banner

/OPT:{REF|NOREF|ICF[,iterations]|NOICF}

Controls LINK optimizations

/ORDER:@filename

Places COMDATs into the image in a predetermined order

/OUT:filename

Specifies the output file name

/PDB:filename

Creates a program database (.PDB) file

/PDBTYPE:{con[solidate]|sept[ypes]}

Specifies where to store the Program Database (PDB) debug type information.

/PROFILE

Enables profiling (creates a mapfile)

/RELEASE

Sets the checksum in the .EXE header

/SECTION:name,attributes

Overrides the attributes of a section

/STACK:reserve[,commit]

Sets the size of the stack in bytes

/STUB:filename

Attaches an MS-DOS stub program to a Win32 program

/SUBSYSTEM:{CONSOLE|WINDOWS|NATIVE|POSIX|WINDOWSCE} [,major[.minor] ]

Tells the operating system how to run the .EXE file

/SWAPRUN:{NET|CD}

Tells the operating system to copy the linker output to a swap file before running it

/VERBOSE[:LIB]

Prints linker progress messages

/VERSION:major[.minor]

Assigns a version number

/VXD

Creates a virtual device driver (VxD)

/WARN[:level]

Specifies warning level

/WS:AGGRESSIVE

Aggressively trim process memory


'소프트웨어 > C/VC++' 카테고리의 다른 글

[STL] 시퀀스 컨테이너 <Vector>  (0) 2012.05.14
윈속 멀티스레드 서버 (Winsock)  (0) 2012.05.14
간단한 C++ 매크로 만들기  (0) 2010.07.21
CString ->int -> CString  (0) 2010.07.21
CTreeCtrl 검색하기  (0) 2009.11.11
블로그 이미지

맨오브파워

한계를 뛰어 넘어서..........

,

해보면 쉽고 안해보면 뭐가 몬지 몰라서 헤메게 되는 Setup 프로젝트 입니다.

VS 에는 클릭원스라는 퍼블리싱도구가 있어서 편리하긴 한데요. 클릭원스는 설치 폴더지정이나 설치 전 후 작업 과정이

어려워서... 셋업 프로젝트를 선택하였습니다.

이번 포스팅에는 Setup 프로젝트를 만들고 msi 파일을 만들어 Setup 파일을 다운받고 설치하고

바탕화면에 바로가기를 만들고, 설치될 폴더를 지정해 주고, 아이콘을 지정하는 등 설치에 관련된 작업을 알아보려 합니다.

작업 환경은 Visual Studio 2008 입니다.

먼저 새 프로젝트를 클릭하고 셋업 프로젝를 만들어 봅시다.

 

 

후에 우리가 배포할 솔루션을 추가해 줍니다.

1. 솔루션 탐색기에서 솔루션 마우스 오른쪽 클릭 -> 추가 -> 기존의프로젝트(우리가 다 만든 프로젝트) 를 클릭합니다.

여기서 잠깐!!!!

2. 우리의 프로젝트솔루션에서 셋업 프로젝트를 추가로 만들수도 있습니다. 뭐가 먼저냐의 문제인데요.

셋업 프로젝트를 만들고, 기존의 프로젝트를 추가 할 경우...

수정시 원본의 프로젝트에 적용이 안된다는 것을 주의하십시오. 아무튼 다 만들었으면 손대지 말란 말이져!!!

그러나 2 의 경우 원본이 달라지지는 않습니다. 따라서 2의방법으로 하는 것을 추천해 드리지만...

저의 경우 3개의 프로젝트가 솔루션에 들어가 있어서 여간 복잡한게 아닙니다..

이런 경우 1 의 방법을 쓰는게 속시원하죠. 지저분한것은 싫어서....

그러면 프로젝트를 추가해 봅시다.

 

 

프로젝트명이랑 폴더명을 지웠는데.. ㅋ 의미가 없으려나?

푸헤헤... 아무튼... 프로젝트가 추가가 되면 다음의 작업들을 살펴 봅시다 ^^

 

 

셋업 프로젝트 마우스 오른쪽 버튼을 클릭하면

1. 파일시스템

2. 레지스트리

3. 파일형식

4. 사용자 인터페이스

5. 사용자 지정 정작업

6. 시작조건

이 있습니다.

파일시스템(File System on Target Machine)에는

기본적으로 3개의 폴더가 표시 됩니다.

Applicaiton Folder

User's Desktop

User's Programs Menu

직관적으로 생각하시는게 맞습니다.

파일시스템은 내가 아닌 사용자의 컴퓨터의 파일시스템이고 -> File System on Target Machine

Application Folder 는 내가 만든 프로그램이 설치될 폴더이며

User's Desktop 은 사용자의 바탕화면이고

User's Programs Menu 는 사용자의 시작 버튼을 눌렀을 때 보여지는 프로그램의 메뉴 입니다.

 

 

파일 시스템에 마우스 오른쪽 버튼을 누르면

Add Special Folder 에 위와 같은 여러가지 특정 폴더를 볼 수 있습니다.

전부를 설명할 수는 없지만 대게 직관적으로 알 수 가 있습니다.

즉... 이 부분에서 우리가 원하는 파일을 어느 폴더에 넣을 지 지정이 가능하다는 말 입니다.

저는 Window 밑에 Program Files 라는 폴더 밑에 설치프로그램을 넣는 것을 좋아하니까....

(사실은 다들 거기 있기에 따라서... ㅎㅎ )

프로그램 파일 폴더를 추가 하겠습니다.

만약 !!

- 아이콘을 window 밑에 system 폴더에 넣고 싶다면 시스템 폴더를 추가해서 아이콘을 넣음 되고,

- 폰트를 window 밑에 font 폴더에 넣고 싶다면 글꼴 폴더를 추가해서 폰트를 추가하면 되고,

- 시작프로그램이 지정되어 있는 사용자 시작폴더에 프로그램을 등록하고 싶으면 그렇게 하면 됩니다.

참~ 쉽죠잉?

그런데 개인적으로 시작프로그램은 레지스트리에 지정하는 것을 좋아라 합니다.

레지스트리 관련 내용에 대해서는 클래스참조를 찾아보세요 ^^

아무튼 다시 돌아가서~ ㅋ

드디어 우리가 만든 프로그램을 프로그램 파일즈 폴더에 넣어 봅시다 !!! 두둥~

 

 

프로그램 파일즈 폴더가 생겼구... --> 우클릭 --> 추가 -->

폴더,

프로젝트 출력,

파일,

어셈블리

중 프로젝트 출력을 클릭합니다.

폴더는 말 그대로 내컴퓨터에 있는 폴더를 통째로 거따 넣자는 것이고,

프로젝트 출력은 Debug 폴더나 Release 폴더의 개고생의 산물(?) 을 의미하는 것이고

파일은 말그대로 파일

어셈블리는 DLL 등의 바이너리 파일을 의미합니다.

우리는 우리가 만든 프로그램을 셋업파일로 만들 것이므로 개고생의 산물인 프로젝트 출력을 클릭합니다.

 

 

게이트웨이 라는 프로젝트가 개고생의 산물이며...

여러가지를 고를 수 있습니다만... 기본 출력을 선택하면 설치파일을 만들 수 있습니다.

아래의 구성에서 디버그, 릴리즈 를 선택할 수 있는데...

특별한 경우가 아니면 디버그는 배포할때 별로....

이유는 다들 아시리라 생각됩니다 ^^ 점점 길어지는 글때문에 지쳐가고 있는.. ㅋ -_-;;

 

 

추가를 했더니 프로그램 파일 폴더에

DLL 파일들과 기본출력 from 프로젝트명 이 추가 되었군요..

몇가지 변경이 별로 없는 클래스 혹은 이유를 말해줄수 없는(굴욕 ㅠㅠ) 등은 DLL 로 만들어 추가했습니다.

이런 클래스 혹은 이런 DLL 은 공개할 예정이니 마음껏 가져다 쓰시길 바랍니다. ㅋㅋㅋ

그리고 msi 파일과 Setup.exe 파일을 지정해 줍시다.

msi 파일은 지정되어 있는 경로의 setup.exe 파일을 찾아서 다운로드 시키고 설치를 도와주는 확장명 입니다.

아래처럼 지정합니다.

 

 

자 이렇게 하고 빌드를 하면 setupProject 의 Debug 폴더에

setup.msi

setup.exe 파일이 생겨납니다.

intallation URL 에 셋업파일의 URL 을 지정한 후 실제로 Setup.exe 파일을 위치시킵니다.

그 다음에 setup.msi 파일을 인터넷에 뿌려대면 끗!!!

자 이제 노력의 산물을 올리는게 되었으니 노력의 산물을 꾸미는 몇가지 기능을 넣어 봅시다.

바탕화면에 바로가기 만들기 !!!!!

 

 

일단 유저스 데스크탑 ( 영타가 귀찮음 ㅠㅠ ) User's Destop 속성을 보시면 Always Create 부분을 True 로 바꾸어 줍니다.

그리고 주의할 점 입니다.

 

 

User's Desktop 우클릭 -> Create Shortcut to User's Desktop 이렇게 하면 바로가기가 만들어지나

프로그램까지 접근이 안됨!!!! T^T 이것때문에 대 프로그래머이신 Arin 상에게 창피 당했음

우리가 원하는 것은 우리가 만든 프로그램의 바로가기 이지 폴더의 바로가기가 아님 !!!

우리가 만든 프로그램의 바로가기를 바탕화면에 넣으려면!!!!

 

 

위의 그림처럼 User's Desktop 영역에 마우스를 우클릭합니다.

그러면 아래와 같은 과정을 거쳐 바탕화면에 우리가 만든 프로그램의 바로가기를 만듭니다.

 

그러면 바로가기가 만들어집니다. ㅋ

업무시간에 포스팅 하다 걸려서 다음 장에서...

프로그램 파일에 등록하는 것과 아이콘 등록하는 것을 계속 하도록 하겠습니다.

블로그 이미지

맨오브파워

한계를 뛰어 넘어서..........

,

블로그 만들고 처음으로 강의성 있는(?) 글을 써보네요,,

게임, 유틸 등을 설치 할 때 파일을 받으면 설치를 시작하는데요

그런 설치 프로그램을 만드는 방법에 대해 글을 써봅니다.

1. 인스톨 팩토리 이용하기

저녀석이 인스톨 팩토리 입니다.

옛날에는 저걸로 설치당하는(?) 일이 많았는데

요즘은 보기 힘들어졌습니다.

이유는 잘 모르겠네요;;

네 바로바로 이게 Install Factory 입니다!

간단합니다. 쉽게쉽게 만들 수 있게 해놨어요,

이정도면 꽤 쉬운 프로그램이죠^^

뭐 그래서 더 이상 말할 것도 없구요,

압축률 : 162MB (169,913,272 바이트) -> 85.9MB (90,148,050 바이트)

다운로드

(출처 : 알 길이 없네요;; edison1111@daum.net , 김종민 님이 만드셧습니다.)

2. Smart Install Maker (스마트 인스톨 메이커) 이용하기

이것도 쉽게 인스톨 프로그램 만드는 프로그램 중 하나입니다.

짠! 이게 스마트 인스톨 메이커입니다.

이것도 쉽게쉽게 만들어놨습니다.

이것도 보기만 해도 바로바로 만들 수 있게 되어 있습니다.

아마 이게 제일 쉬운 듯 합니다.

단점은 적지 않을수 없네요

느려요,,, 정말 느려요

162MB 파일을 설치파일로 만드는데 10분 내외 걸렸습니다.

인스톨팩토리에 비교하면 말을 할 수 없죠,,

압축률 : 162MB (169,913,272 바이트) -> 73.1MB (76,660,349 바이트)

(출처 : http://www.sminstall.com/ )

직접받기

출처사이트에서 받기

클릭

한글패치 받기

(받은 후에 실행 하시구 Smart Install Maker 설치 후 Preferences -> Language -> Korean(한국어) 클릭하시면 됩니다.)

3. NSIS (Nullsoft scriptable Install System) 이용하기

드디어,, 좀 많이 봤던 거네요

제가 얼마 전까지만 해도 찾고 다니던 겁니다.

자세히 보니 아이콘 위에 NSIS 글자가 있었네요,,, ㅠㅠ

설치하고 실행해 봅니다@!

ㅇㅇ???

넌 뭐니..? 영어로 어쩌구 저쩌구 보이는데 검은건 글씨요,,,,

저기서 그냥 ZIP 파일을 설치 파일로 만들고 싶다 하시는 분들은

Installer based on ZIP file 으로 진입하시구요

다른 분들은 자기가 열심히 스크립팅 합시다!

라면 뭐하죠,,,,

NSIS 의 단점이라 하면 자기가 알아서 스크립팅 해야합니다.

Nullsoft 에서 저런 프로그램 꽁짜로 줬는데 뭐라 할 수 없죠.

그런데 HM NIS Edit 라는 프로그램이 NIS 확장자 파일을 쉽게 수정할 수 있게 하면서

스크립트 작성 마법사까지 할 수 있게 해주는군요^^

자자 HM NSI Edit 프로그램을 실행 시킨 후에

왼쪽 위에 형광팬으로 노랗게 칠해진 부분을 클릭합니다.

그러면 이게 뜨는데요

이제 끝난 겁니다^^

위의 2개의 프로그램처럼 설치할 파일을 작성한다던지

바로가기는 뭐로 만들거냐, 언인스톨 기능은 사용할꺼냐,, 어쩌구저쩌구 그러는데요

쉽게쉽게 설정해주시면 됩니다^^

설정 후 저장버튼을 누르셔서 원하는 위치에 저장합니다.

그러면 위처럼 저런 파일이 하나 만들어집니다.

마우스 오른쪽 클릭 후 (Compile NSIS script) 를 클릭하시면

MakeNSISW 프로그램이 켜지면서 중얼중얼 하다보면

띠링 소리와 함께 완료됩니다.. 빠르게요,..

이렇게 말이죠!

만약 중얼중얼 영어로 뜨다가 갑자기 Error 가 뜨면

Error 어쩌구 on line (숫자)

이렇게 뜰겁니다.

그러면 on line (숫자) 있는 게 NSI 파일에 (숫자) 번째 줄에 문제가 있다는 겁니다.

그러면 HM NIS Edit 프로그램으로 그 문제가 있는 줄수에 가서

그 줄을 지우던지 고치던지 하시면 됩니다.

성공하셧다면 설치파일을 가지고 놀면 됩니다^^

압축률 : 162MB (169,913,272 바이트) -> 85.2MB (89,366,825 바이트)

(출처 : http://nsis.sourceforge.net/Main_Page)

직접다운로드

출처 사이트에서 다운로드

클릭

HM NSI Edit

제가 아는 인스톨 프로그램은 여기까지 입니다.

이밖에 WINRAR 를 이용해서 만드는 방법도 있는데

이건 단순히 압축을 푸는 방식인 듯 하구요

Install Shield 도 있는데 이건 유료 프로그램이고 위의것보다 훨씬 복잡하다고 합니다.

NSIS 가 무료 프로그램중 압축률이 가장 좋다고 들었는데

파일 확장자가 달라서 그런지 저는 조금 낮게 나왔네요

그래도 저는 NSIS가 좋습니다^^

자신에게 맞는 프로그램을 선택해서 하시면 됩니다^^

블로그 이미지

맨오브파워

한계를 뛰어 넘어서..........

,
 
 
02 #include <STDIO.H>
03 #define EMPTY
04   
05 #define CHECK1(x, ...) if (!(x)) { printf(__VA_ARGS__); }
06 #define CHECK2(x, ...) if ((x)) { printf(__VA_ARGS__); }
07 #define CHECK3(...) { printf(__VA_ARGS__); }
08 #define MACRO(s, ...) printf(s, __VA_ARGS__)
09   
10 int main() {
11     CHECK1(0, "here %s %s %s", "are", "some", "varargs1(1)\n");
12     CHECK1(1, "here %s %s %s", "are", "some", "varargs1(2)\n");   // won't print
13   
14     CHECK2(0, "here %s %s %s", "are", "some", "varargs2(3)\n");   // won't print
15     CHECK2(1, "here %s %s %s", "are", "some", "varargs2(4)\n");
16   
17     // always invokes printf in the macro
18     CHECK3("here %s %s %s", "are", "some", "varargs3(5)\n");
19   
20     MACRO("hello, world\n");
21     // MACRO("error\n", EMPTY);   would cause C2059
22 }
블로그 이미지

맨오브파워

한계를 뛰어 넘어서..........

,

CString → int
int형 = _ttoi(CString형);

int → CString

CString형.Format( _T("%d"), int형);  

블로그 이미지

맨오브파워

한계를 뛰어 넘어서..........

,


‘엄마 손은 약손.’ 어릴 적, 배탈이 나면 어머니나 할머니가 배를 쓰다듬고 문질러주면 아픔이 씻은 듯이 없어졌던 경험을 누구나 한 두번쯤 갖고 있다. 의학적 설명이 없어도 그 시절 엄마의 손은 훌륭한 의사였다.

울화 땐 장기 스트레스

고대 중국에서는 ‘수기법’이란 이름의 손을 이용한 치료법이 의료의 한 분야로 통했다. 손을 사용하는 안마요법은 침구요법, 약물요법, 기공요법과 함께 4대 치료법으로 일컬어졌다. 조선시대 왕들은 잠자리에서 일어나기 전, 손으로 배 마사지를 한 것으로 전해진다. 한 손으로 시계방향으로 배를 50회쯤 문지른 뒤, 방향을 바꿔 되풀이하는 동작이었다.

배 마사지의 효과를 의학 또는 한의학에서 본격 연구한 자료는 아직 많지 않다. 스웨덴·캐나다 연구팀이 엄마의 사랑이 담긴 손이 아이의 고통을 줄이는 효과가 있다는 연구결과를 발표한 적이 있고, 미국에서는 레프렉솔로지 또는 손 세라피로 불리는 마사지 또는 기 치료법이 관심을 모으고 있다.

배는 음식의 소화·흡수를 맡을 뿐 아니라 그

과정에서 생긴 노폐물을 처리한다. 뿐만 아니라 감정과 정신적인 요소도 배와 관련 있는 것은 경험을 통해 알 수 있다. 증오심이나 울화를 묻어두면 배와 장기에 스트레스가 엉켜 배가 딱딱하게 굳어지고, 곧잘 아픈 경우가 많다. 꾀병의 경우, 배가 아픈 증상으로 나타날 때가 많은데 실제로 통증이 있다고 한다.

배의 건강상태부터 체크



포천중문의대 전세일 대체의학대학원장은 “손으로 배를 마사지하면 자율신경을 자극, 장기가 활성화된다고 볼 수 있다”며 “다만 너무 지나치게 자극하면 오히려 해로울 수 있다는 점을 염두에 둬야 한다”고 말했다.

자신의 배가 건강한지 않은지를 구별해보는 방법이 있다.< 아래 표 참조 > 건강하지 못한 배의 원인이 분명하다면 병원을 찾아 치료를 받아야겠지만, 뚜렷한 원인없이 증상이 개선되지 않을 때는 배 마사지를 시도해볼 만하다.

한국힐링타오협회 이여명 회장은 “배 마사지는 인체 중심의 기(氣) 흐름을 순조롭게 해 우리 몸의 자연 치유력을 높여준다”고 말했다.

기본 동작만 익혀도 효과



이 회장이 권하는 배 마사지는 비교적 따라하기 쉽다. 하루 15분 정도만 투자하면 된다. 기본동작은 허리돌리기 배 굴려주고 흔들기 배 원형 마사지 배 누르기 단전 두드리기 소용돌이 마복공 등이다.

허리돌리기는 양손을 허리에 대고, 엉덩이뼈를 축으로 3회 가량 엉덩이를 최대한 크게 돌리는 동작이다. 배 굴려주고 흔들기는 양손을 배에 얹고 배 전체를 아래위로 굴리고 흔든다. 원형마사지는 양손을 포갠 다음 배꼽 주위(작은 창자 쪽)에서 시작해 나선형으로 돌아가면 배 전체를 둥근 모양으로 지그시 돌리며 주무른다.

단전 두드리기는 발을 어깨넓이로 벌리고 선 다음, 무릎을 약간 굽힌 자세로 아랫배를 손으로 두드린다. 소용돌이 마복공은 양손이나 한 손을 배 위에 얹고 시계방향, 그 반대방향으로 각각 100회씩 열이 날 정도로 문지른다.



설사와 변비는 음식물이 장을 통과하는 시간의 차이다. 대장이 예민해져서 연동운동이 너무 심하면 설사가 되고, 너무 약하거나 횟수가 적으면 변비가 된다. 대변을 항문으로 밀어내는 힘이 부족하기 때문이다. 물론 대장암이나 세균성 장염 등이 없는 경우를 말한다.

변비는 기미·여드름·검버섯 등 피부 트러블을 일으키는 것으로 알려져 있다. 또한 두통·현기증 등도 일으킬 수 있으며, 고혈압 악화 요인으로도 작용한다. 가벼이 볼 일이 아니다.

배 마사지가 장 운동 항진이나 심리적 안정 효과 등으로 변비 예방에 도움을 준다. 마사지 방법은 복부 우측 하단부에서 시작해서 배꼽을 중심으로 시계방향, 즉 대변이 항문으로 진행하는 방향을 순서에 따라 지그시 눌러주는 방식이다.<그래픽 참조>.

취침 전 편안하게 누운 상태에서 오른손을 주먹 쥐고 오일을 바른 후 시행하면 좋다. 한번에 20분씩 매일 하는 것이 권장된다.

대장 운동을 증가시키기 위해서는 평소에 야채 등 섬유질을 충분히 섭취하는 것도 빼놓을 수 없다. 섬유질은 소장에서 잘 흡수되지 않고 대장까지 내려와 대장 운동을 증가시키며 대변에 습기를 적당히 유지시켜 대변의 배출을 용이하게 해준다.

'유용한 팁 > 건강/생활' 카테고리의 다른 글

신발끈 예쁘게 묶기  (0) 2010.07.21
블로그 이미지

맨오브파워

한계를 뛰어 넘어서..........

,