docker eco system

docker swarm

how to start docker swarm using docker-machine

1
2
3
$ docker-machine start default
$ eval $(docker-machine env default)
$ docker run swarm --help

위와 같이 하면, docker swarm이 실행되는 지를 바로 볼 수 있다.
간단하게 docker swarm이 설치되어 있지 않은 상황에서 자동으로 다운로드를 받는다.

정상적으로 설치가 된다면 아래와 같이 나온다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Usage: swarm [OPTIONS] COMMAND [arg...]
A Docker-native clustering system
Version: 1.2.6 (`git rev-parse --short HEAD`)
Options:
--debug debug mode [$DEBUG]
--log-level, -l "info" Log level (options: debug, info, warn, error, fatal, panic)
--experimental enable experimental features
--help, -h show help
--version, -v print the version
Commands:
create, c Create a cluster
list, l List nodes in a cluster
manage, m Manage a docker cluster
join, j Join a docker cluster
help Shows a list of commands or help for one command
Run 'swarm COMMAND --help' for more information on a command.

docker swarm 간단 소개 및 설치 가이드

docker swarm github]

docker swarm mode overview

Share Comments

how to check time in C++

how to check how much time elapsed in C++

using clock() : time.h in C/C++

using chrono : C++11 이상에서 가능

C/C++에서 clock() 함수 사용하기

chrono 사용하여 C++에서 시간 측정하기

Share Comments

leetcode solution reference

Leetcode

  • leetcode를 개인적으로 풀어보고, 그 내용을 공유하는 github들을 모아봤다. 개인적으로 풀어놓은 것도 있고, 여러 명이 모여서 풀어놓은 공통 github repo도 있다. 각각 repo마다 특이한 점도 있고, 참고할 만한 내용들이 많다.

huklee

이 블로그 주인장의 leetcode solution 모음 github. 혹시라도 이 포스팅은 보는 분들은 열심히 참고하시고 star를 눌러 주도록 하자. 같이 문제를 풀고 풀이를 채워나가실 분들은 환영한다. C++, python

haoel : 3500 star

star도 제일 많지만, 거의 개인 repo이다. table generate은 bash shell script로 짰다.

kamyu104 : 1700 star, 3692 commits, 15 contributers

제일 활동이 활발한 것 같다. 특이하게 genrator 없이 그냥 README 문서를 쭉 작성했다. contributer 가 많아서 그런지 C++, Golang, Java, SQL, Python등 다양한 언어로 된 솔루션들이 존재한다.

illuz : 280 star

개인 repo. python genertor를 인상적으로 사용했다. repository 관리도 잘 되어 있다. 특히 how to leetcode를 잘 정리해놨다. 읽어보면 이래저래 도움이 될 자료들.

MaskRay : 220 star

Googler. 개인 repo이며, 특이하게 root 폴더에 모든 소스를 떄려 박았다.

Share Comments

cmakefile tutorial

Cmake Tutorial

jetbrains) Quick Cmake Tutorial

make와 makefile 기초

Share Comments

things to read

Things to read

data science

data scientist의 생활데이터 이야기

나프다 - 김진영님 이야기

헬로 데이터 과학 : 김진영님 블로그

Relu, Dropout, Batch, epoch in Depp learning

Big data Engineer

Spark를 이용한 빅데이터 다루기 기초 커리큘럼

C++

C++ 미정의 행동 slide- share

C++ undefined behavior example

C++ 에서 switch에서 문자열 사용하기

python

Python generator & iterator

python generator 개념 및 예시

algorithms

plane sweeping : 직사각형 넓이합 구하기

Clean Code by Robert C.Martin

Etc

how to run docker container in Windows

Share Comments

using 2D array in C++

C++ 에서 함수에 매개변수로 2차원 배열을 어떻게 던져주어야 하는 지에 대해서 다뤄보고자 한다. 사용하다보면 사용상 헷갈려서 정리 차원에서 다루어 본다. 크게 pointer 사용법, vector 사용법로 구분이 가능하다.

pointer 배열 방식 사용

