KAN - 愛は勝つ

음악감상실 2019/11/28 18:13



作曲:KAN
作詞:KAN
心配ないからね 君の想いが
걱정할거 없어 너의 마음이
誰かにとどく明日がきっとある
누군가에게 전해지는 내일이 분명히 있으니까
どんなに困難でくじけそうでも
너무 힘들어서 좌절할것 같더라도
信じることを決してやめないで
믿는걸 절대 포기하진 말아
Carry on carry out
Carry on carry out
傷つけ傷ついて 愛する切なさに
상처입히고 상처받으며 사랑해가는 아픔에
すこしつかれても Oh… Oh… もう一度夢見よう
조금은 지치더라도 Oh… Oh… 한번만 더 꿈을 꾸자
愛されるよろこびを知っているのなら Oh
사랑받는 기쁨을 알고 있다면 Oh

夜空に流星をみつけるたびに
밤하늘에서 별똥별을 찾아냈을 때마다
願いをたくし ぼくらはやってきた
소원을 빌면서 우리들은 여기까지 왔어
どんなに困難でくじけそうでも
너무 힘들어서 좌절할것 같더라도
信じることさ 必ず最後に愛は勝つ
믿어보는거야 반드시 마지막엔 사랑이 이기는 거니까
Carry on carry out
Carry on carry out
求めてうばわれて 与えてうらぎられ
간구하고 빼앗기고 주었다가 배신당하며
愛は育つもの Oh… Oh… 遠ければ遠いほど
사랑은 커져가는 것 Oh… Oh… 멀리 있으면 멀리 있을수록
勝ちとるよろこびは きっと大きいだろう Oh
손에 넣는 기쁨은 분명 더 커지겠지 Oh

心配ないからね 君の勇気が
걱정할거 없어 너의 용기가
誰かにとどく明日はきっとある
누군가에게 전해지는 내일이 분명히 있으니까
どんなに困難でくじけそうでも
너무 힘들어서 좌절할것 같더라도
信じることさ 必ず最後に愛は勝つ
믿어보는거야 반드시 마지막엔 사랑이 이기는 거니까
信じることさ 必ず最後に愛は勝つ
믿어보는거야 반드시 마지막엔 사랑이 이기는 거니까
2019/11/28 18:13 2019/11/28 18:13

Comment on this post!


* 다음 웹페이지를 보고 따라해보면서 마지막까지 트러블 없이 완료. 나에게 맞게 명령을 수정하면서 수행했던 내용을 기록하는 의미에서 포스팅한다.
How to setup Taiga project management platform on Raspberry Pi 3 with Raspbian Stretch Lite
https://www.techcoil.com/blog/how-to-setup-taiga-project-management-platform-on-raspberry-pi-3-with-raspbian-stretch-lite/


[기본설정 준비]
* 필요패키지 설치
$ sudo apt-get install build-essential binutils-doc autoconf flex bison libjpeg-dev libfreetype6-dev zlib1g-dev libzmq3-dev libgdbm-dev libncurses5-dev automake libtool libffi-dev curl git tmux gettext rabbitmq-server redis-server nginx supervisor postgresql postgresql-contrib postgresql-doc postgresql-server-dev-9.6 python-dev libxml2-dev libxslt-dev libssl-dev libffi-dev libopenjp2-7-dev virtualenv


* 시스템유저 taiga 작성 후 로그인
$ sudo adduser taiga
$ sudo adduser taiga sudo
$ sudo su taiga
$ cd ~


* PostgreSQL 설정을 위한 리눅스 로케일 확인
$ locale -a


* PostgreSQL 유저및 DB생성
$ sudo -u postgres createuser taiga
$ sudo -u postgres createdb taiga -O taiga --encoding='utf-8' --locale=en_GB.utf8 --template=template0


* RabbitMQ 유저및 가상호스트 생성
$ sudo rabbitmqctl add_user taiga PASSWORD_FOR_EVENTS
$ sudo rabbitmqctl add_vhost taiga
$ sudo rabbitmqctl set_permissions -p taiga taiga ".*" ".*" ".*"


* 로그폴더 생성
$ mkdir -p ~/logs


[타이가 백엔드 셋업]

* 타이가 최신 백엔드 다운로드
$ cd ~
$ git clone https://github.com/taigaio/taiga-back.git taiga-back
$ cd taiga-back
$ git checkout stable


* 타이가 백엔드에서 사용할 Python3 용 가상환경 생성
$ cd ~
$ virtualenv -p python3 taiga-back_env


* Python3용 타이가 백엔드 의존 패키지 설치
$ cd ~
$ source taiga-back_env/bin/activate
$ cd taiga-back
$ pip install -r requirements.txt


* 디렉토리는 이동하지 말고 동일 디렉토리에서 백엔드 데이터베이스 초기화
$ python manage.py migrate --noinput
$ python manage.py loaddata initial_user
$ python manage.py loaddata initial_project_templates
$ python manage.py compilemessages
$ python manage.py collectstatic --noinput

이 조작으로 admin/123123 이라는 계정이 생성된다


* 초기설정파일 작성. 예를 들어 라즈베리파이의 IP는 192.168.0.25라 한다.
$ sudo nano ~/taiga-back/settings/local.py

