APM으로 서버 구동하기(설치) - AutoSet

프로그래밍 2014. 2. 23. 05:06

APM을 이용해 서버를 구축해 봅시다..

살다보니 안할줄 알았던 서버, 웹 쪽을 다루게 되네요(__)

 

APM은 서버를 구성하는 주요 도구인 Apache, PHP, MySQL의 머릿글자를 묶어서 이르는 말입니다.

여기서 Apache는 웹 서버 프로그램, PHP는 언어중의 하나이고 MySQL은 오픈소스 데이터 베이스의 하나입니다.

이 세가지를 한데 묶어 쉽게 설치할 수 있게 만든 프로그램이 바로 APMSetup이죠.

 

원래는 각자 설치해서 연동해 줘야 하지만 한번 설치로 3개를 연동시킬수 있어 사기(?)라고 불리는 프로그램입니다.

Apm을 설치하는 방법은 AutoSet, APMSETUP... 등이 있습니다.

APMSETUP은 2010년 업데이트가 중지되었으므로 AutoSet을 설치하겠습니다.

 

APM(AutoSet) 설치

1. http://autoset.net/xe/about_autoset 에 접속해 무료 다운로드를 클릭합니다.

 

 

 

 

2. 한국어를 선택합시다.

 

3. 다음, 다음. ...

 

4. 저는 선택하기 귀찮아서 Full installation을 선택하였습니다.

    모두 설치하면 XE, Gnuboard, kmsq, wordpress등이 설치 되는군요.

 

 

 

 

5. 설치를 완료하게 되면 아래와 같은 프로그램이 실행됩니다.

    처음상태에는 서버가 중지되어있습니다.

 

6. 제어 -> 웹서버 시작(W)를 선택해 웹서버를 시작합니다.

   저는 웹서버로만 쓸 예정이라 일단 다른것들을 다 종료해서 웹서버(80)으로만 표시되고 있네요.

   괄호 숫자는 포트 번호를 나타냅니다.

 

 

7. 웹서버 동작을 클릭하면 웹서버가 실제 동작하는지 확인합시다.

   방법은 매우 간단합니다. 인터넷 창을 열고 http://127.0.0.1/ 이라고 입력합니다.

   아래와 같은 화면이 출력되면 정상적으로 작동하고 있음을 확인할수 있습니다.

 

 

AutoSet관련사이트

1. AutoSet 공식 사이트 : http://autoset.net/xe/about_autoset

2. AutoSet 사용자 카페 : http://cafe.naver.com/autoset

3. AutoSet 페이스북 : http://www.facebook.com/AutoSet

 

'프로그래밍' 카테고리의 다른 글

멀티 스레드  (0) 2014.12.13
파이썬 argparse  (0) 2014.11.08
[STL] List  (0) 2014.03.06
[STL] Vector  (0) 2014.03.05
PHP document  (0) 2014.02.23

소스 편집용

카테고리 없음 2014. 2. 15. 00:52

 

 

 

#include <stdio.h>

 

void foo(int a) {printf("called foo(%d)\n", a);}

 

void main()

{

void (*fp)(int) = foo;

fp(10); // () 함수 호출 연산자

}

 

 

이중 포인터 개념 정리

카테고리 없음 2014. 2. 13. 23:32

int arr[2][3]; 로 int형 배열이 선언되어 있을때 원소의 개수는 몇개 일까요?

6개 같지만 2개입니다. 2차원 배열처럼 보이지만 실제 메모리는 1차원 이므로 2차원 배열이 아니라

1차원 배열의 확장입니다.

 

배열의 포인터는 int (*pArr)[3] = arr; 로 표현이 가능합니다.

 ☞ int *pArr[3]으로 작성하면 컴파일러는 int형 포인터를 리턴하고 변수가 배열인 함수로 해석합니다.(괄호 필수)

 

2차원 동적 배열을 선언할때 대부분

int **myArr = (int**)calloc(2, sizeof(int*));

for(int i=0; i<3; i++)

    myArr[i] = (int*)calloc(3, sizeof(int));