정적 배열은 C에서 사용하는 방식과 거의 유사하다. int 배열을 엑세스하기 위해서는 거의 필수적으로 포인터를 넘겨야 한다. 방법은 아래 세 가지 정도가 가장 많이 쓰인다.

  1. 2차원의 고정배열을 사용하는 방법

    • 고정된 배열을 가지고 있다면 가장 편하게 사용할 수 있는 방법이다. 실제 데이터도 정적인 함수 내의 stack만을 사용하는 특징이 있다.
    • 단점 : 다만 컴파일 타임에서 row, col 각 차원의 크기가 고정되어 버린다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    const int CONST_ROW = 3;
    const int CONST_COL = 2;
    void func(int arr[CONST_ROW][CONST_COL]){
    int val = 0;
    for (int i = 0; i < CONST_COL; i++)
    for (int j = 0; j < CONST_COL; j++)
    arr[i][j] = val++;
    }
    int arr[CONST_ROW][CONST_COL];
    func(arr);
  2. 고정배열의 포인터를 활용하는 방법

    • row의 개수를 고정시켜서 활동하는 방법이다. 실제 데이터는 new를 사용하여 매핑시켜야 하므로 heap 메모리에 정적으로 쌓인다. row 한 축에 대해서만 컴파일 타임에서 결정되고, col축 데이터는 런타임에서 크기가 결정된다.
    • 단점 : delete를 사용하여 추가적인 메모리 누수 방지를 고려해야 한다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    const int CONST_ROW = 3;
    void func2(int *arr[CONST_ROW], int num_col){
    int val = 0;
    for (int i = 0; i < CONST_ROW; i++)
    for (int j = 0; j < num_col; j++)
    arr[i][j] = val++;
    }
    int *arr[CONST_ROW];
    for (int i=0; i < CONST_ROW; i++)
    arr[i] = new int(CONST_COL);
    func2(arr, CONST_COL);
  3. 1차원의 배열을 2차원의 배열처럼 활용하는 방법

    • 1차원의 배열을 바로 2차원의 배열처럼 매핑시켜서 활용하는 방법이다. 메모리를 잡을 때는 정적, 동적 양쪽 모두 활용하는 것이 가능하다.
    • 장점 : row, col 양 차원 모두에 대해서 런타임에서 크기를 결정 가능하다.
    • 단점 : 다만 각 데이터에 엑세스할 때 arr[i*num_row + j]와 같은 식으로 사용해야 하는 점에서 직관적이지 못한 단점이 있다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void func3(int *arr, int num_row, int num_col){
    int val = 0;
    for (int i = 0; i < num_row; i++)
    for (int j = 0; j < num_col; j++)
    arr[i*num_row + j] = val++;
    }
    int num_col = 3;
    int num_row = 2;
    int arr_static[CONST_ROW*CONST_COL];
    int *arr_dynamic = new int(num_col*num_row);
    func3(arr_static, CONST_COL);
    func3(arr_dynamic, CONST_COL);

vector 배열 방식 사용

동적 배열을 가장 간단한 방법은 vector를 사용하는 방법이다. vector< vector<type> >과 같은 식으로 사용하면 arr[i][j]와 같은 방법으로 쉽게 엑세스가 가능하다. 마찬가지로 3차원, 4차원 배열에도 같은 방식으로 응용이 가능하다. 정적 배열에서 문제가 있었던 컴파일 타임에서 배열 크기가 결정된다거나 엑세스할 때 비직관적인 방법으로 호출을 한다던가 하는 문제가 전혀 없다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void func(vector<vector<int> > &arr){
// initialization
// 0 1 2
// 3 4 5
int val = 0;
for (int i = 0; i < arr.size(); i++)
for (int j = 0; j < arr[i].size(); j++)
arr[i][j] = val++;
// print values
for (vector<int> vec : arr) {
for (int n : vec)
cout << n << " ";
cout << endl;
}
}
vector<vector<int> > arr(3, vector<int>(2, 0));
func(arr);

vector를 사용한 C++의 이차원 배열 사용

C++에서 정적인 배열로 이차원 배열 구현

Share Comments

github tutorials

Github tutorials

Github에 대해서 입문자로서 대략적인 기능들과 구조에 대해서 쭉 공부를 해 보았다. 간단하게 정리해보자면 대충 아래와 같다. 조금 더 손볼 부분이 있긴 하지만 일단 이 정도로 정리하고 추가하도록 하겠다.

  1. Make a repository
  2. Github Clone
  3. Github Branch
  4. Github Commit & Push
  5. Pull Request
  6. Merge Request

Github Tutorial : 지옥에서 온 Git

  • 수업소개

  • git의 원리

  • Branch

  • git을 이용한 프로젝트의 흐름

The Basics of Git and Github

UML Diagram : Github Startup

지옥에서 온 Git

Share Comments

IoT Solutions at big 4

Google IoT

조대협의 구글 IoT 소개

coursera : 구글 클라우드 플랫폼 강좌

Facebook IoT

Share Comments

Effective C++ Summary - Chap 02

Chap 2. 생성자, 소멸자 및 대입 연산자

항목 5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자.

항목 6. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자.

  • 기본적으로 컴파일러는 class에 대해서 기본적으로 다음 4가지를 생성한다 : constructor, copy constructor, copy assignment operator, destructor
  • 이에 따라 의도되지 않은 undefined behavior의 발생에 주의하자.
  • ex) copy of reference member
  • 컴파일러가 만들어낸 함수가 사용되지 않게 하고 싶은 경우에는 사용되지 않도록 장치를 해두자.

C++ 언어에서 기본적으로 class를 생성할 경우에 아래 네 가지 함수를 정의해준다.

  1. constructor
  2. destructor
  3. copy constructor
  4. copy assignment operator

코드로 보자면

1
2
3
4
class Emtpy(
private:
std::string& str_ref;
);

는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
class Emtpty(){
public:
Empty() {...}
EMpty(const Emtpty& rhs) {...}
~Empty() {...}
Empty &operator=(const Empty& rhs) {...}
private:
std::string& str_ref;
};

