2016년 6월 11일 토요일

Grub 부트로더 복구하는 방법

리눅스를 설치하고 지우면서 boot하면 가끔 당하는 grub rescue>
막막합니다. 그럴때 boot rescue나 Live CD를 쓰지 않고 간단히 해결하는 방법
grub rescue> ls
그럼 partition들을 다 보여 줍니다.
(hd0) (hd0,msdos2) (hd0,msdos1)
근데 어떤 놈 일까요?
grub rescue> ls (hd0,msdos2)/
grub rescue> ls (hd0,msdos1)/
이런식으로 하나씩 내용을 보면  ext4 중 /lost+found     /sys      /bin  /boot .... /usr
요렇게 partition의 ls가  놈이 나오는게 있습니다.
(hd0,msdos2) 이 고놈이라고 치면 # 아래 msdos를 빼고 한다는 걸 까먹으면 도루묵!
grub rescue> set prefix=(hd0,2)/boot/grub
grub rescue> set root=(hd0,2)
grub rescue> insmod normal
grub rescue> normal
다 치고 나면 리눅스가 정상으로 시작 됩니다.
그럼 안도의 한숨 내쉬고 Shell 을 연 다음 
$ sudo update-grub
$ sudo grub-install /dev/sda

출처 - http://linuxmint.kr/4082

2016년 5월 7일 토요일

Linux 컨테이너

 향상된 컴퓨터의 성능으로 인해 그 성능을 더 효율적으로 사용하기 위한 가상화라는 단어가 친숙해졌습니다.
 처음에는, 가상화 기술을 사용하기 위해여 KVM, VMWARE 같은 하이퍼바이저를 사용하는 기술을 사용하였지만, 최근에는 Docker로 대표되는 리눅스 컨테이너(LXC)와 같은 컨테이너 형 가상화 기술을 이 더 각광받고 있습니다.
 컨테이너형 가상화 기술은 기존 기술보다 더 가볍고, 이식성이 뛰어난 특징을 가지고 있습니다. 그리고 '가상화'라기 보단 '격리'라는 개념에 더 가깝다고 합니다. (말그대로 컨테이너안에 가둔다는 것 같습니다.) 리눅스 컨테이너를 살펴보면 OS 내부는 물리적 자원을 관리하는 "커널 공간"과 애플리케이션을 실행하는 "사용자 공간"으로 나누어집니다. 컨테이너형 가상화 기술은 사용자 공간(User space)를 나누어 각각의 사용자 프로세스에서 보이는 리소스를 제한하는 방법입니다.




1. LXC (Linux Container)란?



LXC (LinuX Containers)는 단일 컨트롤 호스트 상에서 여러개의 고립된 리눅스 시스템 (컨테이너)들을 실행하기 위한 운영 시스템 레벨 가상화 방법이다.  리눅스 커널은 cgroups를 절충하여 가상화 머신을 시작할 필요 없이 자원 할당 (CPU, 메모리, 블록 I/O, 네트워크 등)을 한다. Cgroups는 또한 애플리케이션 입장에서 프로세스 트리, 네트워크, 사용자 ID, 마운트된 파일 시스템 등의 운영 환경을 완전히 고립시키기 위해 namespace isolation을 제공한다.  LXC는 cgroups와 namespace를 결합하여 애플리케이션을 위한 고립된 환경을 제공한다. Docker 또한 실행 드라이버의 하나로 LXC를 사용할 수 있으며 이를 통해 이미지 관리와 개발 서비스를 제공한다. 
- 위키피디아 


2. 기존 가상화 기술과 LXC의 차이점




 KVM과 같은 하이퍼바이저를 이용하는 가상화 깃루은 가상머신이 물리적 하드웨어를 실제로 사용하는 것이기 때문에 그 하드웨어 자원을 이용하는 Guest OS가 반드시 필요합니다. 왼쪽 그림처럼 OS위에 또 다른 OS가 동작한다고 보시면 됩니다. 이러한 방법은 가상머신을 실행하는 Host OS와 Guest OS를 완전히 분리 할 수 있는 장점이 있지만, 컴퓨터를 통째로 만들어 내는 것과 같기 때문에 오버 헤드가 증가 및 각종 성능 손실이 발생하는 단점이 있습니다.
 LXC는 오른쪽 그림과 같이 모든 프로세스가 Host OS에서 바로 시작합니다. 일반적인 프로세스의 동작과 다른 점은 프로세스의 일부를 그룹화하고 다른 그룹에 속하지 않는 프로세스에서 단절된 공간으로 동작한다는 것입니다. 마치 화물 컨테이너처럼 독립된 공간에 프로세스가 들어 있기 때문에 '컨테이너'라고 부릅니다. 그리고 한 컨테이너에서 다른 컨테이너의 내부는 볼 수 없습니다.
 다시 말하자면, 컨테이너를 사용하는 것은 가상 머신을 생성하는 것이 아니라 Host OS가 사용하는 자원을 분리하여 여러 환경을 만들 수 있도록 하는 것입니다. 이러한 방식을 사용하기 떄문에 부팅 및 종료라는 개념이 없어 가상 환경의 시작과 종료가 매우 빠릅니다.


3. LXC의 장단점

 컨테이너의 방식은 OS에서 관리되기 때문에 OS레벨의 가상화라고 부르기도 합니다.

장점

1. 빠른 시작과 종료 속도

 컨테이너를 생성하는 것은 일반적인 프로세스를 시작하는 것과 같기 때문에 일반적인 프로세스를 시작하는 것과 별 차이가 없습니다. 그리고 가상 환경이 커널에서 공유되기 때문에 새로운 커널을 시작할 필요가 없습니다.

2. 높은 집적도 

 컨테이너는 분리된 공간을 구성하는 것이기 때문에 컴퓨터 상에서 동작하는 OS는 하나입니다. 여러 개의 컨테이너를 만들어서 실행한다고 해도 OS는 하나이기 때문에 가상머신에 비해 고 밀도화가 가능합니다.
 그리고 컨테이너에서 실행되는 프로세스를 위한 메모리만 필요하기 때문에 낮은 사양의 환경에서 더욱 활용도가 높습니다.

3. 낮은 오버헤드

 가상화를 위한 하드웨어 에뮬레이트 단계가 없기 때문에 오버 헤드가 줄어듭니다.