from .common import *
 
MEDIA_URL = "http://192.168.0.25/media/"
STATIC_URL = "http://192.168.0.25/static/"
SITES["front"]["scheme"] = "http"
SITES["front"]["domain"] = "192.168.0.25"
 
SECRET_KEY = "theveryultratopsecretkey"
 
DEBUG = False
PUBLIC_REGISTER_ENABLED = False
 
DEFAULT_FROM_EMAIL = "no-reply@192.168.0.25"
SERVER_EMAIL = DEFAULT_FROM_EMAIL
 
#CELERY_ENABLED = True
 
EVENTS_PUSH_BACKEND = "taiga.events.backends.rabbitmq.EventsPushBackend"
EVENTS_PUSH_BACKEND_OPTIONS = {"url": "amqp://taiga:PASSWORD_FOR_EVENTS@localhost:5672/taiga"}
 
# Uncomment and populate with proper connection parameters
# for enable email sending. EMAIL_HOST_USER should end by @domain.tld
#EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
#EMAIL_USE_TLS = False
#EMAIL_HOST = "localhost"
#EMAIL_HOST_USER = ""
#EMAIL_HOST_PASSWORD = ""
#EMAIL_PORT = 25
 
# Uncomment and populate with proper connection parameters
# for enable github login/singin.
#GITHUB_API_CLIENT_ID = "yourgithubclientid"
#GITHUB_API_CLIENT_SECRET = "yourgithubclientsecret"


* 백엔드 인스톨 검증
$ source ~/taiga-back_env/bin/activate
$ python ~/taiga-back/manage.py runserver

그러면 taiga 계정에서 서버가 시작되므로 putty등으로 추가적인 SSH 세션을 열어서 파이에 접속한다
$ ssh pi@192.168.0.25

그 후 추가 SSH 세션에서 다음 명령으로 서버가 응답하는지 확인한다. http://localhost:8000/api/v1/으로 시작하는 JSON 리스트를 받으면 성공이다.
$ curl -0 http://localhost:8000/api/v1/

서버응답을 확인했으면 SSH 세션을 닫고 컨트롤+C로 타이가 백엔드를 중지시킨다.


[타이가 프론트엔드 셋업]

* 타이가 프론트엔드 다운로드
$ cd ~
$ git clone https://github.com/taigaio/taiga-front-dist.git taiga-front-dist
$ cd taiga-front-dist
$ git checkout stable

설정파일을 작성한뒤 다음과 같이 수정한다.
$ cp ~/taiga-front-dist/dist/conf.example.json ~/taiga-front-dist/dist/conf.json
$ sudo nano ~/taiga-front-dist/dist/conf.json

{
    "api": "http://192.168.0.25/api/v1/",
    "eventsUrl": "ws://192.168.0.25/events",
    "eventsMaxMissedHeartbeats": 5,
    "eventsHeartbeatIntervalTime": 60000,
    "eventsReconnectTryInterval": 10000,
    "debug": true,
    "debugInfo": false,
    "defaultLanguage": "en",
    "themes": ["taiga"],
    "defaultTheme": "taiga",
    "publicRegisterEnabled": false,
    "feedbackEnabled": true,
    "supportUrl": "https://tree.taiga.io/support",
    "privacyPolicyUrl": null,
    "termsOfServiceUrl": null,
    "maxUploadFileSize": null,
    "contribPlugins": [],
    "tribeHost": null,
    "importers": [],
    "gravatar": true
    "rtlLanguages": ["fa"]
}



[타이가 이벤트 세팅]
Taiga-events는 웹소켓 서버로, 타이가 프론트엔드가 백로그, 태스크보드, 칸반, 이슈리스팅의 변경을 리얼타임으로 보여줄 수 있게 한다. 이 서버는 RabbitMQ를 메시지 브로커로 이용한다.

* 타이가 이벤트 다운로드
$ cd ~
$ git clone https://github.com/taigaio/taiga-events.git taiga-events
$ cd taiga-events


* nodejs 인스톨
$ curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
$ sudo apt-get install -y nodejs


* npm이 같이 안깔릴 경우
$ sudo apt-get install npm
$ sudo npm install -g npm@latest


* 자바스크립트 의존모듈 인스톨
$ npm install
$ sudo npm install -g coffee-script


* 타이가 이벤트 환경설정파일 작성
$ cp config.example.json config.json
$ sudo nano config.json

{
    "url": "amqp://taiga:PASSWORD_FOR_EVENTS@localhost:5672/taiga",
    "secret": "theveryultratopsecretkey",
    "webSocketServer": {
        "port": 8888
    }
}


"secret"의 키 내용은 ~/taiga-back/settings/local.py 에 작성한 "SECRET_KEY"와 동일해야 한다.


[슈퍼바이저에게 타이가 백엔드와 타이가 이벤트를 실행하도록 설정]
Supervisor라는 프로세스 컨트롤 시스템이 타이가 백엔드와 타이가 이벤트를 계속 실행하도록 설정한다.

* 슈퍼바이저가 타이가 백엔드를 실행하도록 구성
다음과 같은 내용의 배시파일을 작성한다.
$ nano ~/run_taiga_backend.sh