으로 선언하고 사용합니다. 이때 선언시 2차원 포인터를 사용해서 2차원 배열은 2차원 포인터를 사용하는것으로

생각하기 쉽습니다.

하지만 이차원 포인터로 생각하는 이유는 참조의 참조 2번의 참조를 거치기 때문에 사용하는것이지,

꼭 2차원 배열을 동적할당할 때에는 2차원 포인터를 사용하지 않아도 됩니다.

☞  int (*myArr)[3] = (int(*)[3])malloc(sizeof(int)*2*3); // c 스타일

     int (*myArr)[3] = static_case<int(*)[3]>malloc(sizeof(int)*2*3); // c++ 스타일

 

[정리]

1. 포인터 : 다른 지역의 변수를 접근하기 위해 사용한다.

2. 배열과 포인터 : 배열명은 자신의 첫 번째 원소의 시작 주소를 의미하는 상수 포인터.

                          이때 배열의 타입은 원소의 타입이여야 하고, 배열명을 사용하여 포인터에 저장할 경우, 

                          배열 전체 타입이 하나의 원소의 타입으로 축소된다. 이것을 decay(퇴화)라고 한다.

3. 배열포인터 : 배열 전체를 의미하는 포인터  // 타입(*포인터)[길이]

4. 포인터의 연산 : 포인터간의 연산(정수포함)은 제한적인 연산만이 가능하다.

                          포인터 - 포인터 = 정수

                      포인터 + 정수 = 포인터

                      포인터 - 정수 = 포인터

 

 

5. 함수의 포인터

     함수의 타입 : 리턴 타입과 매개변수 전체가 함수의 타입

     함수의 선언 : 함수의 심볼은 반드시 리턴 타입과 매개변수 사이에 위치

     ☞ 리턴타입 (*포인터명)(매개변수)

 

SDN(Software Defined Network)

카테고리 없음 2014. 2. 13. 20:48

SDN이란 무엇일까요?

기존의 전통적인 네트워크는 각각의 라우터, 스위치 허브등의 노드들의 링크로 구성되어 있습니다.

[그림1] 전통적인 네트워크 망

 

하지만 이러한 기존 네트워크는 여러가지문제점이 많습니다.

그중 한가지는 OSI 7계층등 여러개의 연결로 네트워크를 통하여 [그림2]와 같이 프록시 장비, 방화벽, IPS/IDS등의 장비

등은 각각 OSI계층으로 분할되어 있습니다. 이러한 절차를 거치다 보면 네트워크 전송 시간이 오래 걸리며, HW+SW 등의

분할로 관리가 어려운 측면이 많습니다. 따라서 이러한 단점을 보완하기 위해 [그림3]과 같이 단일 장비(HW+SW)로 구성

해서 속도면과 장비 관리 측면이 쉬운 장점이 있습니다.

[그림2] 기존 네트워크망의 문제

 

[그림3] SDN 네트워 조직망

 

[Open Flow]

SDK에 첫번째로 지정된 표준입니다. 하드웨어 계층 레이어에서 네트워크 디바이스 컨트롤러 들과의 통신을 정의합니다.

Openflow스위치는 테이블[그림5]을 관리해 룰을 지정, 제한합니다. 각 테이블은 어플리케이션을 통해 지정할수 있고,

테이블에 없는 주소는 라우팅(포워딩)하는 기능(컨트롤러 [그림6])을 수행합니다. 리눅스 기반에서 돌아가는 어플리케이

션은 동시에 여러개의 어플리케이션이 실행이 가능하며 사용자의 필요에 맞게 SW를 설계하여 사용할수 있는 장점이 있습

니다.

 

[그림4] SDN 아키텍처

[그림5] Openflow 스위치 테이블

 

 [그림6] SDK 구성 이미지

 

SDK의 전망

- 모든 스위치를 컨트롤러에서 처리하니 관리하기 쉽다.

- 하나의 정책에 일관되어 보안에 좋다

- 자주 움직이는 컨트롤은 새로운 포트번호 할당등을 통해 유연하게 대처가 가능하다.