4. 어플리케이션 컨테이너 지원

 컨테이너는 목적에 맞는 프로세스만 존재하는 환경을 만들 수 있습니다. 즉 웹서버 용 컨테이너라면 Apache Httpd 프로세스만 존재하는 컨테이너를 만들 수 있습니다.
이러한 환경을 어플리케이션 컨테이너라고합니다. 물론 init을 처음 시작하여 보통의 OS가 시작하는 것과 같은 환경을 만들 수 있는데 이를 시스템 컨테이너라고 합니다.

단점

1. Host OS에 종속적

 리눅스 컨테이너는 OS에 있는 리눅스 커널이 관리하는 것이므로, 당연히 리눅스외에 다른 OS에서는 동작하지 않으며, 컨테이너 환경에서도 다른 OS를 설치할 수 없습니다.

2. 컨테이너별 커널구성 불가

 커널에 관련된 작업은 가능하지만, 컨테이너마다 다른 커널 작업을 수행 할 수는 없습니다. 따라서 컨테이너에서 보이는 장치나 로드되는 커널 모듈은 모두 동일합니다.


4. cgroups(control groups)


 LXC는 cgroups 기능을 사용하여 다양한 자원을 분리하여 독립적인 환경을 제공하는 것입니다.
 cgroups는 프로세스 그룹의 리소스의 이용을 제한, 격리하는 기능입니다. cgroups는 다음과 같은 기능을 제공합니다.

  • 자원 제한 : 그룹의 메모리 사용량을 제한 할 수 있다.
  • 우선 순위 : 여러 그룹에 의해 큰 CPU와 디스크 I/O 처리량을 할당함
  • 기록 : 시스템이 자원을 얼마나 사용하고 있는지 측정한다.
  • 격리 : 다른 네임 스페이스에 그룹을 분리하고 다른 그룹의 프로세스 네트워크 연결 파일이 눈에 띄지 않게 함
cgroups는 동일한 기준으로 수집 된 프로세스의 집합입니다. 이 그룹들은 계층적인데, 각 그룹은 부모 그룹으로 부터 한계를 상속받는다는 뜻이다. 커널은 cgroup 인터페이스로 부터 다수의 컨트롤러(또한 서브시스템이라 불리는)로의 접근을 제공한다. 예를 들어 "메모리" 컨트롤러는 메모리 사용을 제한하고, "cpuacct"은 CPU사용을 할당하는 것이다.

5. Docker

 
 Docker는 Go언어로 작성된 소프트웨어 입니다. 원래는 컨테이너를 구현하기 위해 리눅스 컨테이너를 사용했지만, Docker 0.9버전 부터는 자체 컨테이너를 직접 만들어 사용하고 있습니다. Docker는 단순한 컨테이너의 구현을 넘어 컨테이너 기반 가상화 환경을 구축하고 있습니다.


6. References









2016년 3월 23일 수요일

[머신러닝] Deep Learning Tutorials