#!/bin/bash
 
source taiga-back_env/bin/activate
gunicorn -w 3 -t 60 --pythonpath=./taiga-back -b 127.0.0.1:8001 taiga-back.taiga.wsgi
deactivate


유저 taiga가 실행할 수 있도록 퍼미션 변경
$ sudo chmod u+x ~/run_taiga_backend.sh

다음과 같은 내용의 슈퍼바이저 환경설정파일을 작성.
$ sudo nano /etc/supervisor/conf.d/taiga-back.conf

[program:taiga-back]
directory=/home/taiga
command=/bin/bash -E -c ./run_taiga_backend.sh
autostart=true
autorestart=true
stopsignal=INT
stopasgroup=true
killasgroup=true
stdout_logfile=/home/taiga/logs/taiga-back.stdout.log
stderr_logfile=/home/taiga/logs/taiga-back.stderr.log
user=taiga


* 슈퍼바이저가 타이가이벤트를 실행하도록 설정
다음과 같은 내용의 설정파일을 작성한다.
$ sudo nano /etc/supervisor/conf.d/taiga-events.conf

[program:taiga-events]
directory=/home/taiga/taiga-events
command=/usr/bin/coffee index.coffee          
autostart=true
autorestart=true
stopsignal=INT
stopasgroup=true
killasgroup=true
stdout_logfile=/home/taiga/logs/taiga-events.stdout.log
stderr_logfile=/home/taiga/logs/taiga-events.stderr.log
user=taiga


* 슈퍼바이저를 재시작
sudo systemctl restart supervisor.service


[Nginx가 타이가 프론트엔드, 백엔드, 이벤트를 관할하도록 설정]

다음과 같은 내용의 Nginx 가상호스트 설정파일을 작성
$ sudo nano /etc/nginx/sites-available/taiga.conf

server {
    listen 80 default_server;
    server_name _;
 
    large_client_header_buffers 4 32k;
    client_max_body_size 50M;
    charset utf-8;
 
    access_log /home/taiga/logs/nginx.access.log;
    error_log /home/taiga/logs/nginx.error.log;
 
    # Frontend
    location / {
        root /home/taiga/taiga-front-dist/dist/;
        try_files $uri $uri/ /index.html;
    }
 
    # Backend
    location /api {
        include proxy_params;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://127.0.0.1:8001/api;
        proxy_redirect off;
    }
 
    # Django admin access (/admin/)
    location /admin {
        include proxy_params;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://127.0.0.1:8001$request_uri;
        proxy_redirect off;
    }
 
    # Static files
    location /static {
        alias /home/taiga/taiga-back/static;
    }
 
    # Media files
    location /media {
        alias /home/taiga/taiga-back/media;
    }
 
    # Taiga-events
    location /events {
        proxy_pass http://127.0.0.1:8888/events;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_connect_timeout 7d;
        proxy_send_timeout 7d;
        proxy_read_timeout 7d;
    }
}



* sites-enabled 디렉토리에 가상호스트 설정파일의 심볼릭링크를 생성한다
$ sudo ln -s /etc/nginx/sites-available/taiga.conf /etc/nginx/sites-enabled/taiga.conf

* Nginx 서버 재시작
$ sudo systemctl restart nginx.service


[타이가를 외부에서 접속하기]
현재 상태에서 타이가는 192.168.0.25 IP로 내부내트워크에서 밖에 접속할 수 없다. yourdomain.com 이라는 도메인을 구입해서 사용하고 있고 taiga.yourdomain.com 이라는 주소로 타이가를 연결해서 사용해 보기로 한다.

* 타이가의 Nginx용 설정파일을 가상호스트용으로 바꾸고 다음과 같이 내용을 수정한다.
$ sudo mv /etc/nginx/sites-available/taiga.conf /etc/nginx/sites-available/taiga.yourdomain.com.conf

server {
    listen 80;
    server_name taiga.yourdomain.com;
 
    large_client_header_buffers 4 32k;
    client_max_body_size 50M;
    charset utf-8;
 
    access_log /home/taiga/logs/nginx.access.log;
    error_log /home/taiga/logs/nginx.error.log;
 
    # For ACME challenge
    location ~ /.well-known {
        root /home/taiga;
        allow all;
    }
 
    # Frontend
    location / {
        root /home/taiga/taiga-front-dist/dist/;
        try_files $uri $uri/ /index.html;
    }
 
    # Backend
    location /api {
        include proxy_params;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://127.0.0.1:8001/api;
        proxy_redirect off;
    }
 
    # Django admin access (/admin/)
    location /admin {
        include proxy_params;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://127.0.0.1:8001$request_uri;
        proxy_redirect off;
    }
 
    # Static files
    location /static {
        alias /home/taiga/taiga-back/static;
    }
 
    # Media files
    location /media {
        alias /home/taiga/taiga-back/media;
    }
 
    # Taiga-events
    location /events {
        proxy_pass http://127.0.0.1:8888/events;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_connect_timeout 7d;
        proxy_send_timeout 7d;
        proxy_read_timeout 7d;
    }
}