- 기존의 장비보다 가격이 싼 장점이 있다.

- 구글가 아마존, IBM, CISCO, 마이크로소프트 등 SDN 장비 교체하는 추세이다.

 

개발

 - POS : 파이썬 기반

 -  NOX : C++기반

비트 연산자

프로그래밍/C/C++ 2014. 2. 12. 14:17

비트 연산자의 필요성

8개의 LED조명을 제어하기 위한 프로그램을 생성한다고 할때

  enum {LED0 = 0, LED1, LED2, LED3, LED4, LED5, LED6, LED7};

  enum {LED_OFF = 0, LED_ON = 1};

  char mmio[8] = {0, }; // 8개의 배열을 만든뒤

  mmio[LED1] = LED_ON; //LED1의 조명 ON

  mmio[LED3] = LED_OFF; //LED3의 조명 OFF 

로 조명을 제어 할수 있습니다.

하지만 이 부분에서의 문제점은 총 8개의 비트(0, 1)만으로 충분하지만, 사용 메모리 크기는 8비트 * 8개(64비트)

공간을 할당하여 사용하고 있다는 것입니다. 각 char형의 1비트 밖에 사용하지 않고 7비트트 * 8개(56비트)의

공간이 낭비되고있는 문제점입니다.

 

이 문제를 해결하기 위해서는 8비트를 사용하여 8개의 LED를 제어하는 방법을 사용하여야합니다.

char 형의 문자형을 하나 사용하여 8비트(1바이트) 공간을 사용하는 방법을 소개합니다.

이 문제를 해결하기 위해서는 비트연산자를 활용해 각 비트의 연산이 필요합니다.

 

1. AND연산

 

 

AND연산은 위 그림과 같이 1과 1이 입력될때만 1이 출력되고 그 외의 연산은 0이 출력되는 게이트를 말합니다.

 

2. OR연산

 

 

 

OR연산은 위 그림과 같이 0과 0이 입력될때만 0이 출력되고 그 외의 연산은 1이 출력되는 게이트를 말합니다.

(입력 게이트로 하나라도 1이 포함되면 1이 출력)

 

3. NOT연산

NOT연산은 위 그림과 같이 0을 NOT연산자를 취하면 1이 출력되고, 1을 NOT연산자를 취하면 0이 출력됩니다.(반대로 출력)

 

4. SHIFT 연산

  데이터 << 이동할 비트 수

 데이터 >> 이동할 비트 수

 

SHIFT연산은 메모리 상을 비트 단위로 이동하는 것을 말합니다. 데이터를 비트 단위로 좌, 우로 이동하는

기능을 합니다.

규칙1. 특정 비트를 설정하려면 OR연산자를 사용합니다.

 char mmio = 0; // 0000 0000

규칙2. 특정 비트를 검색하려면 AND연산자를 활용합니다.

규칙3. 특정 비트를 초기화하려면 &연산자와 비트 반전 연산자(~, NOT)을 사용합니다.

 

 

 

 

'프로그래밍 > C/C++' 카테고리의 다른 글

C++ 파일 입출력  (0) 2014.02.24
함수 주요 형태(_stdcall, _cdecl, _fastcall)  (0) 2014.02.24
함수 포인터  (0) 2014.02.12
[STL]컨테이너 선택  (0) 2014.02.09
[STL] 제네릭 알고리즘 Generic Algorithm  (0) 2014.02.09

함수 포인터

프로그래밍/C/C++ 2014. 2. 12. 04:22

우리가 알고있는 일반적인

함수의 선언은 리턴타입 (함수명 ([파라미, ...])) 형식을 갖습니다.

함수의 포인터 선언 방법은 함수의 심볼은 반드시 리턴 타입과 매개변수 사이에 위치해야 합니다.

함수의 포인터 선언은 리턴타입 (*포인터명) ([파라미터, ...]) 형식을 갖습니다.(괄호 필수,

미괄호시 파라미터 부터 해석해서 리턴타입을 리턴타입을 포인터로 리턴하는 함수로 인식합니다.)

함수호출, 함수의 포인터 호출 방법은 아래와 같습니다.

 


