2018년 9월 18일 화요일

연구용 로버 프레임 정리

연구 주제가 시설물 운영 관리를 위한 원격 스캔 및 모니티링이라 로버를 사용하지 않을 수 없다. 이 글에서는 가성비 괜찬은 로버 프레임을 간단히 소개한다.

4WD 메카넘휠 로버
개발 상세내용 - https://daddynkidsmakers.blogspot.com/2016/06/3-4wd.html

Equivalent connector rover 5 mobile car chassis

The multifunctional rover 5 robot mobile car platform 




Dagu rover 5 tracked chassis mexico articulated 4 wheel robot


2018년 9월 17일 월요일

케라스 기반 이미지 인식 딥러닝 모델 구현

오랜만에 급한 일이 약간 처리되어, 쌓아 둔 케라스(Keras) 기반 딥러닝 자료를 정리한다. 이 글은 Inception, VGG등 대표적인 딥러닝 모델을 설명하고, 케라스 기반 VGG 딥러닝 구현 예제를 소개한다. 이 예제에서는 구글에서 얻은 건축 이미지와 3D 이미지 예측 정확도를 간단히 테스트해본다.

이미지넷 인식 딥러닝 모델
이미지넷 객체 인식 딥러닝 모델은 이미지넷 ImageNet Large Scale Visual Recognition Competition(ILSVRC) 대회를 통해 크게 발전되었다. 2014년 대회에서는 1000개 이미지 분류 문제가 있었고, 이를 위해, 이미지넷의 120만장 학습 이미지와 5만장 validation set, 10만장 test set을 사용할 수 있다. 
이 대회는 ground truth 와 가장 높은 확률로 예측된 클래스가 서로 일치하는 지 확인하는 top-1 정확도, 가장 높은 확률로 예측된 5개 클래스안에 ground truth 존재 여부를 확인하는 top-5 error rate로 순위를 매긴다.
Top-1 accuracy deep learning model(https://arxiv.org/abs/1605.07678) 

10 Testing Results (Review: ResNet — Winner of ILSVRC 2015 (Image Classification, Localization, Detection))

이미지 인식 문제에서 높은 정확도를 가진 모델 중 대표적인 것만 간략히 살펴본다. 

  • LENET5: 1994년 개발된 모델로 컨볼루션 뉴럴네트워크 사용함. 이 모델은 1988년부터 Yann LeCun이 개발되어 LeNet5으로 이름지어짐. 이 모델은 컨볼루션 레이어 3개를 사용하여, 이미지 특징 벡터를학습하였음. 이 당시에는 GPU가 없어, 대용량 계산 시간을 줄이기 위해 희소 연결 행렬을 사용하였음 

  • AlexNet: 딥러닝 대부 중 한명인 Geoffrey E. Hinton제자인 2012년 Alex Krizhevsky가 발표한 이미지넷의 이미지 인식 정확도를 극적으로높인 첫번째 딥러닝 모델. Top 5 test error가 15.4%로 2위 모델보다(26.2%) 정확도가 매우 높음. 5개 컨볼루션 레이어와 3개 fully connected 레이어 사용함. 이 모델에서 ReLu(Rectified Linear Unit), over fitting 방지를 위한 Dropout 기법이 적용됨. GPU를 NVIDIA GTX 580 사용하였음


  • Xception: 이미지 넷에서 0.945 정확도로 top-5 validation 획득한 모델. 입력 이미지는 299x299임
  • VGG: 2014년 옥스포드 VGG 그룹에서 개발된 딥러닝 모델. 알렉스넷의 커널 크기를 11에서 3x3으로 줄였고, 성능을 높임. 19층 레이어를 쌓음. 이미지넷 정확도를 92.3%로 개선. 층이 깊어 역전파 될 때 그레디언트가 작아져 해가 수렴되지 않은 문제(gradient vanishing)가 있었음 



  • ResNet: 2015년 이미지넷 ILSVRC에서 3.6% 에러율로 1등 차지한 모델. 참고로 인간 분류 오차가 5~10%임. 알렉스넷과 같은 전통적인 순차 네트워크와는 달리, ResNet은 exotic architecture로 네트워크 내에서 네트워크를 구조화한 모델임. 이런 구조는 마이크로 구조라는 블럭 빌딩 세트 집합으로 구성됨. residual block을 이용해 gradient vanishing문제 해결
Residual block(ResNet)

  • Inception: 2015년 이미지넷에서 우승. VGG의 계산 시간/성능을 개선한 모델. 다양한 필터와 1x1 풀링(pooling) 기법 등 사용해 전체적으로 네트워크 연결을 줄임. 컨볼루션 필터을 쪼개어 연산수를 낮게 만듬. 이를 통해, 핵심적인 연산은 밀도있게 처리함

  • DenseNet: 2016년 개발된 모델. 해를 좀 더 효과적으로 찾고 수렴시키기 위해, 역전파를 순차적으로 하는 것이 아닌 건너뛸수 있도록 네트워크 망을 개선함



객체 인식 딥러닝 모델
R-CNN(2013), FAST R-CNN(2015), FASTER R-CNN(2015), YOLO 등은 이미지 속 다양한 객체 경계를 탐색하는 모델이다. 이 문제는 경계 탐색 작업과 객체 분류 작업으로 구성된다.
아래 링크에 이와 관련된 모델 및 구조가 설명되어 있다.

케라스 설치 및 사용 방법
아래 링크를 참고해 케라스를 설치하고 실행되는 지 확인해 본다.

케라스 기반 VGG 딥러닝 모델 구현
케라스는 MXNet, Deeplearning4j, Tensorflow, Theano, 와 같은 다양한 딥러닝 프레임웍을 기능적으로 캡슐화한 딥러닝 프레임웍이다. 모델링이 직관적이고 간편해 많이 사용된다. 

케라스에는 VGG, ResNet, Inception V3, MobileNet 등 다양한 딥러닝 모델이 이미 구현되어 있어, 가져다 사용하기만 하면 된다. 

이 글에서는 VGG 딥러닝 모델을 케라스로 간단히 구현해 본다. 우선, 케라스, numpy, matplotlib 등은 설치되어 있다고 가정한다. VGG 모델은 이미 이미지넷이 훈련된 모델을 다운받아 사용한다. VGG로 이미지를 인식하는 코드는 다음과 같다.

from keras.models import Sequential 
import keras
import numpy as np
from keras.applications import vgg16, inception_v3, resnet50, mobilenet

#VGG 모델을 로딩함
vgg_model = vgg16.VGG16(weights='imagenet')

from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.applications.imagenet_utils import decode_predictions
import matplotlib.pyplot as plt

filename = '/home/ktw/tensorflow/door1.jpg'
# 이미지 로딩. PIL format
original = load_img(filename, target_size=(224, 224))
print('PIL image size',original.size)
plt.imshow(original)
plt.show()

# PIL 이미지를 numpy 배열로 변환
# Numpy 배열 (height, width, channel)
numpy_image = img_to_array(original)
plt.imshow(np.uint8(numpy_image))
plt.show()
print('numpy array size',numpy_image.shape)

# 이미지를 배치 포맷으로 변환
# 데이터 학습을 위해 특정 축에 차원 추가
# 네트워크 형태는 batchsize, height, width, channels 이 됨
image_batch = np.expand_dims(numpy_image, axis=0)
print('image batch size', image_batch.shape)
plt.imshow(np.uint8(image_batch[0]))

# 모델 준비
processed_image = vgg16.preprocess_input(image_batch.copy())

# 각 클래스 속할 확률 예측
predictions = vgg_model.predict(processed_image)
 
# 예측된 확률을 클래스 라벨로 변환. 상위 5개 예측된 클래스 표시
label = decode_predictions(predictions)
print(label)

구글에서 검색해 얻은 문, 창문과 같은 건축 실내 요소 이미지들을 저장해 놓고, 입력해 얻은 결과는 다음과 같다. sliding door로 인식된 결과를 확인할 수 있다.


다른 테스트를 위해, 3D 모델링에서 캡쳐한 이미지의 인식 정확도를 확인해 보았다. 
VGG딥러닝 모델에서 유사한 클래스가 인식된 것을 확인할 수 있다. 다만, 이미지넷에 올라온 객체가 본인이 제시한 이미지와는 상이한 부분이 있어 정확도가 높지는 않다. BIM과 같은 3D모델에서 캡쳐한 이미지가 유사하게 인식되나, 마찬가지로 정확도가 그리 높지는 않다. 

테스트해본 결과를 보면, 정확도를 높이기 위해서는 목적에 맞는 훈련용 데이터 확보와 처리가 필수적이라는 것을 알 수 있다. 딥러닝 모델은 훈련된 데이터셋에 대한 부분만 정확도 높게 예측할 뿐이다. 

레퍼런스




2018년 7월 13일 금요일

우분투 18.04 아나콘다 기반 텐서플로우 케라스 설치

아래 글은 우분투 18.04 기반 텐서플로우 케라스 설치 방법을 간략히 요약한 것이다.
아나콘다를 사용하기 때문에 설치는 매우 쉽다. 아래는 설치 후 테스트한 노트북 화면이다. 

2018년 7월 9일 월요일

손쉬운 해킹 도구

이 글은 간단한 해킹 도구에 대한 내용을 요약한다.

Hacker Warehouse

Universal Radio Hacker (hackaday.com)

레퍼런스

2018년 6월 20일 수요일

드론 기반 벨로다인 라이다 스캔

SLAM기술은 LiDAR기술이 저렴해 지면서 점점 더 다양한 분야에 확산되고 있다. 이미 드론이나 무인자율주행차량에 장착된 지 오래이며, 일부는 농업, 광업과 같은 특수한 분야에까지 응용되고 있다. 

2018년 6월 19일 화요일

밸로다인 LiDAR 센서와 VeloView 사용기

이 글은 밸로다인(Velodyne) LiDAR 센서와 VeloView 사용기를 간략히 공유한다.

진행 중인 연구과제 핵심 기술을 좀 더 깊게 이해하기 위해, 벨로다인 센서를 구입해 분석중이다. 2014년부터 진행한 비전 역설계 과제의 활용 센서는 Kinect, Intel RGBD sensor, RPLiDAR 였다. 이때 목적은 저렴한 스캔 기술이 가능한지 파악하는 것이었다. 그때 문제는 정확도와 밀도였는 데, Trimble TX5 LiDAR에 비해 현격하게 차이나는 정확도와 밀도는 플랜트와 같은 정밀 엔지니어링에 활용하기 어려운 수준이었다(플랜트 대상).

밸로다인센서 VLP-16은 IMU 데이터를 입력받을 수 있는 데이터 통합 보드를 함께 제공한다. 센서 스펙은 다음과 같다. 참고로, TX5 같은 전문적인 LiDAR 센서는 최소 수백만 포인트 이상 획득되는 데 실시간은 아니며, 가격이 고가이다. 참고로, 저가 모델인 VLP-16은 7~8백만원대로 구입할 수 있다.
  • Dual Returns
  • 830 grams
  • 16 Channels
  • 100m Range
  • Up to 600,000 Points per Second
  • 360° Horizontal FOV
  • ±15° Vertical FOV
  • Low Power Consumption
  • Protective Design

벨로다인에서 얻은 (X, Y, Z, I) 데이터로 구성된 포인트 클라우드 데이터에는 가속도 값이 포함되어 있지 않다. 센서가 기울어지면, 데이터도 함께 기울어지므로, 이를 보정할려면, IMU에서 제공하는 Xa, Ya, Za 가속도 값이 필수적이다. 통합 보드에 IMU를 장착하고, 데이터를 취득하면, (X, Y, Z, I, Xa, Ya, Za) 값이 함께 TCP/IP 케이블을 통해 컴퓨터에 전달되는 구조이다.
센서, 데이터 통합 보드 및 통신 케이블

벨로다인 라이다 센서

데이터 통합 보드

이론상 VLP-16센서는 100미터까지 스캔을 할 수 있다. 본인은 사무실 공간에서 스캔을 해 보았는 데, 600 미터제곱 면적의 사무실 공간 벽체까지 스캔되는 것을 확인하였다. 참고로, 사무실은 둥근 직사각형 모양이며, 중간에서 벽체까지 거리는 25미터 정도이다.
스캔된 포인트 클라우드 모습

밸로다인 센서를 구동하는 프로그램은 VeloView이다. 윈도우에서는 VeloView를 설치하면드라이버가 함께 설치된다. TCP/IP4 네트워크 등 설정 후, 프로그램을 실행하고 연결된 라이다 장치를 VLP-16으로 선택하면 바로 점군을 실시간으로 볼 수 있다. 

TCP/IP4 설정


단, TCP/IP 이더넷 케이블 통신이므로, 방화벽이 있는 경우, 비활성화해야 한다. 우분투 리눅스에서는 아래 github 링크에서 다운로드 받은 VeloView 소스를 빌드해야 한다. 
VeloView는 포인트 클라우드를 시계열방식으로 캡쳐할 수 있는 기능있다. .pcap 점군 캡쳐파일을 저장한 후, 다시 재생할 수 있다. VeloView의 자세한 기능은 다음 영상을 참고한다.

ParaView는 획득된 점군을 분석하고, 처리하는 프로그램으로 구입시 함께 포함되어 있다. 오픈소스이므로, 다운로드받아 설치해도 된다. 
ParaView 활용 예

3차원 점군은 대용량이다. 임베디드 보드는 대용량 점군 처리가 가능한 것이어야 하며, 다음과 같은 것을 추천한다. 
NVIDIA TX2
NVIDIA TX2 CARRIER BOARD(캐리어 보드. TX2 개발보드 크기가 너무 커 이동성이 떨어진다면 캐리어 보드를 사용하면 된다)

다음은 라떼판다(LATTE PANDA) 임베디드 컴퓨터에 VELOVIEW를 설치한 후 실행한 모습이다. 큰 문제 없이 포인트 클라우드가 실시간으로 획득되어 가시화되는 것을 확인할 수 있다.
 



아래는 ODROID XU4에 VLP16를 마운트해 만든 드론 기반 LiDAR 스캔 프로젝트 사례이다. 

이제, 엔지니어링 전용 라이다, 토탈 스테이션과 밸로다인 센서의 정확도, 밀도를 확인 비교해 볼 계획이다.

2018년 6월 13일 수요일

어린이를 위한 코딩 로봇

이 글은 코딩을 배우기에 적당한 코딩 로봇을 간략히 소개합니다.


1.Fable : A Modular Robot for everyone
https://goo.gl/tXSH1N

2. Tenergy ODEV Tomo STEM Robot 2-in-1 Transformable and Programmable APP Controlled Robot
http://amzn.to/2GwP4EG

3. Makeblock mBot Kit - STEM Education - Arduino - Scratch 2.0 - Programmable Robot Kit for Kids to Learn Coding, Robotics and Electronics (2.4G Version - School Prefer)
http://amzn.to/2DQWjt6

4. WowWee COJI The Coding Robot Toy
http://amzn.to/2DKPJAh

5. Evo App-Connected Coding Robot
http://amzn.to/2GvzVn0




2018년 5월 29일 화요일

우분투 18.04와 NVIDIA 드라이버 설치 솔류션

어김없이 우분투 LTS가 버전업되었다.

우리는 수많은 난관을 헤쳐나가야 하는 버전업을 선택할 것인가, 현재에 안주할 것인가를 선택해야 한다.
사서 고생 or 현실 안주

구글링을 해 보니 18.04버전은 더 좋아졌다는 커멘트가 많다. 버전업 되었는 데 당연하겠지라고 무시하려 하다가 혹시 그 거지같은 NVIDIA, UNITY 이슈 해결되었을지 모른다는 기대로 부팅 USB를 만들어본다(결국 이 문제는 그대로 남아있었다.T.T~).

우분투(UBUNTU)와 NVIDIA 그래픽카드 궁합은 서로 좋지 않다. 컴퓨터에 NVIDIA가 설치되어 있고, 우부투 설치 시 화면이 안보이거나 저해상도라 설치하기 어렵다면 심중팔구 NVIDIA 드라이버 문제이다.
 저해상도 문제(옵션이 안보이니 설치가 불가능 T.T~)
황당하기 그지 없는 블랙 스크린
무한 로긴

이런 문제로 날밤 새고, 아까운 시간과 체력을 날린게 얼마인가. 우분투 10번 설치는 기본. 수명 줄어드는 것이 느껴진다.
 
시지프스 빙의(ㅅㅂ)

물론, BIOS에서 NVIDIA를 비활성화하고 내장 그래픽으로 우분투를 사용할 수도 있다. 만약, 당신이 우분투로 유투브 영화나 뮤직 비디오 감상에만 사용한다면, 이 방법은 충분히 효과적이다.

하지만, 지구 정복?을 꿈꾸는 개발자나 연구자라면 NVIDIA GPU를 사용해 딥러닝(DEEP LEARNING) 모델을 만들고 싶거나, 비전, 그래픽, ROS 등 관련된 다양한 오픈소스 패키지를 사용해 보고 싶을 테고, 내장 그래픽카드로 설치된 우분투는 아무 의미 없는 운영체제나 마찬가지일 것이다. 그렇다고, 아마존(AMAZON) 머신러닝 인스턴스를 사용하기에는 내것이 아닌것 같고, 용량이나 기간을 많이 사용할수록 결국 돈 내야 한다는 것이 맘에 들지 않는다.

수많은 구글링과 시행착오 끝에 찾은 NVIDIA 우분투 그래픽 드라이버 베스트 솔류션 테크트리는 다음과 같다.
  1. 우분투 18.04 설치 USB 디스크 준비 
  2. 컴퓨터 부팅 시 F2를 눌어 BIOS 로 진입
  3. 그래픽 가속이나 NVIDIA 관련 메뉴를 찾아 가속기능을 비활성화함
  4. 재부팅
  5. 우분투 18.04 설치: 2번 단계로 인해 내장 그래픽이 동작하고, 설정 화면이 다 보일 만큼 충분한 해상도로 설정 가능할 것임
  6. 재부팅 후 우분투 로긴
  7. 우분투에서 터미널 실행 후 아래 명령 입력
    1. sudo apt-get purge nvidia-* 
    2. 리부팅
    3. sudo apt-get install nvidia-352
    4. 리부팅
  8. 부팅 시 F2 눌러 BIOS 진입
  9. 그래픽 가속이나 NVIDIA 관련 메뉴를 찾아 가속기능을 활성화함
  10. 터미널에서 sudo nvidia-setting 실행해 잘 동작하는 NVIDIA 상태 확인
이 후 우리는 NVIDIA 가속된 아름다운 우분투 화면을 볼 수 있다.^^

이제 수많은 오픈소스 패키지를 apt-get install 할 수 있다.

OpenCV, PCL, ROS Kinectic full desktop version 도 잘된다^^

유명한 Unigine Heaven 를 설치해 GPU 성능 테스트를 해 본다. GPU full option에서 30 fps 이상 찍는다.

ㅎ 이 감동의 순간을 즐기자.

레퍼런스
블랙 스크린은 이 링크를 참고한다.
한글 등 설정은 이 링크를 참고한다.


2018년 5월 7일 월요일

지능적 비전 지원을 위한 Azure 기반 프로젝트 키넥트

키넥트 사용했던 분들 꽤 많았을 겁니다. 이렇게 좋은 센서를 생산 중단한 마이크로소프트가 이해되지 않았던 적이 있었죠. 역시 마소는 우리의 기대를 저버리지 않고 훨씬 좋아진 키넥트 센서를 꾸준히 개발하고 있었습니다.

이 글은 마이크로소프트의 지능적 비전 지원을 위한 Azure 기반 프로젝트 키넥트 기술 소개입니다.


Satya Nadella의 Build 기조 연설에서 Azure 에서 Project Kinect 지원을 소개했습니다. 단순히 키넥트만 지원하는 것이 아니라, Azure와 연계되는 딥러닝 등 다양한 도구와 연결되어, 재미있고 유용한 유스케이스 구현이 가능함을 언급하였습니다.

주변 공간과 사물을 인식할 수 있는 능력을 Kinect와 Azure 연계된 머신러닝 등 도구가 지웜함으로써 지능적인 지각을 가능하게 해 줍니다. Azure AI 서비스와 적은 전력 소모와 높은 정확도로 동작하는 Kinect 의 ToF 깊이 센서 기술은 심도 이미지를 이용한 다양한 비전이 가능해 집니다.

건축가인 Cyrus Bamji는 이 센서를 이용해 ISSCC (International Solid-State Circuits Conference) 컨퍼런스에 활용 사례를 발표하였고 호평을 받았습니다. 이 새로운 키넥트 센서는 HoloLens의 차기 버전을 제공할 센서이기도 합니다. 센서 스펙은 다음과 같습니다.
  • 1024x1024 픽셀
  • 225-950mw 저전력소모
  • 원거리 캡쳐 가능한 넓은 동작범위
  • 햇빛에 덜 민감한 글로벌 셔터 다중 위상 깊이 계산 기술
  • 고주파수 낮은 피크 전류 작동
XBox360 Kinect를 처음 만들었을 때 많은 사람들이 관심을 가졌고, 크리에이티브 개발자들은 게임을 넘어 다양한 분야에 이를 사용했었습니다. 창의적인 작품이 만들어졌습니다. 작년 2세대 키넥트 생산은 중단했지만, 인텔 RealSense 개발에 마이크로소프트는 계속 협력했었습니다.

HoloLens 3세대는 Kinect 깊이 감지 기술을 이용해 더욱 놀라운 결과를 보여줄 계획입니다. 여기에서는 사람과 공간 환경을 이해하고, 시선, 몸짓, 음성으로 입력을 받으며, 3D 홀로그램과 몰입형 공간 사운드를 지원할 것입니다. 4세대는 진보된 키넥트 센서를 사용해 지능형 클라우드 및 인텔리전트에 연결된 서비스를 지원합니다 .

Azure는 이미 머신 러닝, 인지 기술, IoT Edge를 지원하고 있습니다. Azure AI 서비스와 통합되어 점점 더 많은 센서를 기반으로 하는 생태계가 풍성해 질 것입니다. 자세한 내용는 다음 링크를 확인하시길 바랍니다.


점점 더 흥미롭고 재미있는 혼합현실 세상이 펼쳐지는 것 같습니다.^^

2018년 3월 2일 금요일

우분투 운영체계 폴더 구조 및 핵심 명령어

이 글은 우분투 운영체계 폴더 구조 및 명령어를 정리한다.

폴더 구조 
우분투 폴더 구조는 다음과 같다.
우분투 파일 구조(Ask Ubuntu)

우분투는 리눅스 일종으로 리눅스 폴더 파일 시스템표준 FSSTND(Linux File System Standard)을 따른다.

/
루트. 최상위 폴더

/bin
기본적인 명령어가 저장된 폴더.

/boot
리눅스 부트로더(Boot Loader)가 존재하는 폴더. 즉, GRUB 과 같은 부트로더에 관한 파일들(grub.conf 등)이 존재

/dev
시스템 디바이스(device)파일을 저장하고 있는 폴더.

/etc
시스템의 설정파일이 존재하는 폴더.
/etc/sysconfig 시스템 제어판용 설정파일
/etc/passwd 사용자관리 설정파일
/etc/named.conf DNS 설정파일

/etc/mai/
sendmail.cf 나 access 파일등의 sendmail 의 설정파일들이 존재하는 폴더.

/etc/ssh/
SSH 서비스, 즉 sshd 데몬에서 사용하는 각종 설정파일들이 존재하는 폴더.

/etc/skel/
계정사용자 생성시의 초기화파일들이 저장된 폴더(useradd 에서 사용함)

/etc/rc.d/
부팅레벨별 부팅스크립트파일들이 존재하는 폴더.

/etc/rc.d/init.d/
시스템 초기화 파일들의 실제파일들이 존재함. /etc/pam.d/

/etc/xinetd.d/
xinetd 수퍼데몬에 의해 서비스되는 서비스설정파일이 존재함.

/home
사용자의 홈폴더

/lib
커널모듈파일과 라이브러리파일

/media
DVD, CD-ROM, USB 등과 같은 탈부착이 가능한 장치들의 마운트포인트로 사용되는 폴더.

/mnt
/media 폴더와 비슷한 용도로 탈부착이 가능한 장치들에 대하여 일시적인 마운트포인트로 사용하는 폴더.

/proc
가상파일시스템. 현재 메모리에 존재하는 모든 작업들이 파일형태로 존재하는 곳

/root
시스템 최고관리자인 root 사용자의 개인 홈폴더.

/sbin
ifconfig, e2fsck, ethtool, halt 등과 같이 주로 시스템 관리자들이 사용하는 시스템관리자용 명령어를 저장하고 있는 폴더.

/tmp
공용폴더

/usr
시스템이 아닌 일반사용자들이 주로 사용하는 폴더

/usr/bin/
일반 사용자들이 사용가능한 명령어 파일들이 존재하는 폴더.

/usr/X11R6/
X 윈도우 시스템의 루트 폴더

/usr/local/
MySQL, Apache, PHP 등과 같은 어플리케이션들을 소스로 컨파일설치할 때 사용되는 장소

/var
시스템운용중에 생성되었다가 삭제되는 데이터를 일시적으로 저장하기 위한 폴더

/lost+found
연결이 끊어진 inode 들이 숫자파일형태로 존재하는 곳

명령어 
주로 잘 사용하지 않는 명령어지만, 문제가 있었을 때 사용해야하는 명령어를 정리해 본다.
  • ps: 프로세스 리스트
  • df -h: 디스크 마운트 정보 확인
  • alias: 명령어 간소화하기
  • apropos: 관련된 명령어 찾기
  • arch: 컴퓨터 종류 알기
  • arp: 같은 서브넷의 IP 보여주기
  • at: 작업 시간 정하기
  • atd: 계획성 있는 작업 실행하기
  • awk: 특정 패턴 문자 처리하기
  • a2p: 펄 파일로 바꾸기
  • badblocks: 배드 블럭 검사하기
  • bc: 계산기
  • biff: 메일 수신 소리로 확인하기
  • bg: 후면작업; 배경화면 설정
  • bind: 키나 함수 순서 결합하기
  • break: 루프 빠져나가기
  • cal: 달력보기
  • builtin: 내부 명령어 알아보기
  • case: 조건 처리하기
  • cat: 화면상에서 파일 보기
  • cd: 디렉토리 변경하기
  • cfdisk: 디스크 설정하기
  • chattr: 파일 속성 변경하기
  • chfn: 사용자 정보 변경하기
  • chgrp: 파일, 디렉토리가 속했던 그룹 바꾸기
  • chmod: 파일 권한 바꾸기
  • chown: 파일 주인 바꾸기
  • chsh: 지정된 셸 바꾸기
  • cksum: CRC값을 점검한다
  • clear: 화면 청소하기
  • clock: CMOS 시각을 조정하기
  • cmp: 파일 비교하기
  • colcrt: 문자 변환 필터
  • colrm: 열 삭제하기
  • column: 가로 정렬하기
  • comm: 파일 비교 출력하기
  • command: 명령어 알아보기
  • continue: 루프 계속돌기
  • cp: 파일 복사하기
  • cpio: 복사본 만들기
  • crontab: cron을 관리한다
  • csplit: 파일에 서식, 규칙 정하기
  • cut: 필요한 필드만 출력하기
  • date: 날짜 보기
  • dd: 블럭장치 읽고 쓰기
  • debugfs: ext2 파일 시스템 디버깅하기
  • declare: 변수 선언하기
  • df: 파일 시스템의 사용량 보기
  • dirs: 디렉토리 목록 표시하기
  • dmesg: 부팅 메시지 보기
  • : X윈도우 환경에서 printk 메세지를 기본으로 못보는데 dmesg를 통해서 확인할수 있다
  • dnsdomainname: DNS 이름 출력
  • domainname: NIS 이름 출력&설정
  • du: 디렉토리와 파일의 용량 파악하기
  • dumpe2fs: 파일 시스템 정보 보기
  • echo: 표준 출력하기
  • eject: 장치 해제하기
  • elm: 메일 관련
  • enable: 내부 명령어 지정
  • env: 환경변수 출력하기
  • eval: 인수 읽기
  • exec: 셸 명령어 실행하기
  • exit: 종료하기
  • expand: 탭을 공백으로 변환하기
  • export: 변수 지정하기
  • e2fsck: 파일 시스템 복구하기
  • fc: 지정된 편집기 받기
  • fdformat: 플로피 디스크 포맷하기
  • fdisk: 파티션 나누기
  • fg: 지정된 작업을 전면 프로세스로 시작하기
  • file: 파일 종류 보기
  • find: 파일 찾기 eg) find ./ -name ./*
  • finger: 사용자 정보 알기
  • fold: 정형화하기
  • fmt: 정형화하기
  • for: 반복 실행하기
  • free: 메모리 사용량 알아보기
  • fsck: 파일 시스템 검사하기
  • fstab: 파일 시스템에 대한 고정적인 정보 저장하기
  • ftp: 파일 전송 프로그램
  • fuser: 프로세스 ID 출력
  • getkeycodes: 매핑 테이블 출력하기
  • grep: 특정 문자: 열 검색하기
  • gzexe: 실행 파일 압축하기
  • gzip: 압축하기
  • halt: 시스템 종료하기
  • hash: 기억해 두기; index 역할
  • head: 파일의 앞부분 출력하기
  • help: 도움말 보여주기
  • host: 호스트 정보 보기
  • history: 사용 명령어 목록보기
  • hostname: 서버 이름 알기
  • id: 계정 정보 알기
  • if: 조건문 실행하기
  • ifconfig: 랜카드에 주소 할당하기
  • imolamod: 모듈 설치하기
  • inetd: 인터넷 서비스의 최상위 데몬
  • init: 실행 단계 정하기
  • ispell: 철자법 검사하기
  • jobs: 수행중인 프로세스 알기
  • kbd_mode: 키보드 모드 출력하기
  • kill: 프로세스 죽이기  강제종료 : kill -9  PID
  • klogd: 커널 로그 데몬
  • ldd: 공유 라이브러리의 의존성 알기
  • less: 페이지 단위로 출력하기
  • let: 정규식 표현하기
  • lilo: 부팅하기
  • ln: 링크하기
  • locate: 패턴에 맞는 파일 찾기
  • login: 로그인하기
  • logger: 시스템 로그 기록하기
  • logname: 사용자 로그인명 보여주기
  • logout: 로그인 셸 종료하기
  • look: 특정 단어 검색하기
  • losetup: 중복 장치 확인하기
  • lpd: 프린트 데몬
  • lpq: 현재 프린트 작업 상태 출력하기
  • lpr: 출력하기
  • lprm: 대기열에 있는 문서 삭제하기
  • ls: 디렉토리 내용보기
  • lsattr: 파일 시스템의 속성 보여주기
  • lsdev: 하드웨어 장치 출력하기
  • lsmod: 모듈 정보 출력하기 lnsmod: 묘둘 올리기 rmmod : 모듈 내리기
  • mail: 메일 관련
  • make: 컴파일하기
  • man: 매뉴얼 보기
  • mattrib
  • mbadblocks
  • mcd
  • mcopy
  • mdel
  • mdeltree
  • mdir
  • mesg: 메시지를 받을 수 있는지 확인하기
  • mformat
  • minfo
  • mkdir : 디렉토리 만들기
  • mke2fs: 파일 시스템 생성하기
  • mkfs: 파일 시스템 만들기
  • mknod: 특수 파일 만들기
  • mkswap: 스왑 영역 지정하기
  • mlabel
  • mmd
  • mount
  • mmount
  • mmove
  • mpartition
  • mount: 장치 연결하기
  • more: 화면 단위로 출력하기  ls -al | more
  • mrd
  • mren
  • mtoolstest
  • mtype
  • mutt: 메일 관련
  • mv: 파일 옮기기
  • mzip
  • netstat: 현재 네트웍 상황 보기
  • nice: 프로세스 우선 순위 변경하기
  • od: 8진수로 파일 보기
  • passwd: 암호 입력하기
  • pidof: 실행중인 프로그램의 프로세스 ID 찾기
  • pine: 메일 관련
  • ping: 네트웍 확인하기
  • popd: pushd 취소
  • ps: 프로세스 상태 알기 ps -aux
  • pstree: 프로세스 상관관계 알기
  • pwd: 절대경로 보여주기
  • quota: 디스크 한계량 알기
  • rarp: rarp 테이블 관리하기
  • rcp: 원격 호스트에 파일 복사하기
  • rdev: 루트, 스왑장치, 램 크기, 비디오 모드를 조사하고 설정하기
  • rdate: 네트웍으로 시간 설정하기
  • reboot: 재부팅하기
  • readonly: 읽기 전용으로 표시하기
  • renice: 프로세스 우선 순위 바꾸기
  • reset: 터미널 초기화하기
  • restore: 다시 저장하기
  • rlogin: 바로 접속하기
  • rm: 파일 지우기
  • rmdir : 디렉토리 지우기 rm -rf
  • route: 라우팅 테이블 추가/삭제하기
  • rpm: 프로그램 추가/삭제
  • rpm2cpio: rpm을 cpio로 변환하기
  • rsh: 원격으로 명령어 실행하기
  • rup: 호스트 상태 출력하기
  • rusers: 호스트에 로그인한 사용자 출력하기
  • rwall: 호스트 사용자에게 메시지 뿌리기
  • script: 기록하기
  • set: 변수값 설정하기
  • setup: 시스템 관련 설정하기
  • showmount: 호스트의 마운트 정보 보여주기
  • shutdown: 전원 끄기
  • sleep: 잠시 쉬기
  • source: 스크립트 번역하기
  • split: 파일 나누기
  • ssh: 암호화된 원격 로그인하기
  • stty: 터미널라인 설정 보여주기
  • su: 계정 바꾸기
  • suspend: 셸 중단하기
  • swapoff : 스왑 해제하기
  • swapon: 스왑 활성화하기
  • sync: 버퍼 재설정하기
  • syslogd: 로그인 과정 설정하기
  • tac: 거꾸로 보기
  • tail: 문서 끝부분 출력하기
  • talk: 이야기하기
  • tar: 파일 묶기
  • tcpdchk: tcp wrapper 설정하기
  • tcpmatch: 네트웍 요청에 대해 예측하기
  • tee: 표준 입력으로부터 표준 출력 만들기
  • telnet: 원격접속하기
  • test: 테스트하기
  • times: 셸에서의 사용자와 시스템 시간 출력하기
  • top: cpu 프로세스 상황 보여주기
  • tr: 문자열 바꿔주기
  • true: 종료 코드 리턴하기
  • type: 유형 보기
  • ul: 밑줄 처리해서 보여주기
  • ulimit: 제한하기
  • umask: 매스크 모드 설정하기
  • umount: 장치 해제하기
  • unalias: 별명 제거하기
  • uname: 시스템 정보 보기
  • unexpand: 공백 문자를 탭으로 변환하기
  • uniq: 중복된 문장 찾기
  • useradd: 사용자 계정 만들기
  • userdel: 계정 삭제하기
  • usermod: 사용자 계정정보 수정하기
  • unset: 설정 변수 해제
  • uptime: 시스템 부하 평균 보여주기
  • users: 로그인된 사용자 보여주기
  • w: 시스템에 접속한 사용자 상황 알아보기
  • wait: 프로세스 기다리기
  • wall: 모든 사용자에게 메시지 보내기
  • wc: 문자, 단어, 라인수 세기
  • whatis: 명령어의 간단한 설명보기
  • while: 루프 명령어
  • who: 사용자 알기
  • write: 콘솔 상에서 간단한 메시지 보내기
  • xcopy: 반복적으로 복사하기
  • XFree86
  • ypchfn: NIS에서 사용하는 chfn 명령어
  • ypchsh: NIS에서 사용하는 chsh 명령어
  • yppasswd: NIS에서 사용하는 passwd 명령어
  • zcat: 압축 파일 보기
  • zcmp: 압축 파일 비교하기
  • zforce: 강제로 gz 만들기
  • zgrep: 압축 상태에서 grep 실행하기
  • zmore: 압축 상태에서 more 실행하기
  • znew: .Z 파일을 .gz로 다시 압축하기
레퍼런스

우분투 백업 및 스냅샷 만들기 방법 소개

이 글은 우분투 백업 및 스냅샷 만드는 방법을 소개한다.

여기서 백업은 user 폴더 밑에 데이터를 보관하는 것을 말하고, 스냅샷은 시스템 운영체계 데이터까지 모두 보관하는 것을 말한다.

보통 우분투에서 백업은 deja-dup, 스냅샷은  timeshift, Backup in time, rsnapshot와 같은 도구를 사용한다. 사용방법은 어렵지 않은 데, deja-dup는 시스템 운영체계까지는 저장하지 않는다.

사용 방법은 다음 링크를 참고한다.

우분투 블랙 스크린 문제 해결 방법

이 글은 고질적인 우분투 블랙 스크린(black screen) 문제 솔류션 트리를 간략히 요약한다. 이 문제는 우분투 부팅했는 데, 로그인 조차 안되는 검정색 화면만 보여지는 현상이다. 

블랙 스크린 문제는 14.04, 16.04 모두 공통적으로 발생된다. 주 발생 원인은 NVIDIA + Unity + ubuntu 간에 충돌 발생이다. 충돌 발생 원인은 매우 다양하다. 정상적인 apt-get install 설치 후에도 발생할 수 있다. 이번엔 터치패드 패키지 욕심내어 설치하다, 노트북이 또 벽돌 되어 버렸다(Deja-dup 백업도 의미 없다. 다시 솔류션 트리를 수행하고, 아애 그 과정을 영원히 기록해 놓을 요량으로 글을 쓴다). 그냥 운이 없으면 블랙 스크린을 만난다고 보면 될 것이다.
욕심내지 말껄 T.T~

블랙 스크린은 로그인 메시지도 안뜨는 벽돌 상태로 변하기 때문에, 당하면 멘붕 오게 된다. 
정신이 붕괴되는 빌어먹을 블랙 스크린(처음 대면하면 우주에 혼자 미아가 된 듯 너무 막연하고 황당하다)

본인은 두대의 노트북을 이렇게 날려먹고, 수십번의 블랙 스크린과 무한 구글링을 경험했다. 지금은 아래 솔류션 트리로 한 두시간 만에 벽돌 노트북을 살릴 수 있다.

1. 터미널 모드 부팅 및 NVIDIA 드라이버 재설치
부팅 시 grub에서 e 키를 입력해, grub 스크립트의 부팅 옵션에 nomodeset 옵션을 추가한 후 F10입력해 부팅함. 이후, 터미널모드(CTRL+ALT+F1)로 부팅한다. 그리고, nvidia 드라이버를 삭제 후, 재 설치해야 한다.

sudo apt-get purge nvidia-*
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update

NVIDIA GTX 1070일 경우 다음과 같이 해당 버전의 드라이버를 설치한다. 아니면, 본인 GTX 버전에 맞는 드라이버 번호를 확인하고, 설치하라.
sudo apt-get install nvidia-384
(혹은 367, 375)

2. 우분투 데스크탑 재설치
운이 없다면, 블랙 스크린 문제가 계속 발생할 것이다. 
이 경우, 다음과 같이, unity, nvidia, ubuntu-desktop, ubuntu-session을 모두 purge하고, 재부팅 후 다시 설치한다.
sudo apt-get purge unity*
sudo apt-get purge nvidia-*
sudo apt-get install ubuntu-desktop
sudo apt-get install ubuntu-session

혹시, 디펜던시 에러가 발생한다면 해당 버전 패키지를 설치하여 해결한다(링크 참고)

2018년 2월 26일 월요일

이더리움 소스 빌드 및 스마트 계약 개발 소개

이 글은 우분투에서 이더리움 소스코드 빌드 실행 방법과 스마트 계약 개발 방법을 간략히 소개한다.
스마트 계약(Smart Contract)이란 블록체인 기반으로 금융거래, 부동산 계약, 공증 등 다양한 형태의 계약을 체결하고 이행하는 것을 말한다(wikipedia). 스마트 계약은 1996년 닉 자보(Nick Szabo)가 처음 제안했다.

만약, A, B간에 날씨에 따른 스마트 계약을 하였을 때는 계약이 참여자간 분산되어 실행되며, 참여자간 동의 없이 취소될 수 없고, 계약 실행 조건이 변경될 수 없다. 이를 위해, 계약은 프로그램으로 작성되며, 계약과 거래는 분산 저장된다. 다음 영상은 그 개념을 보여준다.
스마트 계약 개념

이더리움은 비탈릭 부테린이 개발한 블록체인 기반 스마트 계약 개발 지원 분산 플랫폼이다. 이더리움 화폐 단위는 이더(ETH)이다. 이더리움은 블록체인 기반 암호 화폐거래 기술을 스마트 계약(smart contract) 플랫폼으로 확장했다. 이런 이유로 전세계에 많은 컨소시엄이 만들어졌고, 블록체인 기반의 계약에 대한 관심을 크게 촉발시켰다. 현재, 스마트 계약과 관련된 많은 어플리케이션이 개발되고 있다.
블록체인 기반 스마트 계약 개념
이더리움 기반 투표 어플리케이션 예(Full Stack Hello World Voting Ethereum)

이더리움에서 스마트 계약을 개발하기 위해서는 솔리디티(solidity)와 LLL(Low-level Lisp-like Language)언어를 사용해야 한다. 이 부분은 차후에 좀 더 다뤄보기로 한다.

PPA(Personal Package Archives) 설치
이더리움 PPA는 다음과 같이 설치한다.
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum

설치 후 노드에 계정을 생성하기 위해 다음 명령을 실행할 수 있다. 
geth account new



이더리움 네트워크에 연결하기 위해 geth 명령을 실행한다. 

소스 코드 다운로드 및 빌드
다음과 같이 소스 코드를 다운르드한다.
git clone https://github.com/ethereum/go-ethereum

이더리움은 가상머신에서 동작하며, Go, C, Python과 같은 다양한 언어로 개발되었다.
작업이 쉬운 Go언어로 개발된 이더리움을 빌드하기 위해 Go, C 컴파일러를 설치한다.
sudo apt-get install -y build-essential golang

golang는 1.7버전 이상이 필요하다. 혹시, 제대로 설치되지 않으면, 링크(1.7)를 참고해 설치한다. 이제 다음과 같이 다운로드된 소스 폴더에서 빌드한다.
cd go-ethereum
make geth

이제 build/bin/geth 폴더에서 다음 명령을 실행할 수 있다.
geth

 

이더리움과 스마트 계약 개발 방식
이더리움은 이더리움 가상 머신(EVM) 기반으로 동작한다. 이 가상머신 기반으로 실제 스마트 계약 모델을 개발하는 방법은 사실 쉽지는 않다. 이런 이유로 솔리디티(solidity)가 개발되었다. 솔리디티 설치는 다음 링크를 참고한다.
솔리디티는 객체지향언어와 유사하다. 계약은 솔리디티 계약이나 이더리움 트랜잭션을 통해 외부에서 만들어 질 수 있다. 다음 그림은 스마트 계약 개발을 위해 사용되는 솔류션 조합의 예를 보여준다.
스마트 계약 개발을 위한 솔류션 조합(Distributing Business Processes using Finite State Machines in the Blockchain)

다음은 간단한 스마트 계약 클래스 정의 예이다.

contract SimpleStorage {
   uint storedData;
   function set(uint x) {
      storedData = x;
   }
   function get() constant returns (uint) {
      return storedData;
   }
}

다음 영상은 날씨에 따른 스마트 계약 개발의 예를 보여준다.

솔리디티 기반 계약 개발의 좀 더 자세한 방법은 아래 링크를 참고한다.
LLL은 리습과 유사한 언어고, 마찬가지로 스마트 계약 모델 개발 시 활용한다. 이 두가지 개발 언어는 작성된 계약 모델이 빌드되면 가상 머신 코드로 전환된다. 참고로, 솔리디티보다 LLL이 생성된 코드는 30% 효율적이다. 다음은 LLL 예시와 관련 튜토리얼 영상이다.

(def 'only-node-owner (node)
  (when (!= (caller) (get-owner node))
    (panic)))


Remix(리믹스)와 같은 도구를 이용해 개발할 수도 있다. 이더리움에서 프로그래밍으로 계약 개발하는 방식은 JavaScript API web3.js 사용 방법이 있다. web3.eth.Contract를 사용한다.

이더리움 스마트 계약에 대한 좀 더 상세한 내용은 아래 링크를 참고한다.

레퍼런스