* 기존의 심볼릭링크를 삭제하고 새로운 파일에 대한 심볼릭링크를 작성한다
$ sudo rm /etc/nginx/sites-enabled/taiga.conf
$ sudo ln -s /etc/nginx/sites-available/taiga.yourdomain.com.conf /etc/nginx/sites-enabled/taiga.yourdomain.com.conf


* Nginx 서버를 재시작하면 이제 타이가는 http://taiga.yourdomain.com으로 접속할 수 있고, SSL 인증에 대한 ACME challenge를 통과할 수 있게 된다.
$ sudo systemctl restart nginx.service


[Lets's Encrypt의 인증서를 이용하여 HTTPS 프로토콜로 변경]
* SSL 인증서를 취득
$ sudo apt-get install letsencrypt
$ sudo certbot certonly --webroot --webroot-path=/home/taiga
-d taiga.yourdomain.com


* Diffie-Hellman group 생성
Nginx가 클라이언트와 암호화키를 주고받을 수 있도록 Diffie-Hellman group을 생성
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048


* Nginx 설정파일을 다음과 같이 변경한다
$ sudo nano /etc/nginx/sites-enabled/taiga.yourdomain.com.conf

server {
    listen 80;
    server_name  taiga.yourdomain.com;
    return 301 https://$host$request_uri;
}
   
# For ssl
server {
    ssl on;
    ssl_certificate /etc/letsencrypt/live/taiga.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/taiga.yourdomain.com/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_stapling on;
    ssl_stapling_verify on;
    add_header Strict-Transport-Security max-age=15768000;
       
    default_type  application/octet-stream;
       
    listen 443;
    server_name  taiga.yourdomain.com;
   
    access_log /home/taiga/logs/nginx.access.log;
    error_log /home/taiga/logs/nginx.error.log;
 
    # For ACME challenge
    location ~ /.well-known {
        root /home/taiga;
        allow all;
    }
 
    # Frontend
    location / {
        root /home/taiga/taiga-front-dist/dist/;
        try_files $uri $uri/ /index.html;
    }
 
    # Backend
    location /api {
        include proxy_params;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://127.0.0.1:8001/api;
        proxy_redirect off;
    }
 
    # Django admin access (/admin/)
    location /admin {
        include proxy_params;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://127.0.0.1:8001$request_uri;
        proxy_redirect off;
    }
 
    # Static files
    location /static {
        alias /home/taiga/taiga-back/static;
    }
 
    # Media files
    location /media {
        alias /home/taiga/taiga-back/media;
    }
 
    # Taiga-events
    location /events {
        proxy_pass http://127.0.0.1:8888/events;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_connect_timeout 7d;
        proxy_send_timeout 7d;
        proxy_read_timeout 7d;
    }
}



* Nginx를 재시작한다
$ sudo systemctl restart nginx.service


[새로운 URL 세팅에 대해 타이가 프론트엔드와 백엔드의 설정변경]

* 백엔드의 설정을 다음과 같이 변경한다
$ sudo nano ~/taiga-back/settings/local.py

from .common import *
 
MEDIA_URL = "https://taiga.yourdomain.com/media/"
STATIC_URL = "https://taiga.yourdomain.com/static/"
SITES["front"]["scheme"] = "https"
SITES["front"]["domain"] = "taiga.yourdomain.com"
  
SECRET_KEY = "theveryultratopsecretkey"
  
DEBUG = False
PUBLIC_REGISTER_ENABLED = False
  
DEFAULT_FROM_EMAIL = "no-reply@example.com"
SERVER_EMAIL = DEFAULT_FROM_EMAIL
  
#CELERY_ENABLED = True
  
EVENTS_PUSH_BACKEND = "taiga.events.backends.rabbitmq.EventsPushBackend"
EVENTS_PUSH_BACKEND_OPTIONS = {"url": "amqp://taiga:PASSWORD_FOR_EVENTS@localhost:5672/taiga"}
  
# Uncomment and populate with proper connection parameters
# for enable email sending. EMAIL_HOST_USER should end by @domain.tld
#EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
#EMAIL_USE_TLS = False
#EMAIL_HOST = "localhost"
#EMAIL_HOST_USER = ""
#EMAIL_HOST_PASSWORD = ""
#EMAIL_PORT = 25
  
# Uncomment and populate with proper connection parameters
# for enable github login/singin.
#GITHUB_API_CLIENT_ID = "yourgithubclientid"
#GITHUB_API_CLIENT_SECRET = "yourgithubclientsecret"



* 프론트엔드의 설정을 다음과 같이 변경한다
$ sudo nano ~/taiga-front-dist/dist/conf.json

{
    "api": "https://taiga.yourdomain.com/api/v1/",
    "eventsUrl": "wss://taiga.yourdomain.com/events",
    "eventsMaxMissedHeartbeats": 5,
    "eventsHeartbeatIntervalTime": 60000,
    "eventsReconnectTryInterval": 10000,
    "debug": true,
    "debugInfo": false,
    "defaultLanguage": "en",
    "themes": ["taiga"],
    "defaultTheme": "taiga",
    "publicRegisterEnabled": false,
    "feedbackEnabled": true,
    "supportUrl": "https://tree.taiga.io/support",
    "privacyPolicyUrl": null,
    "termsOfServiceUrl": null,
    "maxUploadFileSize": null,
    "contribPlugins": [],
    "tribeHost": null,
    "importers": [],
    "gravatar": true
}



* 슈퍼바이저를 재시작하면 https로 접속되는것을 확인할 수 있다.
$ sudo systemctl restart supervisor.service


[타이가에서 email 통지를 보낼수 있도록 설정]

* Postfix를 설치한다
$ sudo apt-get install -y postfix


* Postfix 설치시 팝업에 대해서는 다음과 같이 입력한다
Genaral type of mail configuration: Internet Site
System mail name: taiga.yourdomain.com


* 타이가 백엔드 설정을 다음과 같이 변경한다
$ sudo nano ~/taiga-back/settings/local.py

from .common import *
 
MEDIA_URL = "https://taiga.yourdomain.com/media/"
STATIC_URL = "https://taiga.yourdomain.com/static/"
SITES["front"]["scheme"] = "https"
SITES["front"]["domain"] = "taiga.yourdomain.com"
  
SECRET_KEY = "theveryultratopsecretkey"
  
DEBUG = False
PUBLIC_REGISTER_ENABLED = False
  
DEFAULT_FROM_EMAIL = "no-reply@taiga.yourdomain.com"
SERVER_EMAIL = DEFAULT_FROM_EMAIL
  
#CELERY_ENABLED = True
  
EVENTS_PUSH_BACKEND = "taiga.events.backends.rabbitmq.EventsPushBackend"
EVENTS_PUSH_BACKEND_OPTIONS = {"url": "amqp://taiga:PASSWORD_FOR_EVENTS@localhost:5672/taiga"}
  
# Uncomment and populate with proper connection parameters
# for enable email sending. EMAIL_HOST_USER should end by @domain.tld
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_USE_TLS = False
EMAIL_HOST = "localhost"
EMAIL_HOST_USER = ""
EMAIL_HOST_PASSWORD = ""
EMAIL_PORT = 25
  
# Uncomment and populate with proper connection parameters
# for enable github login/singin.
#GITHUB_API_CLIENT_ID = "yourgithubclientid"



* 슈퍼바이저를 재시작한다
$ sudo systemctl restart supervisor.service


[업데이트]
https://taigaio.github.io/taiga-doc/dist/upgrades.html
2019/11/20 09:21 2019/11/20 09:21

Comment on this post!


★: 읽을가치 있음
★★: 소장가치 있음


[응용소프트웨어 개론]

컴퓨팅 사고 :소프트웨어를 통한 문제해결 / Riley, David D / 고양 :Infinitybooks,2017.

개발자가 되고 싶으세요? =Developer :IT 입문 지식을 말하다 / 고종범 / 서울 :로드북,2015.

프로그래밍이 보이는 그림책 / ANK / 서울 :성안당,2017.

프로그래머가 알아야 할 1%의 핵심원리 | 조민호, 이명섭 지음 | 성안당 | 2009 |

프로그래밍 가이드북 :프로그래머가 되기 전에 꼭 읽어야 할 필독서 / 쇼다, 쓰야노 / 서울 :정보문화사,2016.

★★프로그래밍 언어도감 :가장 인기있는 프로그래밍 언어 67개 수록, 마스이, 도시카츠, 서울 :영진닷컴,2018



[하드웨어, 운영체제]

컴퓨터 사이언스 =Computer science / 이동명 / 서울 :한빛아카데미,2014.

★★(머신러닝과 블록체인을 떠받치는) GPU의 모든 기술 / Ando, Hisa / 인천 :남가람북스,2018.

★성공과 실패를 결정하는 1%의 Windows 구조와 원리 =How Windows works / 아마노, 스카사 / 서울 :성안당.com,2003.

OS가 보이는 그림책 :국내 최초 그림으로 배우는 OS 입문서, ANK, 파주 :성안당,2012



[자료구조, 알고리즘]

(그림으로 배우는) 알고리즘 =Algorithm :basic / 스기우라, 겐 / 서울 :영진닷컴,2016.

★★(C로 배우는) 쉬운 자료구조 / 이지영 / 서울 :한빛아카데미,2016.



[C]

★★(熱血講義) C 프로그래밍 / 윤성우 / 부천 :프리렉,2003.(2006 1판4쇄).

(실용적 사례 570 제로 풀어보는) 알고리즘과 함께하는 C의 아름다움 / 김정훈 / 서울 :사이텍미디어,2003.

(김태용의)C 언어 프로그래밍 입문 =Beginning C programming / 김태용 / 파주 :제이펍,2012.

★★C를 배우기 전에 반드시 알아야 할 것들 / 무라야마, 유키오 / 부천 :루비페이퍼,2015.

★★C언어 코딩 도장 / 남재윤 / 서울 :길벗,2016.

(쉽게 배우는) C 프로그래밍 테크닉 :gcc 컴파일러 기반 / 사까이,히로아끼 / 서울 :정보문화사,2004.

C포인터의 이해와 활용 / Reese, Richard / 파주 :제이펍,2013.

C가 보이는 그림책 =C programming / ANK Co., Ltd / 서울 :성안당.com,2003.



[C++]

★★(Programming)C++가 보이는 그림책 :국내 최초 C++프로그래밍 그림 입문서 / ANK Co., Ltd / 파주 :성안당,2006.

윤성우의 열혈 C++ 프로그래밍, 윤성우, 서울 :오렌지미디어,2010.

★★이것이 C++이다 :강의 현장을 그대로 옮긴 C++ 입문서, 최호성, 서울 :한빛미디어,2016.

(Thinking about) C/C++ :프로그래머가 몰랐던 프로그램의 동작 원리 :프로그램 실행 환경편 / 박수현 / 서울 :한빛미디어,2014.

(Thinking about) C/C++ :프로그래머가 몰랐던 프로그램의 동작 원리 :프로그램 개발편, 박수현, 서울 :한빛미디어,2014

(Thinking about) C/C++ :프로그램 생성편 박수현, 서울 :한빛미디어,2014.



[Python]

코딩 부트캠프 with 파이썬 / 유모토, 미치타카 / 서울 :길벗,2017.

점프 투 파이썬 / 박응용 / 서울 :이지스퍼블리싱,2016.

★(비전공자가 궁금해하는) 프로그래머 첫걸음 / Althoff, Cory / 서울 :한빛미디어,2018.

(처음 만나는) 파이썬 / 가마다, 마사히로 / 파주 :제이펍,2017.

★★개발자를 위한 파이썬 :현장에서 일하는 개발자 맞춤 입문서 / 윤웅식 / 서울 :한빛미디어,2017.

파이썬을 여행하는 히치하이커를 위한 안내서 :모범 사례와 실용 라이브러리로 더 파이썬답게! / Reitz, Kenneth / 서울 :인사이트,2017.

★(깐깐하게 배우는) 파이썬 / Shaw, Zed A / 서울 :인사이트,2014.

파이썬 핵심 레퍼런스 :빠르게 찾아서 바로 적용하는 실무 가이드 / Lutz, Mark / 서울 :인사이트,2016.

★★파이썬 라이브러리 레시피 :표준 라이브러리부터 서드파티 패키지까지 / 이케우치, 다카히로 / 부천 :프리렉,2016.

★★엔지니어를 위한 파이썬 : 개발 기초, 필수 라이브러리, 그리고 고속화 | 나카쿠키 켄지 지음;심효섭 옮김 | 제이펍 | 2017 |

★★파이썬 코딩 도장 / 남재윤 / 서울 :길벗,2018



[Swift]

★(Do it!) 스위프트로 아이폰 앱 만들기 :입문, 이범근, 서울 :이지스퍼블리싱,2017

★★(The 친절한) Swift v4.0 프로그래밍 :zero, 정재곤, 서울 :책장,2018

★★스위프트 프로그래밍 :Swift 4 :객체지향, 함수형, 프로토콜 지향 패러다임까지 한 번에!, 야곰, 서울 :한빛미디어,2017.

★이것이 iOS다 :Swift로 시작하는 iOS 10 앱 개발 입문, 송종근, 서울 :한빛미디어,2016

★(스위프트로 시작하는) 아이폰 앱 개발 교과서 / 모리, 요시나오 / 파주 :위키북스,2016

(예제가 가득한) iOS 프로그래밍 :iOS SDK 7.X, 8.X / Xcode 6.X / 김은철 / 서울 :정보문화사,2015

★★(꼼꼼한 재은씨의) Swift :문법편 / 이재은 / 부천 :루비페이퍼,2017



[Kotlin]

(핵심 문법과 예제로 배우는) 코틀린 / 이난주 / 서울 :로드북,2017

★(오준석의) 안드로이드 생존코딩 :코틀린 편 / 오준석 / 서울 :한빛미디어,2018

안드로이드 with Kotlin 앱 프로그래밍 가이드 | 안귀정 지음 | 아이콕스 | 2019 |

(자바 개발자를 위한) KOTLIN / 박중수 / 서울 :DIGITAL BOOKS,2017

(핵심만 골라 배우는) 코틀린 프로그래밍 =Kotlin programming / 심재철 / 파주 :제이펍,2018



[코드작성 방법론]

프로그래머가 알아야 할 97가지 / Henney, Kevlin / 고양 :지앤선,2012.

★클린 코더 :단순 기술자에서 진정한 소프트웨어 장인이 되기까지 / Martin, Robert C / 서울 :에이콘,2016.

읽기 좋은 코드가 좋은 코드다 / Boswell, Dustin / 서울 :한빛미디어,2012.

★★좋은 코딩 나쁜 코딩 =Good coding bad coding :읽기 쉬운 코드가 좋은 코드다 / 박진수 / 서울 :한빛미디어,2004.

훌륭한 프로그래머 되는 법 :프로젝트와 팀을 성공으로 이끄는 선배 개발자의 노하우 / Goodliffe, Pete / 서울 :한빛미디어,2015.

(다시 시작하는) 프로그래밍 / Foote, Steven / 서울 :인사이트,2015.

★★(더 나은 코딩을 위한,) 코딩을 지탱하는 기술 :원리로 깨우치는 프로그래밍 기법 / 니시오, 히로카즈 / 서울 :비제이퍼블릭,2013.

좋은 코드를 작성하는 기술 :읽기 쉽고 유지보수가 쉬운 프로그래밍 작성법 / 아가타,도시타카 / 파주 :제이펍,2011.

★유지보수하기 어렵게 코딩하는 방법: 평생 개발자로 먹고 살 수 있다, 로에디 그린, 한빛출판사, 2012

성공하는 프로그래밍 공부법, 박재성, 파주 :로드북,2018.



[객체지향 일반]

객체지향의 사실과 오해 :역할, 책임, 협력 관점에서 본 객체지향 =The essence of object-orientation : roles, responsibilities, and collaborations / 조영호 / 파주 :위키북스,2015.

★성공과 실패를 결정하는 1%의 객체 지향 원리 =How objects work / 아끼라,히라사와 / 고양 :성안당,2005.

(전병선의)객체지향 이야기 / 전병선 / 서울 :와우북스,2008.



[버전관리]

★★(만들면서 배우는) Git GitHub 입문 | 윤웅식 지음 | 한빛미디어 | 2015 |

프로 Git :그림으로 이해하는 Git의 작동 원리와 사용법 / Chacon, Scott / 서울 :인사이트,2016



[게임 일반]

게이미피케이션 :웹과 모바일 앱에 게임 기법 불어넣기 / Zichermann, Gabe / 서울 :한빛미디어,2012.

그래도 우리는 게임을 만든다 :게임 업계 입문을 꿈꾸는 젊은이들의 필독서! / 유영욱 / 서울 :보리별,2010.

게임회사 이야기 :게임보다 더 재미있는, 게임 만드는 이야기 / 이수인 / 의왕 :에이콘출판주식회사,2005.

(게임 만드는 사람들의) 리얼 수다 :개발 경력 도합 150년, 게임 개발자 17인을 만나다 / 박민영 / 서울 :한빛미디어,2014.

세계 최고의 게임 크리에이터 9인의 이야기 | 김정남 ; 김정현 공저 | 대림 | 2006 |

게임왕국 일본을 건설한 거인들 | 타키타 세이이치로 저 ; 김상호 역 | 게임문화 | 2001 |

그래도 우리는 스마트폰게임을 만든다 | 유영욱 지음 | 보리별 | 2012 |

게임 크리에이터가 알아야 할 97가지:크리에이티브한 게임 만들기 | 요시오카 나오토 엮음;정대영 옮김 | 지앤선 | 2014 |

초패미컴 :게임은 아직도 패미컴을 뛰어넘지 못했다!! | 저자: 타네 키요시,야마모토 신이치 | 에이케이 커뮤니케이션즈 | 2014 |

왜 게임에 빠질까 :사람을 유혹하는 게임의 심리학 / 와타나베, 슈우지 / 서울 :길벗,2014.

위대한 게임의 탄생. 3 / 좋은 게임을 넘어 위대한 게임으로 | 박일 | 지앤선 | 2013 |

위대한 게임 위대한 기획자 | 박찬일,최기운 [공]지음 | 한빛미디어 | 2014 |

라프 코스터의 재미이론, Koster, Raph, 서울 :길벗,2017.

게임 프로그래머로 산다는 것 | 김성완 [외]지음 | 로드북 | 2016 |



[게임 디자인]

★★(조립×분해)게임 디자인 : 룰을 통해 익히는 게임 디자인 | 와타나베 쿠니아키 지음;야마이 그림 | 비즈앤비즈 | 2016 |

★터치스크린 모바일 게임 디자인:아이디어 구상부터 스토리텔링, 마케팅까지 | 스콧 로저스 지음;권혜정 옮김 | 에이콘출판 | 2014 |



[게임 개발]

(마인크래프트로 배우는) 파이썬 프로그래밍 / Richardson, Craig / 파주 :제이펍,2016.

★나만의 Python game 만들기 / Sweigart, Al / 서울 :정보문화사,2014.

★Python과 Pygame으로 게임 만들기 / Sweigart, Al / 서울 :정보문화사,2014.

★스위프트로 배우는 맨 처음 아이폰 앱 코딩 | 글로리아 윈퀴스트;매트 매카시 [공]지음 | 동아엠앤비 | 2018 |

★스위프트로 만드는 게임 개발 :스위프트를 활용한 게임 개발부터 출시까지 / Haney, Stephen / 서울 :에이콘,2017

★(Unity)왕초보 따라하여 게임 만들기 / 박중수 / 서울 :무지개터,2012.

유니티 5로 만드는 3D/2D 스마트폰 게임 개발 / 요시야, 미키토 / 파주 :제이펍,2016



[마이크로 컨트롤러]

아두이노 101 :아두이노 입문자에게 필요한 모든 것 / 서영배 / 서울 :한빛미디어,2016.



[인공지능]

★(처음 만나는) 머신러닝과 딥러닝 :C언어로 구현하며 익히는 기본 개념 / 오다카, 도모히로 / 부천 :프리렉,2017

★(재미있게 알아보는) 인공지능 70 :AI 키워드 / 미야케, 요이치로 / 파주 :제이펍,2017



[소프트웨어 공학]

(우리가 미처 알지 못한)소프트웨어 공학의 사실과 오해 / Glass, Robert L / 서울 :인사이트,2004.

★피플웨어, DeMarco, Tom, 서울 :인사이트,2014.

★프로그래밍 심리학 | 제럴드 와인버그 지음;조상민 옮김 | 인사이트 | 2013 |



[에세이]

(팟캐스트) 나는 프로그래머다 2 / 임백준 / 서울 :한빛미디어,2016.

(임백준의) 대살개문 :대한민국을 살리는 개발자 문화 / 임백준 / 서울 :한빛미디어,2016.

(세상을 뒤흔든)프로그래머들의 비밀 :이 시대 최고의 프로그래머 14인 직격 인터뷰 / Burns, Ed / 서울 :정보문화사,2010.

소프트웨어, 누가 이렇게 개떡 같이 만든 거야 :사용성을 제대로 이해하는 유쾌한 통찰 / Platt, David S / 서울 :인사이트 :insight,2008.

(코딩 호러의) 이펙티브 프로그래밍 :스택 오버플로우 공동 창립자가 알려주는 소프트웨어 개발의 비밀 / Atwood, Jeff / 파주 :위키북스,2013.

벤츠 타는 프로그래머 :행복한 프로그래밍을 위한 어느 선배 개발자의 조언 / 정금호 / 서울 :제이펍,2013.

(코딩 호러가 들려주는) 진짜 소프트웨어 개발 이야기 / Atwood, Jeff / 파주 :위키북스,2013.

(조엘이 엄선한)소프트웨어 블로그 베스트 29선 / Spolsky, Joel / 의왕 :에이콘,2006.

★사랑하지 않으면 떠나라! / Fowler, Chad / 서울 :인사이트,2008.

★프로그래머의 길, 멘토에게 묻다 / Hoover, Dave H / 서울 :인사이트,2010.

소프트 스킬 :평범한 개발자의 비범한 인생 전략 71가지 / Sonmez, John Z / 서울 :길벗,2015.

소프트웨어 장인 :프로페셔널리즘/실용주의/자부심 / Mancuso, Sandro / 서울 :길벗,2015.

★프로그래머가 되기 전에 알았더라면 좋았을 것들 | 지은이: 고마타 미쓰유키 ;옮긴이: 김훈 | 스포트라잇북 | 2015.

(팟캐스트)나는 프로그래머다 | 임백준,정도현 | 한빛미디어 | 2016 |

(개발자를 위한) 하룻밤에 읽는 Go 언어 이야기, 신제용, 서울 :한빛미디어,2015.

프로그래머, 열정을 말하다, Fowler, Chad, 서울 :인사이트,2012.

역사 속의 소프트웨어 오류 :부실한 소프트웨어가 초래한 위험천만한 사건 사고들, 김종하, 의왕 :에이콘,2014.

꾸준히, 자유롭게, 즐겁게: 한국 오픈 소스 개발자들 이야기 | 송우일 인터뷰어 | 인사이트 | 2013 |

★프로그래머로 사는 법 :프로그래머의 길을 걸어가는 당신을 위한 안내서, Lightstone, Sam, 서울 :한빛미디어,2012.

★(The) nature of software development / Jeffries, Ron / 서울 :한빛미디어,2017

★파이썬 핵심 개발자들과의 인터뷰 / Driscoll, Michael / 서울 :터닝포인트,2019

★커리어 스킬 =Career skills :완벽한 개발자 인생 로드맵 / Sonmez, John / 서울 :길벗,2019



[비즈니스 인사이트]

앱스토어 골드러시 :앱스토어에서 누구나 하루에 3천만 원 벌 수 있다! / 정태훈 / 서울 :이지북,2010.

소프트웨어 전쟁 =The software war, 백일승, 성남 :더하기북스,2015

미래를 바꿀 IT 과학이야기 - 비트코인, 웨어러블, 사물인터넷, 3D프린팅, 가상현실, 드론, 무선통신 l 누구나 읽을 수 있는 IT 과학이야기 1 | 이재영 (지은이) | 로드북 | 2014

내 아이디어가 앱 이 되는법 : 앱 기획 가이드 | 김경홍 지음 | 길벗 | 2012 |

돈버는 아이폰 앱은 따로 있다 | 이정소프트 지음 | 정보문화사 | 2010 |

앱만장자 | 크리스 스티븐스 지음;김지량 옮김 | 제이펍 | 2012 |

1등 아이폰 애플리케이션의 비밀 | 김용민 外 저 | 영진닷컴 | 2010 |
2019/11/04 16:30 2019/11/04 16:30

Comment on this post!



이 강의에서는 Cocoapods을 이용해 iOS 게임에 구글 애드몹 배너를 표시하는 법에 대해 설명합니다.


* 강의에 사용된 소스코드
https://github.com/cliearl/SKSpaceShooting

* Udemy 강의 주소
https://www.udemy.com/course/swift5-spritekit-ios-2d-shooting-game/?referralCode=AF0E25201AD1BABB97A6

* 인프런 강의 주소
https://www.inflearn.com/course/Swift-SpriteKit-iOS-%EC%8A%88%ED%8C%85%EA%B2%8C%EC%9E%84#

2019/11/02 09:39 2019/11/02 09:39

Comment on this post!