하지만 이러한 방법은 매우 복잡합니다. 함수의 포인터 호출 방법을 아무도 사용하지 않을 것입니다.

하지만 전처리기 #define문을 사용해 함수의 포인터를 간단히 치환할수 있습니다.

 

출력 결과

 called foo(10);

 called foo(10);

 called foo(10);

 called foo(10);

 

위의 주석으로 처리된 함수 포인터는 #define선언된 함수의 포인터 타입으로 변경되어 간단히 사용할수 있습니다.

좋은 프로젝트를 선정하는 방법?

카테고리 없음 2014. 2. 9. 14:55

좋은 프로젝트는 학습, 경험, 소비자가 좋아할만한 경험을 바탕으로 작성되어야 합니다.

애플의 아이폰과, 삼성의 갤럭시 시리즈를 보면 성능 면에서는 삼성의 갤럭시가 앞도적으로 우세합니다. 하지만

아이폰과 갤럭시는 비슷한 판매 실적을 올리고 있습니다.

 

여기서 보면 성능, 퍼포먼스 만으로는 승부하지 않는 것이 좋다는 지식을 얻을수 있습니다.  사용자가 필요한

기능에 초점을 맞추고, 본래의 기능을 충실히 수행하는 것 만이 사용자가 원하는 것임을 알수 있습니다.

어떤 분야에서 혁신적인 아이디어가 나와 기존의 기술을 덮어 버릴때 기존 사람들은 기존 기술의 불편함을 모르고

사용하다가 새로운 기술을 사용해보고 기존의 기술이 불편했음을 느끼는 경우가 많습니다. 예를 들면 옛날에는

문 키가 없으면 집에 들어가지 못해 기다려야 했지만, 당연하다고 여겼고, 현재는 문키를 번호키가 대신해 번호만

알아도 문 안으로 들어갈수있습니다. 기존의 기술이 불편하다고 생각하지 않고 당연한 결과라고 느꼈던 것입니다.

특정 주제를 선정했을때, 모든 사용자를 만족시키기는 매우 어렵습니다. 특정 사용자에게 초점을 맞추기는 쉽지만,

그 외의 사용자가 사용하지 못해 시장에서 경쟁력이 뒤쳐질 우려가 많습니다. 장단점이 있기 때문에 잘 고려해 선택

해야 할 것입니다.

 

 이를 감안해 주제를 선정했으면 선정한 프로젝트를 한장의 포스터와 15초 이내의 영상으로 표현할수 있고, 기능을

모르는 제 3의 사용자가 그것만을 보고 어떤 것인지 느낄수 있어야 합니다. 세부적으로 추가 설명이 필요할시 좋은 프로

젝트 주제로 선정된 것이 아닙니다. 

 

 기업은 사업성, 공헌성을 목표로 삼기 때문에 사업자에게 이득을 창출해 낼수 있는 교육 SW쪽으로 주제를 선정하는것이

좋을것입니다. 사회에 공헌(장애인, 노약자를 위한 서비스 제공)하는 주제를 선정하면 기업의 주목을 끌수 있을것입니다.

 

[Project Ideation]

주제를 선정하기 힘든 이유는 팀원의 부제, 퍼포먼스의 부족, 기술력 부족, 분량 조절 실패, 이미 나온것이 많음 등 여러

가지 원인이 있습니다. 따라서 아이디어 회의를 하기 위해 모여서 토론하는것보다 일상생활에서 문특 떠로은 item이

더 좋은 프로젝트 주제로 선정되는 경우가 많습니다.  브레인스토밍, 마인드맵, 아이디어 회의 등을 할때 특정 item에

대해 구체화 하는것은 좋지 않습니다. 특정 주제에 대해 구체화 하게 되면 그 주제를 벗어나기가 매우 어렵고 또한

새로운 주제가 떠오르지 않는 경우가 많기 때문입니다.

 

1. 기초적인 아이디어 기입

2. 마인드맵으로 가지치기

3. 아이디어 재정리

4. 다른 사람에게 피드백받기

5. 보고서 작성

 