이 글은 http://deeplearning.net/tutorial/index.html의 내용을 공부목적으로 번역한 것입니다.
번역이 이상할 수 있고 필요한 내용만 번역되어 있을 수 도 있습니다.

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

 딥러닝은 머신러닝의 원래 목표중 하나인 인공지능으로 다가게하는 목적으로 소개된 머신러닝 연구의 새로운 분야다.

 딥러닝은 이미지, 소리 그리고 텍스트와 같은 데이터들의 이해를 돕는 다양한계층의 표현과 추상적 개념에 대한 학습이다. 딥러닝 알고리즘에 대한 예제를 보고싶으면 다음을 예를 보면 된다 :



  • The monograph or review paper Learning Deep Architectures for AI (Foundations & Trends in Machine Learning, 2009).
  • The ICML 2009 Workshop on Learning Feature Hierarchies webpage has a list of references.
  • The LISA public wiki has a reading list and a bibliography.
  • Geoff Hinton has readings from 2009’s NIPS tutorial.

  •  여기있는 튜토리얼들은 가장 중요한 몇개의 딥러닝 알고리즘과 그것을 Theano를 이용해 어떻게 작동시킬것인지 소개할 것이다. Theano는 딥러닝 모델을 쉽게 배울수 있게하고 그것들을 GPU에서 훈련시킬수 있도록 선택할 수 있는 파이썬 라이브러리이다.

     이 알고리즘 튜토리얼은 몇가지 전재조건이 있다. 여러분들은 파이썬에 대해 약간 알아야 하고 numpy에 친숙해야한다. 이 튜토리얼이 Theano를 사용하기로 하기로 한 이후부터 여러분들은 먼저 Theano basic tutorial을 읽어야 한다. 이것을 한 후에 표기법과 알고리즘 튜토리얼들에 쓰일 다운로드 가능한 데이터셋 그리고 우리가 최적화를 할 방법인 확률 기울기 하강 (Stochastic Gradient Descent)에 대해 소개된 Getting Started 챕터를 보면된다.

    The purely supervised learning algorithms are meant to be read in order:
    1. Logistic Regression - using Theano for something simple
    2. Multilayer perceptron - introduction to layers
    3. Deep Convolutional Network - a simplified version of LeNet5
    The unsupervised and semi-supervised learning algorithms can be read in any order (the auto-encoders can be read independently of the RBM/DBN thread):
    Building towards including the mcRBM model, we have a new tutorial on sampling from energy models:
    • HMC Sampling - hybrid (aka Hamiltonian) Monte-Carlo sampling with scan()
    Building towards including the Contractive auto-encoders tutorial, we have the code for now:
    Recurrent neural networks with word embeddings and context window:
    LSTM network for sentiment analysis:
    Energy-based recurrent neural network (RNN-RBM):
    Note that the tutorials here are all compatible with Python 2 and 3, with the exception of Modeling and generating sequences of polyphonic music with the RNN-RBM which is only available for Python 2.




    2016년 3월 19일 토요일

    [머신러닝] CNN(Convolution Neural Network)

    Why CNN?




     이미지 인식과 같은 분야에서 MLP(Multi-Layer Perceptron) 또는 multi-layered neural network를 사용하게 되면 MLP는 모든 입력이 위치와 상관없이 동일한 수준의 중요도를 갖는다고 본다. 그렇기 때문에 이를 이용해 fully-connected neural network를 구성하게 되면 파라미터의 크기가 엄청나게 커지는 문제가 생긴다. 이에 대한 해결책으로 탄생한 것이 바로 CNN이다.


    Receptive Field


     수용영역이란 외부 자극이 전체 영향을 끼치는 것이 아니라 특정 영역에만 영향을 준다는 뜻이다. 손가락으로 몸의 여러 부분을 찔러 보았을 때 그것을 느낄 수 있는 범위가 제한적이라는 것을 생각하면 될 것이다. 그리고 어디를 찌르느냐에 따라 느끼는 영역의 크기가 다를 것이다.

     마찬가지로 영상에서 특정 위치에 있는 픽셀들은 그 주변에 있는 일부 픽셀들 하고만 correlation이 높고 거리가 멀어질수록 그 영향은 감소하게 된다. 이를 이용해 영상이나 이미지를 해석하여 "인식 알고리즘"을 수행하고자 할 경우 영상 전체 영역에 대해 서로 동일한 중요도를 부여하여 처리하는 대신에 특정 범위를 한정해 처리를 하면 훨씬 효과적일 것이라 짐작 할 수 있다. 이를 영상에만 한정하는 것이 아니라 locality를 갖는 모든 신호들에 유사하게 적용할 수있다는 아이디어에 기반하여 출현한 것이 CNN이다.

    convolution이란?


     영상 처리 분야에서 convolution은 주로 filter 연산에 사용되며 영상으로부터 특정 feature들을 추출하기 위한 필터를 구현할 때 convolution을 사용한다. 즉 3 by 3 또는 그 이상의 window 혹은 mask를 영상 전체에 대해 반복적으로 수행을 하게 되면, 그 mask의 계수 값들의 따라 적정한 결과를 얻을 수 있다.

     아래 그림을 보면 왼쪽의 전체 이미지에서 노란 부분이 현재 convolution이 일어나고 있는 영역이며, 빨간 글자는 convolution의 kernel에 해당하고, 노란 영역의 mask에 대해 연산을 수행하면 결과는 오른쪽 처럼 4가 나오며 노란 윈도우 영역을 오른쪽으로 이동시켜 다시 결과를 구하면 3이 되며 계속 이동을 시키면서 연산을 하면 최종적인 결과를 얻을 수 있다.





    CNN의 특징



    CNN에서 Convoutional이 붙은 이유는 convolutional 신경망 연산을 한다는 뜻이며, CNN은 기존 multi-layered neural network에 비해 아래와 같은 중요한 특징을 갖는다


     Locality

     CNN은 수용영역과 유사하게 local 정보를 활용한다. 공간적으로 인접한 신호들에 대한 correlation관계를 비선형 필터를 적용하여 추출해 내는데 이러한 필터를 여러 개 적용하면 다양한 local 특징을 추출해 낼 수 있게 된다.

     Shared Weight

     동일한 계수를 갖는 filter를 영상 전체에 반복적으로 적용함으로서 변수의 수를 획기적으로 줄일 수 있으며, topology 변화에 무관한 항상성을 얻을 수 있게된다.



    CNN의 구조


     CNN은 일반적으로 3종류의 계층을 가지고 있다.


    1. Convolution layer : Convolution feature를 추출하는 layer로 의미있는 특징들을 추출하기 위한 층이다.
    2. Pooling layer : 이미지의 특성상 많은 픽셀이 존재하기 때문에 feature를 줄이기 위해 subsampling을 하는 층이다.
    3. Feedforward layer : convolution layer와 pooling layer에서 나온 feature를 이용해서 분류를 하는 층이다.

     CNN 처리 과정은 단순하게 분류기로 구성 된 것이 아니라 특징을 추출하는 단계가 포함되어 있기 때문에, raw image에 대해 직접 operation이 가능하며, 기존 알고리즘과 달리 별도의 전처리 단계를 필요로하지 않는다. 특징 추출과 topology invariance를 얻기 위해 filter와 sub-sampling을 거치며 이 과정을 반복적으로 수행하여 local feature로부터 global 를 얻어낸다.

     대부분의 영상 인식 알고리즘에서는 특징을 추출하기 위해 filter를 사용한다. 보통 5 by 5 나 3 by 3 필터를 사용하는데 필터에 사용하는 계수들의 값에 따라 각각 다른 특징을 얻을 수 가 있다. 일반적으로 이 계수들은 특정 목적에 따라 고정이 되지만 CNN에서 사용하는 계수들은 학습을 통해 결정 된다는 점이 다르다.

     CNN에서는 max-pooling 방식의 sub-sampling 과정을 거친다. 간단히 설명하자면 각 window에서 가장 큰 자극만을 선택하는 것이다. 이 과정(convolution + sub-sampling) 과정을 여러변 거치게 되면 이미지 전체를 대표할 수 있는 global한 특징을 얻을 수 있게 된다. 이렇게 얻은 특징을 학습 시키면 topology 변화에 강인한 인식 능력을 갖게 된다.











    2016년 2월 26일 금요일

    [데이터 분석] 데이터 준비하기 : 다듬기, 변형, 병합

     미국 농무부는 음식의 영양소 정보 데이터베이스를 제공하고 있습니다. 영국 해커 애슐리 윌리엄스는 이 데이터베이스를 Json 형식으로 웹사이트 (http://ashleyw.co.uk/project/food-nutrient-database)에 제공하고 있습니다.  각 음식에는 수자로 된 고유 ID와 영양소 및 제공량을 담고 있는 두 가지 리스트가 있으나 이 데이터 형식은 분석하기 좋지 않으므로 데이터 형식을 바꿔 보도록 하겠습니다. 
     웹사이트에서 데이터를 내려받은 다음 압축을 해제하고 선호하는 JSON 라이브러리를 사용해서 파이썬에 읽어오도록 하겠습니다.



     db에 있는 각 엔트리는 한 가지 음식에 대한 모든 정보를 담고 있는 사전형입니다. 'nutrients' 필드는 사전의 리스트이며 각 항목은 한 가지 영양소에 대한 정보를 담고 있습니다.


     사전의 리스트를 DataFrame으로 바꿀 때 추출할 필드의 목록을 지정해줄 수 있습니다. 음식의 이름과 그룹, id 그리고 제조사를 추출해 보도록 하겠습니다.



     그리고 value_counts 메서드를 이용해서 음식 그룹의 분포를 확인해 볼 수 있습니다.



     이제 모든 영양소 정보를 분석해 보도록 하겠습니다. 먼저 더 쉽게 분석을 하기 위해 각 음식의 영양소 정보를 하나의 테이블에 담아보겠습니다. 그러기 위해서는 몇 가지 과정을 거쳐야 하는데 먼저 음식의 영양소 리스트를 하나의 DataFrame으로 변환하고 음식의 id를 위한 칼럼을 하나 추가합니다. 그리고 이 DataFrame을 리스트에 추가합니다. 마지막으로 이 리스트를 concat 메서드를 사용해서 하나로 합쳐보겠습니다.


     문제가 없다면 nutrients는 다음과 같을 것입니다.


      총 389355개의 데이터가 있습니다. 하지만 이 DataFrame에는 중복된 데이터가 있으므로 제거하도록 하겠습니다.



     중복된 데이터를 제거하니 14179개로 줄어들었습니다. 중복된 데이터가 굉장히 많았네요. 그리고 'group'과 'description'은 모두 DataFrame 객체이므로 뭐가 뭔지 쉽게 알아볼 수 있도록 이름을 바꾸도록 하겠습니다.


     이 데이터를 음식 그룹과 영양소의 종류별 중간 값을 그래프로 그려 보도록 하겠습니다.


     좀 더 응용하면 각 영양소가 어떤 음식에 가장 많이 들어있는지 찾아볼 수도 있습니다.


    위 코드의 실행 결과를 전부 보기에는 너무 방대하므로 여기서는 아미노산에 대한 내용만을 다뤄봤습니다.







    2016년 2월 12일 금요일

    [책 리뷰] 프로페셔널의 조건




     서평


     노트를 뒤적거리다 작년에 읽은 피터드러커의 프로페셔널의 조건이란 책에 대해 간단하게 메모해 놓은 것을 발견했다. 작년에 들은 어떤 강의에서 자기 개발서의 원조격인 책이라고 이것만 보면 다른 자기 개발서들은 이 책을 보고 저자들이 주석을 달아 놓은 수준이라 굳이 읽을 필요가 없다고 한 강사님의 말을 기억해 두었다가 도서관에서 빌려서 봤었다. 읽어보고 느낀점은 그 분야의 고전에 해당하는 책들은 다르구나라는 느낌과 다른 자기 개발서들은 이 책에서 하는 말들의 일부분을 더 알아듣기 쉽게 설명했구나라는 생각이 들었다. 그리고 항상 명심해두고 있어야할 말들이 있는 것 같아 다시 한번 정리해 봤다.

    요약


     효과적인 사람, 지속적인 성장을 할 수 있는 사람, 변화 할 수 있는 사람이 되어라

     그리고 이책에서 내가 제일 인상깊게 보았던 7가지가 있다.

    1. 나에겐 분명 한 번더 도전해 볼 의무가 있다.
     - 실패 한다고 해서 포기하지 말라는 의미였던것 같다.

    2. 완벽은 나를 피해가겠지만 나는 다시 한 번 완벽을 추구 할 것이다.
     - 내가 생산하는 생산물 중 가장 완벽한 것은 내가 바로 다음에 할 것이다.

    3. 항상 '신들이 보고있다.' 라는 생각을 해라.
     - '누가 보는것도 아닌데 대충하지뭐'라는 마음가짐을 버리라는 뜻인것 같다.
    4. 잘한일, 잘하고자 한일, 잘하고자 충분히 노력하지않은일, 실패한일에 대한 검토를 하라
     - 피드백을 하라

    5. 새로운 일을 할 때에는 그에 걸맞는 사람이 되어라.
     - 자리가 사람을 만든다는 수동적 의미가 아닌 내가 그 자리에 맞는 사람이 스스로 되라는    것 같다.

    6. 어떤 일을 할 때에는 예상하는 결과를 기록하고 그 이후에 그 기록과 비교할 것
     - 이것도 피드백과 비슷한 말인것 같다.

    7. 음... 내가 기록하면서 누락시킨것 같다..

     그리고 이런 생각을 하면서 살아가라는 이야기도 있었다.

    1. 내가 어떤사람으로 기억되기를 원하는가
     - 내 삶의 가치관에 대한 이야기로 기억한다.

    2. 그리고 이 생각은 그 나이에 맞게 변해야 한다.
     - 자기 상황에 맞는 가치관을 가지고 있어야 한다는 뜻인거 같다.

    3. 사는 동안 다른 사람의 삶에 변화를 일으킬 수 있어야 한다.
     - 다른 사람에게 영향을 주는 사람이 되라는 뜻인가..?

     이러 한 말도 있다.

    1. 자신이 한 일의 결과에 대해 스스로 대견하게 생각하라
     - 자신감과 관련된 이야기 같다.

    2. 나의 강점은 무엇인가?
     - 피드백 분석을 통해 확인

    3. 나는 어떻게 성과를 올리는가?
     - 내가 성공했던 방식에 대한 분석을 해서 그 방법을 인생 전체에 적용하라는 뜻

    4. 나의 가치관은 무엇인가

    시간 관리에 대한 말도 있었다.

    1. 시간이 없을 때는 우선 전혀 할 필요가 없는 일을 제거하라
     - 쓸데없는 일에 에너지를 낭비하지 말라는 것  같다.

    2. 다른 사람이 할 수 있는일을 위임하라
     - 아웃소싱의 개념이라고 보면 될거같다.

    이 책에서 정의하는 집중이란

    진정 의미 있는 일은 무엇인가, 먼저해야 할 것은 무엇인가 라는 관점에서 경우에 따라 스스로 의사결정을 하는 용기라 한다.

     그리고 마지막으로 의사결정의 불일치를 조장하라 라는 말이 있다. 아마 너무 쉽게 결론을 내리지 말고 좀 더 나은 결과를 위해 브레인스토밍과 같은 것들을 더하라는 이야기였던걸로 기억한다.

     내가 정리한 내용은 여기까지다. 아마 더 있을텐데 정리를 하다가 그만 둔 것이 많지 않나 싶다.










    2016년 2월 10일 수요일

    [Digital Signage] Xibo 설치

     이번에는 Digital Signage용 오픈소스 OS인 Xibo를 설치하는 방법에 대해 알아보겠습니다.
    Xibo는 php기반이기 때문이 php가 설치되어 있어야 합니다. php 설치가 필요하신 분들은 http://cd4761.blogspot.kr/2016/02/it-php.html로 가셔서 설치를 하신다음 진행해주시기 바랍니다.


     http://xibo.org.uk/ 에 접속해서 아래 그림과 같이 표시된 것들을 다운로드 받습니다.



     먼저 CMS를 설치해 보도록 하겠습니다.

    CMS


    CMS란?


     CMS는 Content Management System의 약자로 말그대로 Digital Signage를 통해 보여줄 컨텐츠들을 관리하는 시스템이라 보시면 됩니다. CMS는 PHP/ MySQL 웹 어플리케이션 이며 Apache, nginx 그리고 Microsoft IIS에서 작동 합니다.

    CMS설치





    다운로드 받은 CMS파일을 압축 푼 다음 C:\Bitnami\wampstack-5.5.31-0\apache2\htdocs에 다음과 같이 위치 시켜줍니다.




    Xibo폴더 내부는 다음과 같습니다.




    그 다음 브라우저에 localhost/Xibo를 입력하면 다음과 같은 화면이 출력됩니다. 하지만 사진을 보시면 각 항목이 체크 표시가 된 경우도 있고 x표시가 된 경우도 있을 것 입니다. 그럴 경우 C:\Bitnami\wampstack-5.5.31-0\php 폴더에 있는 php.ini 파일을 열면



     위와 같은 부분이 있을 것입니다. 저는 Fileinfo와 SOAP Extension에 문제가 있다고 되어있는데 이럴경우 저 부분에 extension=php_fileinfo.dll과 extension=php_soap.dll을 입력해주시면 해결이 됩니다.

     나머지 설치를 진행해주시고 설치가 완료된 후에 로그인을 하면



     다음과 같은 화면이 나올 것입니다. 그러면 설치가 올바르게 되었다고 보시면 됩니다.






    [기타IT] php설치

     이번에는 php 설치하는 법에 대해 알아보겠습니다. 저는 개발할 때 node.js를 사용 하지만 이번에 프로젝트하는데 필요한 xibo가 php기반이라 설치하게 되었습니다.


    php란?


     php(약칭 : Hypertext Preprocessor)는 프로그래밍 언어의 일종으로 동적 웹 페이지를 만들기 위해 설계되었습니다. php는 일반적으로 혼자 설치되지 않고 apache와 MySql과 함께 설치되는 것이 일반적입니다.  php는 apache를 통해 브라우저로 정보를 전송하고 MySql을 이용해 사용자의 정보를 저장하기 때문에 일반적으로 함께 사용되고 설치됩니다. 이를 APM이라 하는데 Window에 설치하는 APM을 WAPM이라 합니다. 이걸 각각 설치 할 수도 있지만 난이도가 있기 때문에 Bitnami를 이용해 한번에 설치해 보도록 하겠습니다.

    php설치




    먼저 https://bitnami.com/stack/wamp에 접속하여 설치파일을 다운로드 받습니다.





     다운로드가 완료되면 설치파일을 실행합니다.






    다른 구성요소들은 굳이 필요하지 않으니 체크박스를 해제해줍니다.




    php에서 쓰는 MySql의 root사용자 비밀번호를 설정해주는 화면입니다. 6자리 이상의 비밀번호를 입력하시면 됩니다.





    설치가 되고 있는 화면입니다. 


    설치가 완료되고 브라우저 주소창에 localhost를 쳤을 때 다음과 같은 화면이 출력되면 제대로 설치가 된것입니다.






    2016년 2월 8일 월요일

    [기타IT] 파싱

     파이썬 공부를 하다가 파싱에 관한 코드를 보고 파싱이 도대체 무엇인지 궁금해져서 파싱에 대해 알아 봤습니다.

     파서(Parser)란?


    Compiler의 일부




     즉, Compiler 나 Interpreter에서 원시 프로그램을 읽어 들여, 그 문장의 구조를 알아내는 구문 분석(parsing)을 행하는 프로그램을 파서라고 합니다.

    파싱 형태 - DOM, SAX


    DOM과 SAX란?


     하나의 API로서, XML 문서를 구조화 - XML문서에 있는 Data를 효과적으로 다루기 위해 필요합니다. 이번에는 DOM방식에 대해서만 알아보도록 하겠습니다.

    XML 파서의 분류

    •  DOM(Document Object Model) : 트리 기반의 파서
    •  SAX(Simple API for XML) : 이벤트 기반의 파서
    -> DOM과 SAX 방식의 차이점은 문서 접근 방식의 차이라고 합니다. 즉, DOM은 임의적 접근을 하고 SAX는 순차적 접근을 합니다.

    DOM - 객체 지향 모델


     DOM 문서의 물리적 구조와 문서가 접근되고 다루어지는 방법을 정의하는 방식 입니다. XML 문서를 하나의 Tree 구조로 본다는 특징이 있고 파서가 모든 이벤트들을 잡아서 그 결과를 메모리 상에 트리 형태로 만들고 application이 그 결과를 이용하도록 합니다.
     DOM의 특징으로는

    1. XML 문서를 메모리에 올려놓고 데이터를 찾아 들어가는 방식을 사용
    2. 모든 데이터를 다 읽기 때문에 큰 문서일 경우 로딩 시간이 걸리거나 메모리 낭비를 낭비    하게 됨
    3. 문서 편집 가능
    4. 데이터를 저장된 순서대로 받음

    과 같은 것들이 있습니다.

     그리고 DOM의 목적으로는

    1. 다양한 환경과 application에서 사용할 수 있는 표준적 프로그래밍 인터페이스 제공
    2. 프로그램 이나 스크립트를 통해 HTML이나 XML과 같은 웹 문서의 내용과 구조 그리고 스타일 정보의 검색이나 수정이 가능하게 해주는 플랫폼 또는 언어에 중립적 인터페이스

    가 있습니다.

     DOM의 구조와 원리

     DOM은 XML 문서에 노드들의 트리로 표현되는데, 특정 노드의 하위클래스는 요소, 텍스트, 주석이 될 수 있습니다. 그래서 DOM은 Tree 구조로서 XML문서를 다루게 되는 것입니다. 
     다음은 XML 문서와 DOM 트리구조에 대해 알아보도록 하겠습니다.

     <?xml version="1.0" encoding="euc-kr"?>
       <book>
          <title>파싱에 대하여</title>
          <category>IT</category>
       </book>

    위와 같은 XML코드가 있을 경우, 아래와 같이 DOM 노드 트리 모델링을 할 수 있습니다.


     마지막으로 SAX 방식과 DOM 방식의 파싱을 비교해 보도록 하겠습니다.



    SAXDOM
    접근 방법이벤트 기반트리 기반
    장 점메모리 효율, 빠른 속도문서의 임의접근
    단 점구조에 대한 접근 곤란, 읽기 전용, 브라우저 지원 안됨메모리 사용량 큼, 속도 느림
    적용 분야문서 일부분만 읽을 때, 데이터 변환 시 유효성 처리구조적 접근이 필요한 경우, 문서정보를 쉽게 파악할 때




    2016년 1월 31일 일요일

    [머신러닝] 최소자승법(Least Square Method)

     이번에는 시계열 분석에 사용되는 최소자승법에 대해 알아보겠다. 예를 들어, 대학교 입학성적이 대학교 재학 중 학업성적에 미치는 영향을 조사하기 원한다고 가정하자. 이를 위해 6명의 재학생의 입학성적(x1=수능성적, x2=학생부 성적)과 학생들의 대학 재학시 총 평균학점(y=GPA)의 자료를 얻었다.


    이 자료를 근거로 재학생의 학업 성취도가 대학 입학성적과 어떤 연관이 있는지 살펴 보려면 

    Y = a1x1 + a2x2    (1.1)
     을 만족하는 a1, a2 값을 정하면 된다. 여기서 a1은 수능성적이 1점 상승할 때 대학에서의 GPA가 얼마나 오르는지에 대한 증가량을 나타내며 a1>0이면 수능 성적이 높을 수록 GPA가 높아짐을 의미한다. 모든 자료가 식 1.1을 만족시키는 것은 불가능하기 때문에 오차항(error) ei을 이용하면 i 번째 학생의 경우

    yi = a1x x1i  + a2 x2i + ei    (1.2)

    라는 모형식을 가정 할 수 있다. 이를 행렬식으로 표시하면 y = Xa+e라고 할 수 있다. 그리고 여기서 a값을 결정하기 위해 흔히 사용하는 방법은 오차항의 길이 제곱을 최소로 하는 방법인데, 이를 최소자승법이라고 한다.
     기하학적으로 오차항의 길이를 최소로 하는 방법은 벡터 y를 열공간 C(X)에 투영시켰을 때의 a값을 얻는 거이며, 이때 투영된 그림자를 y^이라 하고 그 때의 a값을 a^이라고 한다면 

    y^ = Py = X(XTX)-1XTy = Xa^   (1.3)

    로 부터

    a^ = (X­TX)-1XTy   (1.4)

    라는 값이 얻어지고 이를 '최소자승추정량(Least Squares Estimator)'라고 한다.


    [데이터 분석] 파이썬에서 소셜 데이터 수집과 분석

    이 글은 정광윤님이 DB Guide.net에 연재한
    개발자를 위한 파이썬 분석을 정리한 내용입니다.

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

     트위터에서 트윗되고 있는 데이터 중에서 파이썬, 자바스크립트, 루비(Ruby)의 인기도를 분석해 보자.

    0. 준비하기

    먼저 필요한 패키지들은 다음과 같다.

    1. pandas
    2. matplotlib
    3. json
    4. re
    5. tweepy

    여기서 3,4번은 이미 내장되어 있는 패키지이다. 1,2 번은 pip install을 사용해 설치하면 되기 때문에 tweepy 설치 방법만 알아 보겠다.

    1. Twitter API key 획득하기

     Application Programming Interface의 약자인 API라는 것이 있다. 이 API 덕분에 우리가 데이터를 흔하게 접할 수 있고 쉽게 데이터를 획득 할 수 있다. API는 즉, 프로그래밍 언어로 어플리케이션에 접근할 수 있는 인터페이스이다.

     트위터로부터 데이터를 가져오기 위해서는 아래 4가지 정보가 필요하다.

    1. API Key
    2. API Secret
    3. Access Token
    4. Access Token Secret

     이 네가지 정보를 얻기 위해서는 트위터 계정이 있어야하고 계정에 본인의 핸드폰 번호도 등록되어 있어야 한다.

    1. https://apps.twitter.com/에 접속한다.
    2. 우측 상단의 'Create New App'을 클릭한다.
    3. 양식들에 값들을 적당히 채운다.(이름, 설명, 웹사이트(아무거나 입력 가능)만 입력하면 된다.)

    4. 'Create your Twitter application'을 클릭한다.
    5. 'Keys and Access Tokens' 탭으로 이동하면 Consumer Key(API Key), Consumer Secret(API Secret)이 있다.
    6. 그 아래를 보면 'Create my access token' 버튼이 있고 이를 클릭한다.
    7. 'Access token'과 'Access token secret'이 생성된다.

    2. Twitter API에 연결해 데이터 다운로드 받기

     트위터 API에 접근하기 위해 Tweepy 라이브러리를 이용할 것이다.

    터미널에서 다음과 같이 입력해 설치!


    설치를 하다보니 pip의 버전을 8.0.2로 업그레이드 하라는 문구가 나와 업데이트를 했더니 그 후 부터 pip 명령어가 작동을 안한다.... 이거 해결하는 방법 아시는 분은 댓글로 알려주세요 ㅜ

     그 다음 아래와 같은 소스를 작성해서 twitter.py로 저장!


     중간 부분인 ①에 선언한 StdOutListener라는 클래스는 수 많은 트윗들을 가져와 print하는 역할을 하는 클래스이다. 우리는 이 print된 트윗들을 텍스트 파일로 저장할 것이다. 이 클래스는 tweepy의 StreamListener라는 클래스를 상속 받고 on_data와 on_error라는 함수를 오버라이딩 한다.

     ② 부분에서는 위에서 선언한 StdOutListener 클래스를 통해 I라는 객체를 만들었다. Access Token을 설정한 이후 stream = Stream(auth,I)를 통해 현재 트위터에서 발새되고 있는 트윗의 스트리밍을 객체로 만든 것이다. 객체의 모든 트윗을 다 저장할 수는 없기 때문에 filter를 통해 우리가 알고자 하는 파이썬, 자바스크립트, 루비만 필터링해 가져오도록 했다. 이것을 다음과 같이 실행해 보자.


     이 작업은 현재 트위터의 트윗 스트리밍에서 python, javascript, ruby라는 텍스트가 들어 있는 트윗을 실시간으로 twitter_data.txt 파일에 해당 내용을 출력-저장하는 것이다. 따라서 이작업에는 시간이 걸리기 때문에 데이터가 수집된 후에 계속 쓰도록 하겠다.

    2016년 1월 15일 금요일

    [책 리뷰]인사이트 통찰의 힘

      내가 가장 관심을 갖고 공부하는 분야가 데이터 분석인데 분석 기술 보다 중요한것이 분석 결과를 보고 인사이트를 도출해 내는 것이라 들었다. 하지만 듣기만 했을 뿐 도대체 무엇을 어떻게 해야하는지 감이 잡히지 않았는데 책을 보면서 약간 알것 같기도 하다는 생각을 하게 되었다.
     혁신이나 뭐니 하는 말이 많이 나오는 요즘 시대는 새로움을 향한 열망이 많은 시대인 것 같다. 이 책은 그 혁신을 이루기 위해 가장 중요한 것을 공감으로 봤다. 통찰을 발견하기 위한 렌즈를 바로 공감으로 봤는데 문제를 정의한 다음 그것에 대해 소통하고 관찰하고 코드를 맞추며 확산 시킨다. 그 다음 이것들을 공감이라는 렌즈를 통해 통찰, 발상, 그리고 콘셉트 설정을 통해 그것들을 수렴시킨 다음 그것들을 실행하는 법에 대한 내용이 이 책의 핵심 내용이다.

     위의 여섯가지 내용을 살펴보자. 먼저, 코드가 있다. 코드는 사용자에 맞는 문화 코드로 전환하라는 내용이다. 아무리 혁신적이고 좋은 아이디어 일지라도 사용자들의 정서와 문화 코드 같은 것들과 맞지 않으면 그 아이디어는 사용자들로 부터 반응을 이끌어내기 힘들 것이다. 혁신이라는 것은 사용자에게 혁신적이어야지 내가 느끼기에 혁신적이어선 안되기 때문이다. 책의 저자는 코드를 맞추기 위해 프로젝트를 진행할 때마다 '사용자 되어보기' 방법을 사용 한다고 한다. '사용자 되어보기'를 하기 위해 사용자에 맞는 환경을 조성한다고 한다. 예를 들어 학교와 관련된 프로젝트를 진행할 경우 프로젝트 룸을 실제 교실처럼 조성하는 것이다. 급훈을 달고, 학급내에 있는 것과 비슷한 게시판, 책상, 의자 등을 구비해놓고 그곳에서 프로젝트를 진행하며 '사용자 처럼'이 아니라 '진짜 사용자'가 되어 보는 방법이다.

     그 다음은 관찰이다. 관찰은 익숨함 속에 숨겨진 새로운 기회를 발견하는 것을 말한다. 새로운 것을 발견하는 것이 아니라 새로운 눈으로 사물을 보는 것이라 생각하면 될 것 같다. 인사이트 헌팅을 하는 관찰자에게는 행동 유발의 동기가 무엇인가?(Motivation), 원래 용도와 다른 사용은 없는가?(Workaround), 문제나 불편한 점은 무엇인가?(Pain-point), 기존의 나의 생각과 다른 점은 무엇인가?(New Perspective) 이 네 가지 질문이 필요하다고 한다.
    이러한 행동들을 통해 관찰을 하다보면 흥미로운 사실을 발견할 수 가 있는데 제 삼자가 봤을 때는 불편할 것 같은데 당사자들은 익숙해져서 그 불편함을 느끼지 못한다고 한다. 이러한 것들을 '익숙해진 불편함'이라고 한다. 이 '익숙해진 불편함'이 바로 혁신의 대상이라고 한다.

     통찰을 발견하는 세 번째 도구는 소통이다. 소통은 원초적 본능과 감성과 교감하는 것이라고 한다. 다양한 방식으로 사용자와 소통을 하는 이유는 사용자가 스스로 인지하지 못하는 미충족 니즈를 발견하기 위해서라고 한다. 그 미충족 니즈가 바로 비즈니스의 기회이다. 인간의 니즈는 네 가지로 정의 될 수 있다고 한다.
     미혼의 여성이 남성과 데이트를 하는 상황을 가정했을 때, '사랑받고 싶다 '와 같은 니즈를 일반적 니즈(common Needs)라 하며, '이상적인 남자를 만나고 싶다 '와 같은 니즈를 맥락적 니즈(Context Needs), '데이트를 하고싶다 ', '남자와 커피를 마시고 싶다 '와 같은 사람들이 특정한 상황에서 수행하고자 하는 행위적 니즈(Activity Needs), 마지막으로 '커피를 흘리지 않고 커피잔을 잡고 싶다 '와 같은 기능적 니즈(Qualifier Needs)로 구분된다고 한다. 그리고 비즈니스 적으로는 맥락적 니즈행위적 니즈초점을 맞추는 것이 좋다고 한다. 일반적인 니즈에 집중하면 제품이나 서비스의 차별성이 결여되기 쉽고, 기능적 니즈에 집중하다보면 경쟁 제품과의 충돌을 피할 수 없기 때문이다.
     사용자에 대한 통찰을 발견하기 위해서 인터뷰를 진행할 때의 노하우로 1. 사용자가 누구인지, 무엇을 알고 싶은지 충분히 연구한다. 2. 단답형이 아닌 오픈형 질문을 한다. 3.전체적인 경험을 묻는다. 와 같은 방법이 있다고 한다.

     이번에 다뤄볼 내용은 통찰이다. 통찰은 공감렌즈를 끼고 감춰진 인사이트를 낚는 것이다. 지금까지 알아 본 것은 사용자가 되어 코드를 맞추거나 관찰과 소통을 통해 새로운 사실을 발견하고 사용자와 공감하는 법에 대해 알아 보았다. 이 과정에서 통찰을 발견하기도 하지만 대부분은 전 단계에서 축적된 수많은 정보를 '분석하고 종합하는 수렴의 과정 '에서 통찰을 얻는 경우가 많다. 통찰을 찾는 방법 중 하나는 의미를 재해석하는 관점을 바꾸는 방법이 있다. 비즈니스 혁신을 위해 반드시 기술력이 필요하다는 생각에서 벗어나야 한다는 말이다. 새로운 관점에서 제품이나 서비스를 재해석하거나 기존과 전혀 다른 방식으로 사용자에게 가치를 전달하는 비즈니스 모델로도 시장 파괴적 혁신이 가능하다는 것을 의미한다. 이러한 관점의 전환을 이끌어 내는 공식이 있다. 그것은 '가만히 생각해 보면, OO은 OO이 아니라 OO이다.' 이다. OO는 각각 대상, 기존의 정의, 새로운 정의에 해당한다. 그리고 사소한 것이라도 어떤 인사이트가 떠올랐다면 그 순간 바로 그것을 기록해 놓아야 한다. 그러지 않으면 그 내용들이 대부분 머릿속에서 사라지고 말기 때문이다.
     아이디어를 다 모았으면 세 단계에 거쳐 인사이트를 뽑아내야 한다. 첫째, 개별 대상 정보의 분리와 색인 달기, 둘째, 정보의 의미 묶음 및 패턴 찾기, 셋째, 통합적 인사이트와 핵심 키워드 뽑기가 바로 그것이다. 이 과정을 거치면서 항상 '왜 그럴까?' 라는 질문을 하면 답을 찾기가 쉬울 것이다.

     그 다음으로는 발상이다. 발상은 말랑말랑한 아이디어로 상식을 뒤집는 것이라 한다. 앞의 과정을 통해 새로운 통찰을 얻었다면, 그 통찰에 근거한 창의적 해결책을 만들어야 한다. 창의적인 아이디어를 발상해내기 위해서는 기존의 틀에서 벗어나 자유로운 사고를 할 수 있어야 한다. 창의적인 아이디어를 위해서는 물리적 환경과 기확자나 디자이너의 마인드셋 그리고 실질적이고 효과적인 방법론 이 세가지가 필요하다고 한다. 그리고 긍정적인 질문을 하라고 한다. 그 질문법은 HMW라고 부른다. HMW(How might we ~?/ 어떻게 하면 그 니즈를 해결할 수 있을까?) 질문법은 경쟁자를 이기기 위한 'can'의 질문이 아니라 소비자를 만족시키고 많은 긍정적 가능성을 열어주는 'might'의 질문을 하는 것이다. can이나 should로 시작하는 질문은 판단의 의도를 내포하지만 might로 바꾸면 판단을 유보한다고 한다. 그리고 이질문에는 공급자의 니즈가아닌 사용자의 니즈를 담아야 하고 질문의 범위가 너무 넓지도 너무 좁지도 않게 만들어지도록 주의해야 한다고 한다.
     창의적 사고를 돕는 아이디어 발상 기법도 있다. 첫째, 이종 산업에서 아이디어의 영감을 구하는 불스아이, 둘째, 무작위 사물의 속성을 강제로 결합하는 랜덤링크, 셋째, 기능을 분리하여 처음부터 다시 그리는 언번들링, 넷째, 방사 사고로 생각을 확장하고 연결하는 마인드맵이 그것이다. 이러한 방식들을 통해 창의적인 아이디어를 도출해 내면 될 것이다.

     공감 디자인의 마지막 단계는 사용자 통찰에 기반한 콘셉트를 만들어 내는 것이다. 콘셉트는 상품을 하나로 꿰뚫어 사용자와 연결 시키는 것이라 보면 될것이다. 좋은 콘셉트에는 다섯 가지 속성이 있다고 한다. 첫째, 다른 것과 구분되는 독창성, 둘째, 누구나 쉽게 이해하도록 전달력을 높이는 구체성, 셋째, 불필요한 군더더기가 없는 단순성, 넷째, 돈을 주고 구입하고 싶은 가치성, 다섯째, 세상에 내놓을 수 있는 구현성이 바로 그것이다. 그리고 아무리 좋은 콘셉트를 잡아도 그것을 실행시키는 것은 다른 문제일 것이다. 이 콘셉트와 실행 사이의 깊은 협곡을 건너는 법으로는 첫째, 이해관계자를 콘셉트 개발에 참여시켜라, 둘째, 결과가 아닌 사용자 공감의 과정을 전달하라, 셋쨰, 경쟁 제품과 선도 제품을 스크리닝하라, 넷째, 작게 시작하여 신속하게 테스트하라가 있다.

     이상이 통찰과 창의성을 성취하는 법에 대한 이 책의 내용이다. 이 글을 작성하는데 시간이 꽤 걸렸다. 앞으로 다른 얘기를 쓰다보면 이거보다 더 오래 걸리겠지만. 이 글이 내가 넷상에 올려본 가장 긴 글이고 처음 써본 글이다. 처음 쓰다보니 이게 독서요약인지 그냥 책 내용 부분부분 긁어다 붙인건지 구분이 안되는 듯 하고 갈수록 힘들어져서 점점 대충 쓴 경향이 있지만 처음 써본 글이라는 것에 의의를 두고 싶다.

    독서 요약을 시작하며

     책을 읽고 난 뒤 나중가면 그 책의 내용이 기억나지 않을 때가 많다. 그리고 기억을 못하는데 읽어봤자 무슨 소용일까 싶은 생각도 많이 해봤다.
    책을 읽고 정리, 요약을 해놓으면 좀 더 기억이 오래가지 않을까 싶어 시작하는 독서요약(혹은 독후감).

    T-Robotics : Robot & Math: 추천! 로봇공학 / 기계학습 무료 교재(pdf) 15가지

    T-Robotics : Robot & Math: 추천! 로봇공학 / 기계학습 무료 교재(pdf) 15가지

    Terry.t.um님 블로그에서 가져온 무료 교재들 천천히 봐야지..