위와 같은 경우, 다음과 같은 코드를 사용하면 에러가 발생할 수 있다.

1
2
3
4
5
6
7
std::string s1("hello");
std::string s2("hi");
Empty p1(s1);
Empty p2(s2);
p1 = p2; // error occured

실제로는 아래와 같은 코드가 실행되는 것인데, reference 변수는 초기화는 가능하지만, 중간에 대입는 불가능하기 때문에, 아래와 같은 코드는 컴파일 에러가 발생하게 되는 것이 일반적이다.

1
p1.str_ref = p2.str_ref; // error

위와 같은 발생 가능성 때문에 모든 constructor, destructor, copy assignment operator, copy constructor에 대해서는 정의를 명시적으로 해 주거나, 사용되지 않도록 하는 것이 좋은 방법이다.

사용되지 않도록 하는 방법은 아래와 같다.

private 속성으로 함수를 선언해 놓고, 구현해 놓지 않는다.
이 방법은 컴파일 에러를 통해서 프로그래머의 에러를 사전에 막아주는 효과가 있다.

예를 들면 아래와 같이 해 주는 방식이다.

1
2
3
4
5
6
7
8
9
class Uncopy{
public:
Uncopy() {...};
~Uncopy() {...};
private:
Uncopy(const Uncopy&); // only declaration
Uncopy& operator=(const Uncopy&); // only declaration
};

아래처럼 class 상속을 통해서 해결하는 방법도 있다. 다만 이렇게 하면 다중상속을 고려해야 하는 상황이 생길 수 있으므로, 거기에 따른 복잡성을 고려해도 괜찮은 경우에만 사용하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
class Uncopyable{
public:
Uncopyable() {...};
~Uncopyable() {...};
private:
Uncopyable(const Uncopyable&); // only declaration
Uncopyable& operator=(const Uncopyable&); // only declaration
};
class Uncopy : private Uncopyable{
...
};
Share Comments

2D graphic C++ libraries

C++ Open Source libraries

A list of open source C++ libraries

C++ graphics libraries in 2D

C++ Graphic library : Cairomm
Cairomm : image-surface
Cairomm : tutorial

cImag

CImg 사용법

  • 컴파일 방법

    png를 로드하려면 libpng를 외부에서 가져와 줘야 한다. 그러기 위해서는 libpng를 미리 설치해 주어야 하고, (libzip은 기본으로 깔려 있다고 가정하자) Make에서 아래 구문을 추가해 주어야 한다.

    1
    -Dcimg_use_png -lpng -lz

    그러면 실제로 컴파일 할 떄는 아래와 같이 된다. 그냥 한꺼번에 소스에서 포함시켜서 바로 묶어서 build 하는 법에 대해서는 조금 더 자세히 알아봐야 할 것 같다.

    1
    c++ -o test_simple test_simple.cpp -I.. -Wall -Wextra -Wfatal-errors -std=c++11 -pedantic -Dcimg_use_vt100 -Dcimg_display=1 -I/usr/X11R6/include -lm -L/usr/X11R6/lib -lX11 -lpthread -Dcimg_use_png -lpng -lz
  • 소스코드

Image format source libraries

libpng

png파일을 읽을 수 있는 원본 소스. C로 짜여져 있으며, binary로 받아서 빌드하기에는 그냥 사용하기에는 무척 난해한 편이다.

기본적으로 mac os X 에서 사용하려면 다음 절차를 따라서 설치해주면 된다.

1. using Homebrew

  • open Terminal and run the following script
1
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null
  • and press enter/return key. Wait for the command to finish.
  • Run:
1
$ brew install libpng

2. building source code

먼저 소스코드를 다운로드 받자

1
2
cd /usr/local/src
curl --remote-name --location http://download.sourceforge.net/libpng/libpng-1.6.26.tar.gz

다음과 압축을 풀고 나서

1
2
tar -xzvf libpng-1.6.26.tar.gz
cd libpng-1.6.26

make로 build를 하도록 하자. build할 때는 mac-dev-env/libpng-1.6.26에다가 빌드하도록 하자.

1
2
3
./configure --prefix=/usr/local/mac-dev-env/libpng-1.6.26
make
make install

빌드된 결과를 링크 폴더로 이어붙이자.

1
ln -s mac-dev-env/libpng-1.6.26 /usr/local/libpng

libpng README.txt

libpng manual

install libpng on Mac with Homebrew

install libpng on Mac with source code

example source

A simple libpng example program

How to build a code using libpng library

libmng

mng파일 포맷을 지원하는 library. 그리 유명하진 않은 편.

libjpeg

jpeg을 지원해주는 library
설치 후에 C++에서 컴파일 할 떄 다음과 같이 -ljpeg 옵션을 넣어 주어야 한다.

1
gcc main.c -ljpeg -o main.o

compling libjpeg

when using png file format in cImg

when using jpeg file format in cImg

Make 기반 빌드 시스템 (2): Makefile 기초

Share Comments