[브레인 라이팅]

브레인 스토밍은 자유롭게 발언하는 것이 토대가 되어있지만, 실제로 그렇게 하기가 매우 어렵습니다.(일부 사람에게

집중) 그래서 독일을 호리겔은 발언을 하는 대신 종이에 기록하는 방법을 제안했습니다. 다시 말하자면 브레인 라이팅은

참가자들 끼리의 아이디어를 기록하기 위해 비언어적 접근 방법을 사용하는 아이디어 창출기법입니다. 브레인 스토밍

과 비슷하게 참가자들은 문제를 해결하기 위한 아이디어를 생각해 내고, 카드나 종이쪽지를 사용하여 기록한 후 한데

모아서 다른 사람의 것과 교환하여 검토합니다. 이러한 과정을 정기적으로 거치면 참가자들의 사물을 보는 시야의

범의를 높일수 있습니다. 참가자들은 분야는 다르더라도 사안에 관련된 배경지식을 가지고 있어야 합니다. 예를 들면

6명이 둥근 테이블에 둘러 앉아 5분 동안 3가지의 아이디어를 생각하는 방법입니다. 6명이 각각 1장의 종이를 가지고

5분간 3개의 아이디어를 써서 그것을 차례대로 옆사람에게 돌립니다. 30분간 6명이 각각 18개의 아이디어를 기록하므로

총 108개의 아이디어가 탄생합니다.

 

 

 

[연꽃 기법]

연꽃기법은 연꽃 모양으로 아이디어를 발상해 나가는 사고기법입니다. 주로 아이디어나 문제 해결의 대안을

다양한 측면에서 얻기 위하여 활용됩니다. 주로 기존의 기술이나 제품을 활용하여 새로운 방법을 찾으려고 할때나

미래 시나리오를 가상으로 만들어 내려고 할 때 적용됩니다. 연꽃 기법 방법은 3*3 칸으로 된 사각형을 중심으로

주변에는 사각형의 중심에 있는 가운데의 목표를 해결하고자 하는 키워드, 주제를 적습니다. 반복적으로 그 8개에 대한

주제를 또 8개의 키워드로 분할하는 방법입니다. 위의 결과 가운데를 중심으로 하나의 주제에 대한 하위주제의 적절한

아이디어를 조합하여 새로운 최선의 대안을 생각해 낼수 있습니다.

 

 

☞ 연꽃 기법 활용시 유의할점

  1. 비판금지 : 다른 사람들이 제시하는 아이디어를 절대로 평가, 비판, 간섭해서는 안됩니다.

  2. 자유 분방 : 아이디어가 비현실적일지라도 모두 받아들여야 합니다.

  3. 질 보다는 양 : 좋은 아이디어를 얻기 위해서는 가능한 많은 아이디어를 바탕으로 이끌어 내야 합니다.

  4. 결합과 개선 : 두 개 이상의 아이디어를 결합하거나 수정, 추가, 모방해서 새로운 아이디어를 만들수 있습니다.

 

 

 

 

[STL]컨테이너 선택

프로그래밍/C/C++ 2014. 2. 9. 14:12

컬렉션 내의 값들을 어떤 방식으로 접근하는가에 따라 컨테이너 선택이 달라져야 합니다.

 

▶ 컬렉션 내에 임의 접근이 자주 필요할시

    vector와 deque를 사용하고, 순차접근만으로 충분하다면 다른 컨테이너를 써도 무방합니다.

 

▶ 컬렉션 내의 값들을 순서 매길 필요가 있을시

    Set을 사용하는게 좋습니다. 매순간 순서가 필요없고 특정 순간에 필요하다면 list혹은 vector에 값을 대입하고 필요시

    정렬하는 방법을 사용하는 것이 좋습니다.

 

▶ 데이터 구조 내에서 유지되는 값들의 순서가 필요할시

     stack이나 list를 선택하는것이 좋습니다.

 

▶ 실행중에 데이터 구조가 광범위 하게 변활시

    list와 set을 선택하는 것이 좋습니다.  vector, deque는 컬렉션으로 부터 원소들을 제거한 뒤에 데이터 이동이

    이루어지기 때문에 부하의 원인이 됩니다.

 

▶ 어떤 값이 컬렉션 내에 포함되어 있는지 확인하는 빈도가 높으시

    set이나 map을 선택하는 것이 좋습니다.

 

▶ 컬렉션에 대해 인덱싱이 필요할시

    vector, deque를 사용하고, 키 값이 어떤 순서가 있는 데이터 형이라면(문자, 문자열, 사용자 정의 데이터 타입)

    map을 사용합니다.

 

▶ 두개 이상의 수열을 하나로 합치는 일이 자주 발생할 경우

    set이나 list가 유용합니다. 어떤 것을 선택할지는 순서가 유지되는가의 여부에 따라 결정하는 것이 좋습니다.

 

▶ 컬렉션 중간에서 데이터 삽입, 삭제가 자주 이루어질시

    list가 최선의 선택이며, 앞쪽에서 삽입된다면, deque , list 끝에서 삽입과 삭제가 이루어진다면 stack, deque를 사용하는 것이 좋습니다.

'프로그래밍 > C/C++' 카테고리의 다른 글

비트 연산자  (0) 2014.02.12
함수 포인터  (0) 2014.02.12
[STL] 제네릭 알고리즘 Generic Algorithm  (0) 2014.02.09
[STL] 정렬 컨테이너1 (set, multiset, map, multimap)  (0) 2014.02.09
[STL] 제네릭(generic) 기초 정리  (0) 2014.02.09

[STL] 제네릭 알고리즘 Generic Algorithm

프로그래밍/C/C++ 2014. 2. 9. 04:29

Generic Algorithm이란 컨테이너에 대해서 적용할 수 있는 기능들을 체계적으로 정리해놓은 함수를 말합니다. 일반적이

기 때문에, 특정 컨테이너에 종속된 것이 아니라 모든 컨테이너에서 사용할수 있습니다. 알고리즘 함수들은 특정 컨테이

너의 멤버 함수가 아닌 일반 전역 함수로 작성되어 있습니다.

 

  ☞ find 예제

 

  ☞ copy 예제

 

  ☞ sort 예제

  ☞ reverse 예제

 reverse_copy를 사용하면, reverse대상은 그대로 두고 복사시킬수 있습니다.

 → reverse_copy(vec1.begin(), vec1.end(), 참조 객체 );

 

 

[STL] 정렬 컨테이너2 (stack, queue, priorityqueue)

카테고리 없음 2014. 2. 9. 04:12

STL-Stack

 stack의 선언은 두개의 인자를 명시해야 합니다.

 (stack이 담게될 원소의 타입, 원소들을 담는데 사용할 컨테이너 타입)

 

  ☞ stack 생성

    stack<int, vector<int>> stackOne;

    stack<double, deque<double>> stackTwo;

    stack<Part*, list<Part*>> stackThree;

    stack<Customer, list<Customer>> stackFour;

 

컨테이러로는 vector나 deque를 가장 많이 쓰고, List도 컨테이너로 사용이 가능합니다.

deque를 사용할경우 좀더 빠르고, vector를 사용할 경우 크기가 조금 작아집니다.

 

 

STL-Queue

 queue의 선언은 값을 담고 있는 컨테이너와 원소 타입을 명시해야 합니다.

 컨테이너 타입으로 list나 deque를 가장 많이 사용합니다.

 list를 사용하면 코드가 작아지는 반면, deque를 사용하면 코드가 빨라 집니다.

 

  ☞ queue 생성

    queue<int, list<int>>queueOne;

    queue<double, deque<double>>queueTwo;

    queue<Part*, list<Part*>>queueThree;

    queue<Customer, list<Customer>>queueFour;

 

STL-Priority Queue

 queue와 마찬가지로 Priority-Queue에 대한 선언은 값을 담고 있는 컨테이너와 원소 타입을 명시해야 합니다.

  ☞ priority-queue 생성

    priority_queue<int, list<int>>queueOne;

    priority_queue<double, deque<double>>queueTwo;