Posted
Filed under 개발/강의



* 시리즈 목차
들어가기
101 샘플게임 설명
102 GameplayKit 설명

게임 무대 만들기
201a GUI툴로 타일맵 배경 만들기 (Tile Map Editor)
201b 코드로 타일맵 배경 만들기 (GKRandomSource, Procedural Generation)
202 카메라 배치하기 (SKCameraNode, 타입 프로퍼티)
203 경과시간 표시하기 (SKLabelNode, update 함수, 프로퍼티 옵저버)
204 골 배치하기 (GKRandomDistribution)
205 장애물 설치하기 (Overlap 판정)

객체 준비하기
301 플레이어 배치 (Particle Emitter, SKLightNode)
302a 플레이어 움직이기 (터치에 대한 속도와 각도 계산법)
302b 바닥종류에 따라 객체속도변경하기 (SKTileMapNode)
303 적 배치하기 (Timer)

인공지능 도입하기
401a 에이전트 시스템 준비하기 (GKComponentSystem, GKAgent2D)
401b 적에게 인공지능 부여하기 (GKBehavior, GKGoal, GKObstacle)
402 룰 시스템 셋업하기 (GKRule)

게임 더 꾸미기
501 사운드 붙이기 (SKAudioNode)
502 가상 조이스틱 사용하기 (TLAnalogJoystick)
503 충돌 판정하기 (SKPhysicsBody)
504a 게임오버 처리하기 (State Machine, 하이스코어 처리)
504b 게임오버 씬 전환하기 (SKScene)


* SpriteKit과 GameplayKit으로 만드는 인공지능 술래잡기 게임 Playlist
https://www.youtube.com/playlist?list=PL_XkuR-7VWcv7MK0d5QeSVZI6ADAY4iOD


* Source code
https://github.com/cliearl/SKHideandSeek
2020/05/16 08:49 2020/05/16 08:49
Posted
Filed under 개발/그외
- All categories [Link](https://marketplace.visualstudio.com/search?target=VSCode&category=All%20categories&sortBy=Downloads) - Active File In StatusBar [Link](https://marketplace.visualstudio.com/items?itemName=RoscoP.ActiveFileInStatusBar) - Visual Studio Code extension for showing the full path of the currently active file in the status bar. - C/C++ [Link](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools) - language support for C/C++ to Visual Studio Code - CMake Tools [Link](https://marketplace.visualstudio.com/items?itemName=vector-of-bool.cmake-tools) - CMake Tools provides the native developer a full-featured, convenient, and powerful configure+build workflow for CMake-based projects in Visual Studio Code. - Code Runner [Link](https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner) - Run code snippet or code file for multiple languages - Code Spell Checker [Link](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker) - A basic spell checker that works well with camelCase code. - CodeMap [Link](https://marketplace.visualstudio.com/items?itemName=oleg-shilo.codemap) - Interactive code map for quick visualization and navigation within code DOM objects (e.g. classes, members). - Excel Viewer [Link](https://marketplace.visualstudio.com/items?itemName=GrapeCity.gc-excelviewer) - View Excel spreadsheets and CSV files within Visual Studio Code workspaces. - Git Graph [Link](https://marketplace.visualstudio.com/items?itemName=mhutchie.git-graph) - View a Git Graph of your repository, and perform Git actions from the graph. - indent-rainbow [Link](https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow) - This extension colorizes the indentation in front of your text alternating four different colors on each step. Some may find it helpful in writing code for Nim or Python. - Kotlin Language [Link](https://marketplace.visualstudio.com/items?itemName=mathiasfrohlich.Kotlin) - Kotlin language support for VS Code - LaTeX Workshop [Link](https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop) - Boost LaTeX typesetting efficiency with preview, compile, autocomplete, colorize, and more. - Markdown All in One [Link](https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one) - All you need to write Markdown (keyboard shortcuts, table of contents, auto preview and more) - Path Autocomplete [Link](https://marketplace.visualstudio.com/items?itemName=ionutvmi.path-autocomplete) - Provides path completion for visual studio code. - Python [Link](https://marketplace.visualstudio.com/items?itemName=ms-python.python) - A Visual Studio Code extension with rich support for the Python language (for all actively supported versions of the language: 2.7, >=3.4), including features such as linting, debugging, IntelliSense, code navigation, code formatting, refactoring, unit tests, snippets, and more! - Settings Sync [Link](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync) - Synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces and Extensions Across Multiple Machines Using GitHub Gist. - Swift Language [Link](https://marketplace.visualstudio.com/items?itemName=Kasik96.swift) - Swift language support for VS Code - Todo Tree [Link](https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.todo-tree) - Show TODO, FIXME, etc. comment tags in a tree view - Visual Studio IntelliCode [Link](https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.vscodeintellicode) - AI-assisted development - vscode-icons [Link](https://marketplace.visualstudio.com/items?itemName=robertohuertasm.vscode-icons) - Icons for Visual Studio Code - Korean Language Pack for Visual Studio Code [Link](https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ko) - Language pack extension for Korean - GitLens — Git supercharged [Link](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens) - GitLens supercharges the Git capabilities built into Visual Studio Code. It helps you to visualize code authorship at a glance via Git blame annotations and code lens, seamlessly navigate and explore Git repositories, gain valuable insights via powerful comparison commands, and so much more.
2020/04/17 15:56 2020/04/17 15:56
Posted
Filed under 개발/그외
https://code.visualstudio.com/docs/python/testing

settings.json에 다음 라인을 추가
[code]
"python.testing.autoTestDiscoverOnSaveEnabled": true,
"python.testing.pytestEnabled": true,
[/code]
다음과 같은 파일을 만들었다고 한다.
[code]
inc_dec.py

def increment(x):
    return x + 1
def decrement(x):
    return x - 1
[/code]

테스트 파일은 다음과 같이 만든다
[code]
import inc_dec # The code to test

def test_increment():
    assert inc_dec.increment(3) == 3
def test_decrement():
    assert inc_dec.decrement(3) == 2
[/code]

테스트는 왼쪽 플라스크 아이콘으로 실행하든지, Ctrl + Shite + P 에서 Run all tests로 실행한다
2020/04/14 14:46 2020/04/14 14:46
Posted
Filed under 개발/Linux
스크립트 작성
[code]
$ sudo nano pitemp.sh
[/code]

5초마다 온도를 표시하는 루프문
[code]
while true
do
    # get cpu temp from thermal node of kernal
    cpuTemp0=$(cat /sys/class/thermal/thermal_zone0/temp)
    cpuTemp1=$(($cpuTemp0/1000))
    cpuTemp2=$(($cpuTemp0/100))
    cpuTempM=$(($cpuTemp2 % $cpuTemp1))

    # get gpu temp using Video Core Generate Command
    gpuTemp=$(/opt/vc/bin/vcgencmd measure_temp)
    gpuTemp=${gpuTemp//temp=/}

    echo $(date "+%Y-%m-%d %H:%M:%S")"  CPU: " $cpuTemp1"."$cpuTempM"'C" "GPU: "$gpuTemp
    sleep 5
done
[/code]

실행파일로 만들고 실행
[code]
$ sudo chmod +x pitemp.sh
$ ./pitemp.sh
[/code]
2020/03/21 08:30 2020/03/21 08:30
Posted
Filed under 개발/Linux
* Github Repository
https://github.com/go-gitea/gitea


* git 설치
[code]
$sudo apt install git
[/code]

* gitea 디렉토리에 바이너리 다운로드
[code]
$mkdir ~/gitea
$cd ~/gitea
$wget -O gitea https://dl.gitea.io/gitea/master/gitea-master-linux-arm-6
[/code]

* MySQL 셋업
[code]
$sudo mysql -u root
CREATE DATABASE gitea;
CREATE USER 'gitea'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON gitea.* TO 'gitea'@'localhost';
FLUSH PRIVILEGES
^C
[/code]

* 서버실행
[code]
$cd ~/gitea
$chmod 755 gitea
$./gitea web
[/code]

* 접속 후 환경설정
데이터베이스 유형 : MySQL
호스트: 127.0.0.1:3306
Username: gitea
비밀번호: password
데이터베이스 이름: gitea
Charset: utf8
저장소 최상위 경로 : /home/pi/gitea/gitea-repositories
LFS Root Path : /home/pi/gitea/data/LFS
데몬 사용자 계정 : pi
도메인 : localhost
SSH 포트 :
HTTP 포트 : 3000
애플리케이션 URL : http://라즈베리파이IP:3000/
로그 경로 : /home/pi/gitea/log


* 서비스에 등록
[code]
$sudo nano /etc/systemd/system/gitea.service

[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target

[Service]
# Modify these two values ??and uncomment them if you have
# repos with lots of files and get to HTTP error 500 because of that
###
# LimitMEMLOCK=infinity
# LimitNOFILE=65535
RestartSec=2s
Type=simple
User=pi
Group=pi
WorkingDirectory=/home/pi/gitea
ExecStart=/home/pi/gitea/gitea web
Restart=always
Environment=USER=pi
HOME=/home/pi

[Install]
WantedBy=multi-user.target
[/code]

* 서비스 시작
[code]
sudo systemctl enable gitea.service
sudo systemctl start gitea.service
[/code]

* gitea nginx 설정
[code]
$sudo nano /etc/nginx/sites-available/git.qualitybits.net
server {
    listen 443 ssl;
    server_name 도메인;
    ssl_certificate     /etc/letsencrypt/live/도메인/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/도메인/privkey.pem;

    location / {
        client_max_body_size 364M;
        proxy_pass http://localhost:3000;
        proxy_connect_timeout 600;
        proxy_send_timeout 600;
        proxy_read_timeout 600;
        send_timeout 600;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

server {
    listen 80;
    server_name 도메인;
    return 301 https://$server_name$request_uri;
}
[/code]

* 심볼릭링크 작성
[code]
$sudo ln -s /etc/nginx/sites-available/도메인 /etc/nginx/sites-enabled/도메인
[/code]

* SSL 인증서 취득
[code]
$sudo systemctl stop nginx
$sudo certbot certonly --standalone -d 도메인
$sudo systemctl start nginx
[/code]


* 업데이트
[code]
$sudo systemctl stop gitea.service
$mv -f /home/pi/gitea/gitea /home/pi/gitea/gitea.old
$wget -O /home/pi/gitea/gitea https://dl.gitea.io/gitea/master/gitea-master-linux-arm-6
$chmod +x /home/pi/gitea/gitea
$sudo systemctl start gitea.service
[/code]


* 인증서 갱신
[code]
$ sudo systemctl stop nginx
$ sudo certbot renew
$ sudo systemctl start nginx
[/code]


* 데이터 백업
[code]
# login as your database user, for me it is root
$ su -

# navigate to your gitea folder
$ cd /home/USER/gitea

# run the dump command
$ ./gitea dump -V -t /media/USER/USB/
[/code]


* 데이터 복구
[code]
apt-get install gitea
unzip gitea-dump-1482906742.zip
cd gitea-dump-1482906742
mv custom/conf/app.ini /etc/gitea/conf/app.ini # or mv app.ini /etc/gitea/conf/app.ini
unzip gitea-repo.zip
mv gitea-repo/* /home/pi/gitea/gitea-repositories/
chown -R gitea:gitea /etc/gitea/conf/app.ini /home/pi/gitea/gitea-repositories/
mysql -u$USER -p$PASS $DATABASE <gitea-db.sql
# or  sqlite3 $DATABASE_PATH <gitea-db.sql
service gitea restart
[/code]
2020/03/15 18:54 2020/03/15 18:54
Posted
Filed under 개발/Linux
* Github
https://github.com/RestyaPlatform/board


* 인스톨 스크립트 다운로드 후 설치
[code]
$ sudo su
$ wget https://github.com/RestyaPlatform/board/raw/master/restyaboard.sh –no-check-certificate
$ chmod +x restyaboard.sh
$ ./restyaboard.sh
[/code]


* nginx 가상호스트 설정
[code]
$ cp /usr/share/nginx/html/restyaboard.conf /etc/nginx/sites-available/도메인명
$ $sudo ln -s /etc/nginx/sites-available/도메인 /etc/nginx/sites-enabled/도메인명
[/code]


* nginx 서버설정
[code]
server {
    listen 80;
    server_name 도메인명;

    root /usr/share/nginx/html;
    index  index.html index.php;

    gzip on;
    gzip_disable "msie6";

    gzip_comp_level 6;
    # gzip_comp_level 9;
    gzip_min_length  1100;
    gzip_buffers 16 8k;
    gzip_proxied any;
    # gzip_http_version 1.1;
    gzip_types       text/plain application/xml text/css text/js text/xml application/x-javascript text/javascript application/json application/xml+rss;

    client_max_body_size 300M;

    rewrite ^/oauth/authorize$ /server/php/authorize.php last;
    rewrite ^/oauth_callback/([a-zA-Z0-9_\.]*)/([a-zA-Z0-9_\.]*)$ /server/php/oauth_callback.php?plugin=$1&code=$2 last;
    rewrite ^/download/([0-9]*)/([a-zA-Z0-9_\.]*)$ /server/php/download.php?id=$1&hash=$2 last;
    rewrite ^/ical/([0-9]*)/([0-9]*)/([a-z0-9]*).ics$ /server/php/ical.php?board_id=$1&user_id=$2&hash=$3 last;
    rewrite ^/api/(.*)$ /server/php/R/r.php?_url=$1&$args last;
    rewrite ^/api_explorer/api-docs/$ /client/api_explorer/api-docs/index.php last;
       
    location / {
        root /usr/share/nginx/html/client;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_pass    unix:/run/php/php7.2-fpm.sock;
        fastcgi_index   index.php;
        fastcgi_param    SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PHP_VALUE "upload_max_filesize=9G \n post_max_size=9G \n max_execution_time=200 \n max_input_time=200 \n memory_limit=256M";
    }

    location ~* \.(css|js|less|html|ttf|woff|jpg|jpeg|gif|png|bmp|ico|pdf|doc|docx|xls|xlx|txt|ppt|pptx|mp4|webm|mkv|wmv|avi|mp3) {
        root /usr/share/nginx/html/client;
        if (-f $request_filename) {
            break;
        }
        rewrite ^/img/([a-zA-Z_]*)/([a-zA-Z_]*)/([a-zA-Z0-9_\.]*)$ /server/php/image.php?size=$1&model=$2&filename=$3 last;
        add_header        Cache-Control public;
        add_header        Cache-Control must-revalidate;
        expires           7d;
    }
}
[/code]


* SSL 인증서 발행
[code]
$sudo systemctl stop nginx
$sudo certbot certonly --standalone -d 도메인
$sudo systemctl start nginx
[/code]


* nginx SSL 설정
[code]
server {
    listen 80;
    server_name 도메인명;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name 도메인명;

    ssl_certificate      /etc/letsencrypt/live/도메인명/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/도메인명/privkey.pem;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  15m;

    # Set system wide SSL settings
    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1.2 TLSv1.1 TLSv1;

    #Forward Secrecy
    ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";

    if ($scheme = 'http') {
        rewrite  ^/(.*)$  https://도메인명/$1 permanent;
    }


    root /usr/share/nginx/html;
    index  index.html index.php;

    gzip on;
    gzip_disable "msie6";

    gzip_comp_level 6;
    # gzip_comp_level 9;
    gzip_min_length  1100;
    gzip_buffers 16 8k;
    gzip_proxied any;
    # gzip_http_version 1.1;
    gzip_types       text/plain application/xml text/css text/js text/xml application/x-javascript text/javascript application/json application/xml+rss;

    client_max_body_size 300M;

    rewrite ^/oauth/authorize$ /server/php/authorize.php last;
    rewrite ^/oauth_callback/([a-zA-Z0-9_\.]*)/([a-zA-Z0-9_\.]*)$ /server/php/oauth_callback.php?plugin=$1&code=$2 last;
    rewrite ^/download/([0-9]*)/([a-zA-Z0-9_\.]*)$ /server/php/download.php?id=$1&hash=$2 last;
    rewrite ^/ical/([0-9]*)/([0-9]*)/([a-z0-9]*).ics$ /server/php/ical.php?board_id=$1&user_id=$2&hash=$3 last;
    rewrite ^/api/(.*)$ /server/php/R/r.php?_url=$1&$args last;
    rewrite ^/api_explorer/api-docs/$ /client/api_explorer/api-docs/index.php last;
       
    location / {
        root /usr/share/nginx/html/client;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_pass    unix:/run/php/php7.2-fpm.sock;
        fastcgi_index   index.php;
        fastcgi_param    SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PHP_VALUE "upload_max_filesize=9G \n post_max_size=9G \n max_execution_time=200 \n max_input_time=200 \n memory_limit=256M";
    }

    location ~* \.(css|js|less|html|ttf|woff|jpg|jpeg|gif|png|bmp|ico|pdf|doc|docx|xls|xlx|txt|ppt|pptx|mp4|webm|mkv|wmv|avi|mp3) {
        root /usr/share/nginx/html/client;
        if (-f $request_filename) {
            break;
        }
        rewrite ^/img/([a-zA-Z_]*)/([a-zA-Z_]*)/([a-zA-Z0-9_\.]*)$ /server/php/image.php?size=$1&model=$2&filename=$3 last;
        add_header        Cache-Control public;
        add_header        Cache-Control must-revalidate;
        expires           7d;
    }
}
[/code]
2020/03/15 18:50 2020/03/15 18:50
Posted
Filed under 개발/Linux
https://stackframe.tistory.com/4

라즈베리파이에서 11버전 설치
$ sudo apt-get install postgresql-11

9.6 버전에서 11버전으로 데이터 이전
$ sudo pg_upgradecluster  9.6 main

old 클러스터 삭제
$ sudo pg_dropcluster 9.6 main
2020/03/14 21:14 2020/03/14 21:14
Posted
Filed under 개발/Linux
모듈 업데이트
$ sudo apt-get update && sudo apt-get upgrade -y

에러가 없는지 확인
$ dpkg -C
$ apt-mark showhold

apt-get 소스를 Buster로 변경
$ sudo sed -i 's/stretch/buster/g' /etc/apt/sources.list
$ sudo sed -i 's/stretch/buster/g' /etc/apt/sources.list.d/raspi.list

아직 변경되지 않은 소스가 있는지 확인. 있으면 위의 줄처럼 변경해줌
$ grep -lnr stretch /etc/apt

list change packge를 없애서 처리를 빠르게 함
$ sudo apt-get remove apt-listchanges

커널 및 패키지 업그레이드
$ sudo apt-get update && sudo apt-get upgrade -y

오래된 패키지 제거
$ sudo apt-get autoremove -y && sudo apt-get autoclean

설치 확인
$ cat /etc/os-release

커널 넘버 확인
$ sudo dpkg -l | grep raspberry
2020/03/14 21:10 2020/03/14 21:10
Posted
Filed under 개발/그외
* 소개글 1 [Link](https://blog.namiking.net/post/2015/09/kanban-board/) * 소개글 2 [Link](https://opensource.com/alternatives/trello) --- * Taiga.io * 홈페이지 [https://taiga.io](https://taiga.io) * [https://github.com/taigaio](https://github.com/taigaio) * Requirements Spec (Wekan에 비해 낮은 요구스펙): The main Taiga hardware restriction is having at least 0.75 GB of RAM. * [라즈베리 파이에 설치하기](https://www.techcoil.com/blog/how-to-setup-taiga-project-management-platform-on-raspberry-pi-3-with-raspbian-stretch-lite/) * Wekan * 홈페이지 [https://wekan.github.io](https://wekan.github.io) * [https://github.com/wekan/wekan](https://github.com/wekan/wekan) * Requirements Spec (요구스펙이 높다): Usually for production you just install Ubuntu 18.04 or Debian 9 VM (or without VM) and install Snap. Minimum 2 GB RAM required, preferably 4 GB or more. * Restyaboard * 홈페이지 [https://restya.com/board](https://restya.com/board) * [https://github.com/RestyaPlatform/board](https://github.com/RestyaPlatform/board) * 데비안에 설치 [Link](https://blog.sleeplessbeastie.eu/2020/01/06/how-to-install-restyaboard/) * 우분투에 설치 [Link](https://restya.com/board/docs/installation-in-ubuntu-using-shell-script/) * Deck * 홈페이지 [https://apps.nextcloud.com/apps/deck](https://apps.nextcloud.com/apps/deck) * [https://github.com/nextcloud/deck](https://github.com/nextcloud/deck) * Tuleap * 홈페이지 [https://www.tuleap.org/what-is-tuleap](https://www.tuleap.org/what-is-tuleap) * [https://github.com/Enalean/tuleap](https://github.com/Enalean/tuleap) * TaskBoard * 홈페이지 [https://taskboard.matthewross.me](https://taskboard.matthewross.me) * [https://github.com/kiswa/TaskBoard](https://github.com/kiswa/TaskBoard) * 인터페이스 별로 * Kanboard * 홈페이지 [https://kanboard.org](https://kanboard.org) * [https://github.com/kanboard/kanboard](https://github.com/kanboard/kanboard) * 인터페이스가 후짐
2020/03/05 23:17 2020/03/05 23:17
Posted
Filed under 개발/게임
[code]
>>> from pprint import pprint
>>> import pygame as pg
>>> pprint(pg.color.THECOLORS)
{'aliceblue': (240, 248, 255, 255),
'antiquewhite': (250, 235, 215, 255),
'antiquewhite1': (255, 239, 219, 255),
'antiquewhite2': (238, 223, 204, 255),
'antiquewhite3': (205, 192, 176, 255),
'antiquewhite4': (139, 131, 120, 255),
'aquamarine': (127, 255, 212, 255),
'aquamarine1': (127, 255, 212, 255),
'aquamarine2': (118, 238, 198, 255),
'aquamarine3': (102, 205, 170, 255),
'aquamarine4': (69, 139, 116, 255),
'azure': (240, 255, 255, 255),
'azure1': (240, 255, 255, 255),
'azure2': (224, 238, 238, 255),
'azure3': (193, 205, 205, 255),
'azure4': (131, 139, 139, 255),
'beige': (245, 245, 220, 255),
'bisque': (255, 228, 196, 255),
'bisque1': (255, 228, 196, 255),
'bisque2': (238, 213, 183, 255),
'bisque3': (205, 183, 158, 255),
'bisque4': (139, 125, 107, 255),
'black': (0, 0, 0, 255),
'blanchedalmond': (255, 235, 205, 255),
'blue': (0, 0, 255, 255),
'blue1': (0, 0, 255, 255),
'blue2': (0, 0, 238, 255),
'blue3': (0, 0, 205, 255),
'blue4': (0, 0, 139, 255),
'blueviolet': (138, 43, 226, 255),
'brown': (165, 42, 42, 255),
'brown1': (255, 64, 64, 255),
'brown2': (238, 59, 59, 255),
'brown3': (205, 51, 51, 255),
'brown4': (139, 35, 35, 255),
'burlywood': (222, 184, 135, 255),
'burlywood1': (255, 211, 155, 255),
'burlywood2': (238, 197, 145, 255),
'burlywood3': (205, 170, 125, 255),
'burlywood4': (139, 115, 85, 255),
'cadetblue': (95, 158, 160, 255),
'cadetblue1': (152, 245, 255, 255),
'cadetblue2': (142, 229, 238, 255),
'cadetblue3': (122, 197, 205, 255),
'cadetblue4': (83, 134, 139, 255),
'chartreuse': (127, 255, 0, 255),
'chartreuse1': (127, 255, 0, 255),
'chartreuse2': (118, 238, 0, 255),
'chartreuse3': (102, 205, 0, 255),
'chartreuse4': (69, 139, 0, 255),
'chocolate': (210, 105, 30, 255),
'chocolate1': (255, 127, 36, 255),
'chocolate2': (238, 118, 33, 255),
'chocolate3': (205, 102, 29, 255),
'chocolate4': (139, 69, 19, 255),
'coral': (255, 127, 80, 255),
'coral1': (255, 114, 86, 255),
'coral2': (238, 106, 80, 255),
'coral3': (205, 91, 69, 255),
'coral4': (139, 62, 47, 255),
'cornflowerblue': (100, 149, 237, 255),
'cornsilk': (255, 248, 220, 255),
'cornsilk1': (255, 248, 220, 255),
'cornsilk2': (238, 232, 205, 255),
'cornsilk3': (205, 200, 177, 255),
'cornsilk4': (139, 136, 120, 255),
'cyan': (0, 255, 255, 255),
'cyan1': (0, 255, 255, 255),
'cyan2': (0, 238, 238, 255),
'cyan3': (0, 205, 205, 255),
'cyan4': (0, 139, 139, 255),
'darkblue': (0, 0, 139, 255),
'darkcyan': (0, 139, 139, 255),
'darkgoldenrod': (184, 134, 11, 255),
'darkgoldenrod1': (255, 185, 15, 255),
'darkgoldenrod2': (238, 173, 14, 255),
'darkgoldenrod3': (205, 149, 12, 255),
'darkgoldenrod4': (139, 101, 8, 255),
'darkgray': (169, 169, 169, 255),
'darkgreen': (0, 100, 0, 255),
'darkgrey': (169, 169, 169, 255),
'darkkhaki': (189, 183, 107, 255),
'darkmagenta': (139, 0, 139, 255),
'darkolivegreen': (85, 107, 47, 255),
'darkolivegreen1': (202, 255, 112, 255),
'darkolivegreen2': (188, 238, 104, 255),
'darkolivegreen3': (162, 205, 90, 255),
'darkolivegreen4': (110, 139, 61, 255),
'darkorange': (255, 140, 0, 255),
'darkorange1': (255, 127, 0, 255),
'darkorange2': (238, 118, 0, 255),
'darkorange3': (205, 102, 0, 255),
'darkorange4': (139, 69, 0, 255),
'darkorchid': (153, 50, 204, 255),
'darkorchid1': (191, 62, 255, 255),
'darkorchid2': (178, 58, 238, 255),
'darkorchid3': (154, 50, 205, 255),
'darkorchid4': (104, 34, 139, 255),
'darkred': (139, 0, 0, 255),
'darksalmon': (233, 150, 122, 255),
'darkseagreen': (143, 188, 143, 255),
'darkseagreen1': (193, 255, 193, 255),
'darkseagreen2': (180, 238, 180, 255),
'darkseagreen3': (155, 205, 155, 255),
'darkseagreen4': (105, 139, 105, 255),
'darkslateblue': (72, 61, 139, 255),
'darkslategray': (47, 79, 79, 255),
'darkslategray1': (151, 255, 255, 255),
'darkslategray2': (141, 238, 238, 255),
'darkslategray3': (121, 205, 205, 255),
'darkslategray4': (82, 139, 139, 255),
'darkslategrey': (47, 79, 79, 255),
'darkturquoise': (0, 206, 209, 255),
'darkviolet': (148, 0, 211, 255),
'deeppink': (255, 20, 147, 255),
'deeppink1': (255, 20, 147, 255),
'deeppink2': (238, 18, 137, 255),
'deeppink3': (205, 16, 118, 255),
'deeppink4': (139, 10, 80, 255),
'deepskyblue': (0, 191, 255, 255),
'deepskyblue1': (0, 191, 255, 255),
'deepskyblue2': (0, 178, 238, 255),
'deepskyblue3': (0, 154, 205, 255),
'deepskyblue4': (0, 104, 139, 255),
'dimgray': (105, 105, 105, 255),
'dimgrey': (105, 105, 105, 255),
'dodgerblue': (30, 144, 255, 255),
'dodgerblue1': (30, 144, 255, 255),
'dodgerblue2': (28, 134, 238, 255),
'dodgerblue3': (24, 116, 205, 255),
'dodgerblue4': (16, 78, 139, 255),
'firebrick': (178, 34, 34, 255),
'firebrick1': (255, 48, 48, 255),
'firebrick2': (238, 44, 44, 255),
'firebrick3': (205, 38, 38, 255),
'firebrick4': (139, 26, 26, 255),
'floralwhite': (255, 250, 240, 255),
'forestgreen': (34, 139, 34, 255),
'gainsboro': (220, 220, 220, 255),
'ghostwhite': (248, 248, 255, 255),
'gold': (255, 215, 0, 255),
'gold1': (255, 215, 0, 255),
'gold2': (238, 201, 0, 255),
'gold3': (205, 173, 0, 255),
'gold4': (139, 117, 0, 255),
'goldenrod': (218, 165, 32, 255),
'goldenrod1': (255, 193, 37, 255),
'goldenrod2': (238, 180, 34, 255),
'goldenrod3': (205, 155, 29, 255),
'goldenrod4': (139, 105, 20, 255),
'gray': (190, 190, 190, 255),
'gray0': (0, 0, 0, 255),
'gray1': (3, 3, 3, 255),
'gray10': (26, 26, 26, 255),
'gray100': (255, 255, 255, 255),
'gray11': (28, 28, 28, 255),
'gray12': (31, 31, 31, 255),
'gray13': (33, 33, 33, 255),
'gray14': (36, 36, 36, 255),
'gray15': (38, 38, 38, 255),
'gray16': (41, 41, 41, 255),
'gray17': (43, 43, 43, 255),
'gray18': (46, 46, 46, 255),
'gray19': (48, 48, 48, 255),
'gray2': (5, 5, 5, 255),
'gray20': (51, 51, 51, 255),
'gray21': (54, 54, 54, 255),
'gray22': (56, 56, 56, 255),
'gray23': (59, 59, 59, 255),
'gray24': (61, 61, 61, 255),
'gray25': (64, 64, 64, 255),
'gray26': (66, 66, 66, 255),
'gray27': (69, 69, 69, 255),
'gray28': (71, 71, 71, 255),
'gray29': (74, 74, 74, 255),
'gray3': (8, 8, 8, 255),
'gray30': (77, 77, 77, 255),
'gray31': (79, 79, 79, 255),
'gray32': (82, 82, 82, 255),
'gray33': (84, 84, 84, 255),
'gray34': (87, 87, 87, 255),
'gray35': (89, 89, 89, 255),
'gray36': (92, 92, 92, 255),
'gray37': (94, 94, 94, 255),
'gray38': (97, 97, 97, 255),
'gray39': (99, 99, 99, 255),
'gray4': (10, 10, 10, 255),
'gray40': (102, 102, 102, 255),
'gray41': (105, 105, 105, 255),
'gray42': (107, 107, 107, 255),
'gray43': (110, 110, 110, 255),
'gray44': (112, 112, 112, 255),
'gray45': (115, 115, 115, 255),
'gray46': (117, 117, 117, 255),
'gray47': (120, 120, 120, 255),
'gray48': (122, 122, 122, 255),
'gray49': (125, 125, 125, 255),
'gray5': (13, 13, 13, 255),
'gray50': (127, 127, 127, 255),
'gray51': (130, 130, 130, 255),
'gray52': (133, 133, 133, 255),
'gray53': (135, 135, 135, 255),
'gray54': (138, 138, 138, 255),
'gray55': (140, 140, 140, 255),
'gray56': (143, 143, 143, 255),
'gray57': (145, 145, 145, 255),
'gray58': (148, 148, 148, 255),
'gray59': (150, 150, 150, 255),
'gray6': (15, 15, 15, 255),
'gray60': (153, 153, 153, 255),
'gray61': (156, 156, 156, 255),
'gray62': (158, 158, 158, 255),
'gray63': (161, 161, 161, 255),
'gray64': (163, 163, 163, 255),
'gray65': (166, 166, 166, 255),
'gray66': (168, 168, 168, 255),
'gray67': (171, 171, 171, 255),
'gray68': (173, 173, 173, 255),
'gray69': (176, 176, 176, 255),
'gray7': (18, 18, 18, 255),
'gray70': (179, 179, 179, 255),
'gray71': (181, 181, 181, 255),
'gray72': (184, 184, 184, 255),
'gray73': (186, 186, 186, 255),
'gray74': (189, 189, 189, 255),
'gray75': (191, 191, 191, 255),
'gray76': (194, 194, 194, 255),
'gray77': (196, 196, 196, 255),
'gray78': (199, 199, 199, 255),
'gray79': (201, 201, 201, 255),
'gray8': (20, 20, 20, 255),
'gray80': (204, 204, 204, 255),
'gray81': (207, 207, 207, 255),
'gray82': (209, 209, 209, 255),
'gray83': (212, 212, 212, 255),
'gray84': (214, 214, 214, 255),
'gray85': (217, 217, 217, 255),
'gray86': (219, 219, 219, 255),
'gray87': (222, 222, 222, 255),
'gray88': (224, 224, 224, 255),
'gray89': (227, 227, 227, 255),
'gray9': (23, 23, 23, 255),
'gray90': (229, 229, 229, 255),
'gray91': (232, 232, 232, 255),
'gray92': (235, 235, 235, 255),
'gray93': (237, 237, 237, 255),
'gray94': (240, 240, 240, 255),
'gray95': (242, 242, 242, 255),
'gray96': (245, 245, 245, 255),
'gray97': (247, 247, 247, 255),
'gray98': (250, 250, 250, 255),
'gray99': (252, 252, 252, 255),
'green': (0, 255, 0, 255),
'green1': (0, 255, 0, 255),
'green2': (0, 238, 0, 255),
'green3': (0, 205, 0, 255),
'green4': (0, 139, 0, 255),
'greenyellow': (173, 255, 47, 255),
'grey': (190, 190, 190, 255),
'grey0': (0, 0, 0, 255),
'grey1': (3, 3, 3, 255),
'grey10': (26, 26, 26, 255),
'grey100': (255, 255, 255, 255),
'grey11': (28, 28, 28, 255),
'grey12': (31, 31, 31, 255),
'grey13': (33, 33, 33, 255),
'grey14': (36, 36, 36, 255),
'grey15': (38, 38, 38, 255),
'grey16': (41, 41, 41, 255),
'grey17': (43, 43, 43, 255),
'grey18': (46, 46, 46, 255),
'grey19': (48, 48, 48, 255),
'grey2': (5, 5, 5, 255),
'grey20': (51, 51, 51, 255),
'grey21': (54, 54, 54, 255),
'grey22': (56, 56, 56, 255),
'grey23': (59, 59, 59, 255),
'grey24': (61, 61, 61, 255),
'grey25': (64, 64, 64, 255),
'grey26': (66, 66, 66, 255),
'grey27': (69, 69, 69, 255),
'grey28': (71, 71, 71, 255),
'grey29': (74, 74, 74, 255),
'grey3': (8, 8, 8, 255),
'grey30': (77, 77, 77, 255),
'grey31': (79, 79, 79, 255),
'grey32': (82, 82, 82, 255),
'grey33': (84, 84, 84, 255),
'grey34': (87, 87, 87, 255),
'grey35': (89, 89, 89, 255),
'grey36': (92, 92, 92, 255),
'grey37': (94, 94, 94, 255),
'grey38': (97, 97, 97, 255),
'grey39': (99, 99, 99, 255),
'grey4': (10, 10, 10, 255),
'grey40': (102, 102, 102, 255),
'grey41': (105, 105, 105, 255),
'grey42': (107, 107, 107, 255),
'grey43': (110, 110, 110, 255),
'grey44': (112, 112, 112, 255),
'grey45': (115, 115, 115, 255),
'grey46': (117, 117, 117, 255),
'grey47': (120, 120, 120, 255),
'grey48': (122, 122, 122, 255),
'grey49': (125, 125, 125, 255),
'grey5': (13, 13, 13, 255),
'grey50': (127, 127, 127, 255),
'grey51': (130, 130, 130, 255),
'grey52': (133, 133, 133, 255),
'grey53': (135, 135, 135, 255),
'grey54': (138, 138, 138, 255),
'grey55': (140, 140, 140, 255),
'grey56': (143, 143, 143, 255),
'grey57': (145, 145, 145, 255),
'grey58': (148, 148, 148, 255),
'grey59': (150, 150, 150, 255),
'grey6': (15, 15, 15, 255),
'grey60': (153, 153, 153, 255),
'grey61': (156, 156, 156, 255),
'grey62': (158, 158, 158, 255),
'grey63': (161, 161, 161, 255),
'grey64': (163, 163, 163, 255),
'grey65': (166, 166, 166, 255),
'grey66': (168, 168, 168, 255),
'grey67': (171, 171, 171, 255),
'grey68': (173, 173, 173, 255),
'grey69': (176, 176, 176, 255),
'grey7': (18, 18, 18, 255),
'grey70': (179, 179, 179, 255),
'grey71': (181, 181, 181, 255),
'grey72': (184, 184, 184, 255),
'grey73': (186, 186, 186, 255),
'grey74': (189, 189, 189, 255),
'grey75': (191, 191, 191, 255),
'grey76': (194, 194, 194, 255),
'grey77': (196, 196, 196, 255),
'grey78': (199, 199, 199, 255),
'grey79': (201, 201, 201, 255),
'grey8': (20, 20, 20, 255),
'grey80': (204, 204, 204, 255),
'grey81': (207, 207, 207, 255),
'grey82': (209, 209, 209, 255),
'grey83': (212, 212, 212, 255),
'grey84': (214, 214, 214, 255),
'grey85': (217, 217, 217, 255),
'grey86': (219, 219, 219, 255),
'grey87': (222, 222, 222, 255),
'grey88': (224, 224, 224, 255),
'grey89': (227, 227, 227, 255),
'grey9': (23, 23, 23, 255),
'grey90': (229, 229, 229, 255),
'grey91': (232, 232, 232, 255),
'grey92': (235, 235, 235, 255),
'grey93': (237, 237, 237, 255),
'grey94': (240, 240, 240, 255),
'grey95': (242, 242, 242, 255),
'grey96': (245, 245, 245, 255),
'grey97': (247, 247, 247, 255),
'grey98': (250, 250, 250, 255),
'grey99': (252, 252, 252, 255),
'honeydew': (240, 255, 240, 255),
'honeydew1': (240, 255, 240, 255),
'honeydew2': (224, 238, 224, 255),
'honeydew3': (193, 205, 193, 255),
'honeydew4': (131, 139, 131, 255),
'hotpink': (255, 105, 180, 255),
'hotpink1': (255, 110, 180, 255),
'hotpink2': (238, 106, 167, 255),
'hotpink3': (205, 96, 144, 255),
'hotpink4': (139, 58, 98, 255),
'indianred': (205, 92, 92, 255),
'indianred1': (255, 106, 106, 255),
'indianred2': (238, 99, 99, 255),
'indianred3': (205, 85, 85, 255),
'indianred4': (139, 58, 58, 255),
'ivory': (255, 255, 240, 255),
'ivory1': (255, 255, 240, 255),
'ivory2': (238, 238, 224, 255),
'ivory3': (205, 205, 193, 255),
'ivory4': (139, 139, 131, 255),
'khaki': (240, 230, 140, 255),
'khaki1': (255, 246, 143, 255),
'khaki2': (238, 230, 133, 255),
'khaki3': (205, 198, 115, 255),
'khaki4': (139, 134, 78, 255),
'lavender': (230, 230, 250, 255),
'lavenderblush': (255, 240, 245, 255),
'lavenderblush1': (255, 240, 245, 255),
'lavenderblush2': (238, 224, 229, 255),
'lavenderblush3': (205, 193, 197, 255),
'lavenderblush4': (139, 131, 134, 255),
'lawngreen': (124, 252, 0, 255),
'lemonchiffon': (255, 250, 205, 255),
'lemonchiffon1': (255, 250, 205, 255),
'lemonchiffon2': (238, 233, 191, 255),
'lemonchiffon3': (205, 201, 165, 255),
'lemonchiffon4': (139, 137, 112, 255),
'lightblue': (173, 216, 230, 255),
'lightblue1': (191, 239, 255, 255),
'lightblue2': (178, 223, 238, 255),
'lightblue3': (154, 192, 205, 255),
'lightblue4': (104, 131, 139, 255),
'lightcoral': (240, 128, 128, 255),
'lightcyan': (224, 255, 255, 255),
'lightcyan1': (224, 255, 255, 255),
'lightcyan2': (209, 238, 238, 255),
'lightcyan3': (180, 205, 205, 255),
'lightcyan4': (122, 139, 139, 255),
'lightgoldenrod': (238, 221, 130, 255),
'lightgoldenrod1': (255, 236, 139, 255),
'lightgoldenrod2': (238, 220, 130, 255),
'lightgoldenrod3': (205, 190, 112, 255),
'lightgoldenrod4': (139, 129, 76, 255),
'lightgoldenrodyellow': (250, 250, 210, 255),
'lightgray': (211, 211, 211, 255),
'lightgreen': (144, 238, 144, 255),
'lightgrey': (211, 211, 211, 255),
'lightpink': (255, 182, 193, 255),
'lightpink1': (255, 174, 185, 255),
'lightpink2': (238, 162, 173, 255),
'lightpink3': (205, 140, 149, 255),
'lightpink4': (139, 95, 101, 255),
'lightsalmon': (255, 160, 122, 255),
'lightsalmon1': (255, 160, 122, 255),
'lightsalmon2': (238, 149, 114, 255),
'lightsalmon3': (205, 129, 98, 255),
'lightsalmon4': (139, 87, 66, 255),
'lightseagreen': (32, 178, 170, 255),
'lightskyblue': (135, 206, 250, 255),
'lightskyblue1': (176, 226, 255, 255),
'lightskyblue2': (164, 211, 238, 255),
'lightskyblue3': (141, 182, 205, 255),
'lightskyblue4': (96, 123, 139, 255),
'lightslateblue': (132, 112, 255, 255),
'lightslategray': (119, 136, 153, 255),
'lightslategrey': (119, 136, 153, 255),
'lightsteelblue': (176, 196, 222, 255),
'lightsteelblue1': (202, 225, 255, 255),
'lightsteelblue2': (188, 210, 238, 255),
'lightsteelblue3': (162, 181, 205, 255),
'lightsteelblue4': (110, 123, 139, 255),
'lightyellow': (255, 255, 224, 255),
'lightyellow1': (255, 255, 224, 255),
'lightyellow2': (238, 238, 209, 255),
'lightyellow3': (205, 205, 180, 255),
'lightyellow4': (139, 139, 122, 255),
'limegreen': (50, 205, 50, 255),
'linen': (250, 240, 230, 255),
'magenta': (255, 0, 255, 255),
'magenta1': (255, 0, 255, 255),
'magenta2': (238, 0, 238, 255),
'magenta3': (205, 0, 205, 255),
'magenta4': (139, 0, 139, 255),
'maroon': (176, 48, 96, 255),
'maroon1': (255, 52, 179, 255),
'maroon2': (238, 48, 167, 255),
'maroon3': (205, 41, 144, 255),
'maroon4': (139, 28, 98, 255),
'mediumaquamarine': (102, 205, 170, 255),
'mediumblue': (0, 0, 205, 255),
'mediumorchid': (186, 85, 211, 255),
'mediumorchid1': (224, 102, 255, 255),
'mediumorchid2': (209, 95, 238, 255),
'mediumorchid3': (180, 82, 205, 255),
'mediumorchid4': (122, 55, 139, 255),
'mediumpurple': (147, 112, 219, 255),
'mediumpurple1': (171, 130, 255, 255),
'mediumpurple2': (159, 121, 238, 255),
'mediumpurple3': (137, 104, 205, 255),
'mediumpurple4': (93, 71, 139, 255),
'mediumseagreen': (60, 179, 113, 255),
'mediumslateblue': (123, 104, 238, 255),
'mediumspringgreen': (0, 250, 154, 255),
'mediumturquoise': (72, 209, 204, 255),
'mediumvioletred': (199, 21, 133, 255),
'midnightblue': (25, 25, 112, 255),
'mintcream': (245, 255, 250, 255),
'mistyrose': (255, 228, 225, 255),
'mistyrose1': (255, 228, 225, 255),
'mistyrose2': (238, 213, 210, 255),
'mistyrose3': (205, 183, 181, 255),
'mistyrose4': (139, 125, 123, 255),
'moccasin': (255, 228, 181, 255),
'navajowhite': (255, 222, 173, 255),
'navajowhite1': (255, 222, 173, 255),
'navajowhite2': (238, 207, 161, 255),
'navajowhite3': (205, 179, 139, 255),
'navajowhite4': (139, 121, 94, 255),
'navy': (0, 0, 128, 255),
'navyblue': (0, 0, 128, 255),
'oldlace': (253, 245, 230, 255),
'olivedrab': (107, 142, 35, 255),
'olivedrab1': (192, 255, 62, 255),
'olivedrab2': (179, 238, 58, 255),
'olivedrab3': (154, 205, 50, 255),
'olivedrab4': (105, 139, 34, 255),
'orange': (255, 165, 0, 255),
'orange1': (255, 165, 0, 255),
'orange2': (238, 154, 0, 255),
'orange3': (205, 133, 0, 255),
'orange4': (139, 90, 0, 255),
'orangered': (255, 69, 0, 255),
'orangered1': (255, 69, 0, 255),
'orangered2': (238, 64, 0, 255),
'orangered3': (205, 55, 0, 255),
'orangered4': (139, 37, 0, 255),
'orchid': (218, 112, 214, 255),
'orchid1': (255, 131, 250, 255),
'orchid2': (238, 122, 233, 255),
'orchid3': (205, 105, 201, 255),
'orchid4': (139, 71, 137, 255),
'palegoldenrod': (238, 232, 170, 255),
'palegreen': (152, 251, 152, 255),
'palegreen1': (154, 255, 154, 255),
'palegreen2': (144, 238, 144, 255),
'palegreen3': (124, 205, 124, 255),
'palegreen4': (84, 139, 84, 255),
'paleturquoise': (175, 238, 238, 255),
'paleturquoise1': (187, 255, 255, 255),
'paleturquoise2': (174, 238, 238, 255),
'paleturquoise3': (150, 205, 205, 255),
'paleturquoise4': (102, 139, 139, 255),
'palevioletred': (219, 112, 147, 255),
'palevioletred1': (255, 130, 171, 255),
'palevioletred2': (238, 121, 159, 255),
'palevioletred3': (205, 104, 137, 255),
'palevioletred4': (139, 71, 93, 255),
'papayawhip': (255, 239, 213, 255),
'peachpuff': (255, 218, 185, 255),
'peachpuff1': (255, 218, 185, 255),
'peachpuff2': (238, 203, 173, 255),
'peachpuff3': (205, 175, 149, 255),
'peachpuff4': (139, 119, 101, 255),
'peru': (205, 133, 63, 255),
'pink': (255, 192, 203, 255),
'pink1': (255, 181, 197, 255),
'pink2': (238, 169, 184, 255),
'pink3': (205, 145, 158, 255),
'pink4': (139, 99, 108, 255),
'plum': (221, 160, 221, 255),
'plum1': (255, 187, 255, 255),
'plum2': (238, 174, 238, 255),
'plum3': (205, 150, 205, 255),
'plum4': (139, 102, 139, 255),
'powderblue': (176, 224, 230, 255),
'purple': (160, 32, 240, 255),
'purple1': (155, 48, 255, 255),
'purple2': (145, 44, 238, 255),
'purple3': (125, 38, 205, 255),
'purple4': (85, 26, 139, 255),
'red': (255, 0, 0, 255),
'red1': (255, 0, 0, 255),
'red2': (238, 0, 0, 255),
'red3': (205, 0, 0, 255),
'red4': (139, 0, 0, 255),
'rosybrown': (188, 143, 143, 255),
'rosybrown1': (255, 193, 193, 255),
'rosybrown2': (238, 180, 180, 255),
'rosybrown3': (205, 155, 155, 255),
'rosybrown4': (139, 105, 105, 255),
'royalblue': (65, 105, 225, 255),
'royalblue1': (72, 118, 255, 255),
'royalblue2': (67, 110, 238, 255),
'royalblue3': (58, 95, 205, 255),
'royalblue4': (39, 64, 139, 255),
'saddlebrown': (139, 69, 19, 255),
'salmon': (250, 128, 114, 255),
'salmon1': (255, 140, 105, 255),
'salmon2': (238, 130, 98, 255),
'salmon3': (205, 112, 84, 255),
'salmon4': (139, 76, 57, 255),
'sandybrown': (244, 164, 96, 255),
'seagreen': (46, 139, 87, 255),
'seagreen1': (84, 255, 159, 255),
'seagreen2': (78, 238, 148, 255),
'seagreen3': (67, 205, 128, 255),
'seagreen4': (46, 139, 87, 255),
'seashell': (255, 245, 238, 255),
'seashell1': (255, 245, 238, 255),
'seashell2': (238, 229, 222, 255),
'seashell3': (205, 197, 191, 255),
'seashell4': (139, 134, 130, 255),
'sienna': (160, 82, 45, 255),
'sienna1': (255, 130, 71, 255),
'sienna2': (238, 121, 66, 255),
'sienna3': (205, 104, 57, 255),
'sienna4': (139, 71, 38, 255),
'skyblue': (135, 206, 235, 255),
'skyblue1': (135, 206, 255, 255),
'skyblue2': (126, 192, 238, 255),
'skyblue3': (108, 166, 205, 255),
'skyblue4': (74, 112, 139, 255),
'slateblue': (106, 90, 205, 255),
'slateblue1': (131, 111, 255, 255),
'slateblue2': (122, 103, 238, 255),
'slateblue3': (105, 89, 205, 255),
'slateblue4': (71, 60, 139, 255),
'slategray': (112, 128, 144, 255),
'slategray1': (198, 226, 255, 255),
'slategray2': (185, 211, 238, 255),
'slategray3': (159, 182, 205, 255),
'slategray4': (108, 123, 139, 255),
'slategrey': (112, 128, 144, 255),
'snow': (255, 250, 250, 255),
'snow1': (255, 250, 250, 255),
'snow2': (238, 233, 233, 255),
'snow3': (205, 201, 201, 255),
'snow4': (139, 137, 137, 255),
'springgreen': (0, 255, 127, 255),
'springgreen1': (0, 255, 127, 255),
'springgreen2': (0, 238, 118, 255),
'springgreen3': (0, 205, 102, 255),
'springgreen4': (0, 139, 69, 255),
'steelblue': (70, 130, 180, 255),
'steelblue1': (99, 184, 255, 255),
'steelblue2': (92, 172, 238, 255),
'steelblue3': (79, 148, 205, 255),
'steelblue4': (54, 100, 139, 255),
'tan': (210, 180, 140, 255),
'tan1': (255, 165, 79, 255),
'tan2': (238, 154, 73, 255),
'tan3': (205, 133, 63, 255),
'tan4': (139, 90, 43, 255),
'thistle': (216, 191, 216, 255),
'thistle1': (255, 225, 255, 255),
'thistle2': (238, 210, 238, 255),
'thistle3': (205, 181, 205, 255),
'thistle4': (139, 123, 139, 255),
'tomato': (255, 99, 71, 255),
'tomato1': (255, 99, 71, 255),
'tomato2': (238, 92, 66, 255),
'tomato3': (205, 79, 57, 255),
'tomato4': (139, 54, 38, 255),
'turquoise': (64, 224, 208, 255),
'turquoise1': (0, 245, 255, 255),
'turquoise2': (0, 229, 238, 255),
'turquoise3': (0, 197, 205, 255),
'turquoise4': (0, 134, 139, 255),
'violet': (238, 130, 238, 255),
'violetred': (208, 32, 144, 255),
'violetred1': (255, 62, 150, 255),
'violetred2': (238, 58, 140, 255),
'violetred3': (205, 50, 120, 255),
'violetred4': (139, 34, 82, 255),
'wheat': (245, 222, 179, 255),
'wheat1': (255, 231, 186, 255),
'wheat2': (238, 216, 174, 255),
'wheat3': (205, 186, 150, 255),
'wheat4': (139, 126, 102, 255),
'white': (255, 255, 255, 255),
'whitesmoke': (245, 245, 245, 255),
'yellow': (255, 255, 0, 255),
'yellow1': (255, 255, 0, 255),
'yellow2': (238, 238, 0, 255),
'yellow3': (205, 205, 0, 255),
'yellow4': (139, 139, 0, 255),
'yellowgreen': (154, 205, 50, 255)}
>>>
[/code]
2020/03/05 21:36 2020/03/05 21:36
Posted
Filed under 개발/그외
{
    "files.autoSave""afterDelay",
    "editor.fontSize"20,
    "editor.fontFamily""Inconsolata, D2Coding",
    "editor.renderWhitespace""boundary",
    "editor.wordWrap""on",
    "editor.renderIndentGuides"true,
    "editor.wrappingIndent""indent",
    "editor.rulers": [
        100,
        120
    ],
    "editor.cursorBlinking""phase",
    "editor.suggestSelection""first",
    "vsintellicode.modify.editor.suggestSelection""automaticallyOverrodeDefaultValue",
    "editor.formatOnSave"true,
    "explorer.confirmDelete"false,
    "workbench.statusBar.visible"true,
    "workbench.activityBar.visible"true,
    "git.ignoreMissingGitWarning"true,
    "git.autofetch"true,
    "git.confirmSync"false,
    "C_Cpp.updateChannel""Insiders",
    "C_Cpp.default.cppStandard""c++14",
    "C_Cpp.default.cStandard""c11",
    "python.formatting.provider""black",
    "python.jediEnabled"false,
    "python.linting.pylintEnabled"false,
    "python.linting.pylintPath""C:\\Users\\cliea\\AppData\\Local\\Programs\\Python\\Python38\\Scripts\\pylint.exe",
    "python.pythonPath""C:\\Users\\cliea\\AppData\\Local\\Programs\\Python\\Python38\\python.exe",
    "terminal.integrated.shell.windows""C:\\Windows\\System32\\cmd.exe",
    "code-runner.runInTerminal"true,
    "code-runner.executorMap": {
        "javascript""node",
        "php""php",
        "python""$pythonPath -u $fullFileName",
        "perl""perl",
        "ruby""ruby",
        "go""go run",
        "html""\"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe\"",
        "java""cd $dir && javac $fileName && java $fileNameWithoutExt",
        "c""cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "cpp""cd $dir && g++ -std=c++14 $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt"
    },
}
2020/02/29 11:46 2020/02/29 11:46
Posted
Filed under 개발/그외
* Android Studio [Link](http://developer.android.com/studio/?hl=ko) * 안드로이드 앱 개발 IDE * Xcode [Link](http://apps.apple.com/kr/app/xcode/id497799835) * 애플 앱 개발 IDE * Visual Studio Code [Link](http://code.visualstudio.com/download) * 범용 에디터 * Google Chrome [Link](http://www.google.com/chrome/) * 크롬 * Firefox [Link](http://www.mozilla.org/ko/firefox/mac/) * 파이어폭스 * Microsoft Remote Desktop 10 [Link](http://apps.apple.com/kr/app/microsoft-remote-desktop-10/id1295203466) * 마소 리모트 데스크톱 * TeamViewer [Link](http://www.teamviewer.com/ko/download/mac-os/) * 팀뷰어 * VNC Viewer [Link](http://www.realvnc.com/en/connect/download/viewer/macos/) * VNC 뷰어 * IINA [Link](http://iina.io/) * 동영상 플레이어 * Pine Player [Link](http://apps.apple.com/kr/app/pine-player/id1112075769) * 음악 플레이어 * XnView MP [Link](http://www.xnview.com/en/xnviewmp/#downloads) * 이미지 뷰어 * Itsycal [Link](https://www.mowglii.com/itsycal/) * 상태바에 캘린더 표시 * Battery Monitor: Health, Info [Link](http://apps.apple.com/kr/app/battery-monitor-health-info/id836505650) * 배터리 모니터 * iGlance [Link](http://github.com/iglance/iGlance) * 시스템 모니터 * NetSpot [Link](http://www.netspotapp.com/netspotpro.html) * 와이파이 모니터 * JazzUp http://www.irradiatedsoftware.com/labs/) * 키보드 소리효과 추가 * Scroll Reverser [Link](https://pilotmoon.com/scrollreverser/) * 마우스 트랙패드 스크롤 반대화 * Spectacle [Link](http://www.spectacleapp.com/) * 창 정렬 * The Unarchiver [Link](http://apps.apple.com/kr/app/the-unarchiver/id425424353) * 압축파일 관리 * Synology Drive Client [Link](http://www.synology.com/ko-kr/support/download) * 시놀로지 동기화 * 한컴오피스 한글 2014 VP 뷰어 [Link](http://apps.apple.com/kr/app/hancom-office-hanword-viewer/id416746898?mt=12) * 한글뷰어 * Zotero [Link](http://www.zotero.org/download/) * 서지관리 * Logitech Options [Link](http://www.logitech.com/ko-kr/product/options) * 로지텍 주변기기 드라이버 * 카카오톡 [Link](http://apps.apple.com/kr/app/%EC%B9%B4%EC%B9%B4%EC%98%A4%ED%86%A1/id869223134) * 카카오톡
2020/02/17 23:01 2020/02/17 23:01
Posted
Filed under 개발/Linux
* 다음 웹페이지를 보고 따라해보면서 마지막까지 트러블 없이 완료. 나에게 맞게 명령을 수정하면서 수행했던 내용을 기록하는 의미에서 포스팅한다.
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

[code]
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"
[/code]

* 백엔드 인스톨 검증
$ 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

[code]
{
    "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"]
}
[/code]


[타이가 이벤트 세팅]
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

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

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


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

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

[code]
#!/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
[/code]

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

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

[code]
[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
[/code]

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

[code]
[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
[/code]

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


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

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

[code]
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;
    }
}
[/code]


* 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

[code]
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;
    }
}
[/code]


* 기존의 심볼릭링크를 삭제하고 새로운 파일에 대한 심볼릭링크를 작성한다
$ 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

[code]
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;
    }
}
[/code]


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


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

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

[code]
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"
[/code]


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

[code]
{
    "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
}
[/code]


* 슈퍼바이저를 재시작하면 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

[code]
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"
[/code]


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


[업데이트]
* taiga 유저로그인
$ sudo su taiga

* 프론트엔드 업데이트
$ cd ~/taiga-front-dist
$ git checkout stable
$ git pull

* 백엔드 업데이트
$ cd ~/taiga-back
$ git checkout stable
$ git pull

* 백엔드 파이썬패키지 업데이트
$ cd ~
$ source taiga-back_env/bin/activate
$ cd taiga-back
$ pip install -r requirements.txt

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

* 프로세스 매니저 리셋
$ sudo systemctl restart supervisor.service
$ sudo systemctl restart nginx.service
2020/01/13 19:41 2020/01/13 19:41
Posted
Filed under 개발/그외
★: 읽을가치 있음
★★: 소장가치 있음


[응용소프트웨어 개론]

컴퓨팅 사고 :소프트웨어를 통한 문제해결 / 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
Posted
Filed under 개발/강의


이 강의에서는 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
Posted
Filed under 개발/강의


이 강좌에서는 애플의 SpriteKit이라는 게임엔진을 배우고, 학습한 내용으로 직접 게임을 만들면서 최종적으로 짧은 슈팅게임을 완성합니다.
이 편에서는 보스의 미사일패턴을 만드는 법에 대해 설명합니다. 또한 함수 오버로딩에 대해서도 설명합니다.
 
강의에 사용된 게임의 소스코드는 다음 저장소에서 확인하실 수 있습니다.
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/10/19 19:00 2019/10/19 19:00
Posted
Filed under 개발/강의


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

이 강좌에서는 애플의 SpriteKit이라는 게임엔진을 배우고, 학습한 내용으로 직접 게임을 만들면서 최종적으로 짧은 슈팅게임을 완성합니다. 코딩언어로는 Apple에서 개발한 Swift의 5.0 버전을 사용합니다.

각 챕터에서 기능을 구현하는 데 필요한 이론과 문법만을 알기쉽게 설명하고, 바로 코딩하여 게임에 적용하는 방법으로 강의를 진행합니다. 각 강의 이름에 게임에서 사용할 핵심 기술을 기술하였습니다.걱정하지 마세요! 이 강의를 수강하면서 Swift의 모든 문법을 알지 못하더라도, 게임엔진의 사용법을 잘 모르더라도 게임을 만들 수 있다는 것을 알게 될 것입니다.


강좌는 다음과 같이 구성되어 있습니다.
* 기초지식 설명
샘플게임 소개
게임엔진 설명 (SpriteKit)
Xcode 프로젝트 기본 셋업하기 (Build and Version Number)

* 게임배경 만들기
게임 씬 만들기 (SKScene)
움직이는 별무리 배치하기 (Particle Emitter)
날아오는 운석 만들기 (Sprite Atlas, SKAction, Timer)

* 게임 알고리즘 구성하기
플레이어 셋업하기 (Optional)
잡졸 비행기 만들기
추진체 효과 내기 (SKEffectNode)
물리효과 구현하기 (Physics Simulation)
충돌시 피탄효과 구현하기 (SKCameraNode)
헤드업 디스플레이 구현하기(SKNode, SKLabelNode)
보스 셋업하기
스테이트머신으로 보스 관리하기 (State Machine)
보스 미사일 패턴 만들기 (Missile Pattern, Function Overloading)
아이템 셋업하기 (enumerateChildNode, Counter Timer)
게임흐름 처리하기 (Scene Transition)

* 게임 더 꾸미기
사운드 설정하기 (SKAudioNode)
앱 아이콘과 런치스크린 설정하기 (App Icon Generator)
구글 애드몹으로 배너 표시하기 (CocoaPods, Google Admob Banner Ads)
게임속에서 보상형광고 사용하기 (Google Admob Rewarded Video Ads)


강의는 Udemy와 인프런 두 군데에서 보실 수 있습니다.
Udemy는 다음 링크로 들어오시면 10% 할인된 가격으로 수강하실 수 있습니다.
https://www.udemy.com/course/swift5-spritekit-ios-2d-shooting-game/?couponCode=UDEMYSPRITEKIT

인프런은 10월 8일까지 10% 할인을 하고 있으니 관심 주시면 정말 감사하겠습니다.
https://www.inflearn.com/course/Swift-SpriteKit-iOS-%EC%8A%88%ED%8C%85%EA%B2%8C%EC%9E%84
2019/10/06 16:16 2019/10/06 16:16
Posted
Filed under 개발/강의


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

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

이 강좌에서는 애플의 SpriteKit이라는 게임엔진을 배우고, 학습한 내용으로 직접 게임을 만들면서 최종적으로 짧은 슈팅게임을 완성합니다. 코딩언어로는 Apple에서 개발한 Swift의 5.0 버전을 사용합니다.

각 챕터에서 기능을 구현하는 데 필요한 이론과 문법만을 알기쉽게 설명하고, 바로 코딩하여 게임에 적용하는 방법으로 강의를 진행합니다. 각 강의 이름에 게임에서 사용할 핵심 기술을 기술하였습니다.
걱정하지 마세요! 이 강좌를 수강하면서 Swift의 모든 문법을 알지 못하더라도, 게임엔진의 사용법을 잘 모르더라도 게임을 만들 수 있다는 것을 알게 될 것입니다.

강좌는 다음과 같이 구성되어 있습니다.

  • 기초지식 설명

    • 샘플게임 소개
    • 게임엔진 설명 (SpriteKit)
    • Xcode 프로젝트 기본 셋업하기 (Build and Version Number)
  • 게임배경 만들기

    • 게임 씬 만들기 (SKScene)
    • 움직이는 별무리 배치하기 (Particle Emitter)
    • 날아오는 운석 만들기 (Sprite Atlas, SKAction, Timer)
  • 게임 알고리즘 구성하기

    • 플레이어 셋업하기 (Optional)
    • 잡졸 비행기 만들기
    • 추진체 효과 내기 (SKEffectNode)
    • 물리효과 구현하기 (Physics Simulation)
    • 충돌시 피탄효과 구현하기 (SKCameraNode)
    • 헤드업 디스플레이 구현하기(SKNode, SKLabelNode)
    • 보스 셋업하기
    • 스테이트머신으로 보스 관리하기 (State Machine)
    • 보스 미사일 패턴 만들기 (Missile Pattern, Function Overloading)
    • 아이템 셋업하기 (enumerateChildNode, Counter Timer)
    • 게임흐름 처리하기 (Scene Transition)
  • 게임 더 꾸미기

    • 사운드 설정하기 (SKAudioNode)
    • 앱 아이콘과 런치스크린 설정하기 (App Icon Generator)
    • 구글 애드몹으로 배너 표시하기 (CocoaPods, Google Admob Banner Ads)
    • 게임속에서 보상형광고 사용하기 (Google Admob Rewarded Video Ads)

이 코드를 확장시킨 게임은 애플 앱스토어에서 다운로드할 수 있습니다.
Space Piyongpiyong Apple Appstore
https://apps.apple.com/app/space-piyongpiyong/id1462255763

2019/10/02 15:12 2019/10/02 15:12
Posted
Filed under 개발/강의


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

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

이 강좌에서는 애플의 SpriteKit이라는 게임엔진을 배우고, 학습한 내용으로 직접 게임을 만들면서 최종적으로 짧은 슈팅게임을 완성합니다. 코딩언어로는 Apple에서 개발한 Swift의 5.0 버전을 사용합니다.

각 챕터에서 기능을 구현하는 데 필요한 이론과 문법만을 알기쉽게 설명하고, 바로 코딩하여 게임에 적용하는 방법으로 강의를 진행합니다. 각 강의 이름에 게임에서 사용할 핵심 기술을 기술하였습니다.
걱정하지 마세요! 이 강좌를 수강하면서 Swift의 모든 문법을 알지 못하더라도, 게임엔진의 사용법을 잘 모르더라도 게임을 만들 수 있다는 것을 알게 될 것입니다.

강좌는 다음과 같이 구성되어 있습니다.

  • 기초지식 설명

    • 샘플게임 소개
    • 게임엔진 설명 (SpriteKit)
    • Xcode 프로젝트 기본 셋업하기 (Build and Version Number)
  • 게임배경 만들기

    • 게임 씬 만들기 (SKScene)
    • 움직이는 별무리 배치하기 (Particle Emitter)
    • 날아오는 운석 만들기 (Sprite Atlas, SKAction, Timer)
  • 게임 알고리즘 구성하기

    • 플레이어 셋업하기 (Optional)
    • 잡졸 비행기 만들기
    • 추진체 효과 내기 (SKEffectNode)
    • 물리효과 구현하기 (Physics Simulation)
    • 충돌시 피탄효과 구현하기 (SKCameraNode)
    • 헤드업 디스플레이 구현하기(SKNode, SKLabelNode)
    • 보스 셋업하기
    • 스테이트머신으로 보스 관리하기 (State Machine)
    • 보스 미사일 패턴 만들기 (Missile Pattern, Function Overloading)
    • 아이템 셋업하기 (enumerateChildNode, Counter Timer)
    • 게임흐름 처리하기 (Scene Transition)
  • 게임 더 꾸미기

    • 사운드 설정하기 (SKAudioNode)
    • 앱 아이콘과 런치스크린 설정하기 (App Icon Generator)
    • 구글 애드몹으로 배너 표시하기 (CocoaPods, Google Admob Banner Ads)
    • 게임속에서 보상형광고 사용하기 (Google Admob Rewarded Video Ads)

이 코드를 확장시킨 게임은 애플 앱스토어에서 다운로드할 수 있습니다.
Space Piyongpiyong Apple Appstore
https://apps.apple.com/app/space-piyongpiyong/id1462255763

2019/10/02 15:10 2019/10/02 15:10
Posted
Filed under 개발/강의



이 강좌에서는 애플의 SpriteKit이라는 게임엔진을 배우고, 학습한 내용으로 직접 게임을 만들면서 최종적으로 짧은 슈팅게임을 완성합니다. 코딩언어로는 Apple에서 개발한 Swift의 5.0 버전을 사용합니다.

각 챕터에서 기능을 구현하는 데 필요한 이론과 문법만을 알기쉽게 설명하고, 바로 코딩하여 게임에 적용하는 방법으로 강의를 진행합니다. 각 강의 이름에 게임에서 사용할 핵심 기술을 기술하였습니다.
걱정하지 마세요! 이 강좌를 수강하면서 Swift의 모든 문법을 알지 못하더라도, 게임엔진의 사용법을 잘 모르더라도 게임을 만들 수 있다는 것을 알게 될 것입니다.


강좌는 다음과 같이 구성되어 있습니다.
* 기초지식 설명
샘플게임 소개
게임엔진 설명 (SpriteKit)
Xcode 프로젝트 기본 셋업하기 (Build and Version Number)

* 게임배경 만들기
게임 씬 만들기 (SKScene)
움직이는 별무리 배치하기 (Particle Emitter)
날아오는 운석 만들기 (Sprite Atlas, SKAction, Timer)

* 게임 알고리즘 구성하기
플레이어 셋업하기 (Optional)
잡졸 비행기 만들기
추진체 효과 내기 (SKEffectNode)
물리효과 구현하기 (Physics Simulation)
충돌시 피탄효과 구현하기 (SKCameraNode)
헤드업 디스플레이 구현하기(SKNode, SKLabelNode)
보스 셋업하기
스테이트머신으로 보스 관리하기 (State Machine)
보스 미사일 패턴 만들기 (Missile Pattern, Function Overloading)
아이템 셋업하기 (enumerateChildNode, Counter Timer)
게임흐름 처리하기 (Scene Transition)

* 게임 더 꾸미기
사운드 설정하기 (SKAudioNode)
앱 아이콘과 런치스크린 설정하기 (App Icon Generator)
구글 애드몹으로 배너 표시하기 (CocoaPods, Google Admob Banner Ads)
게임속에서 보상형광고 사용하기 (Google Admob Rewarded Video Ads)


강의는 Udemy와 인프런 두 군데에서 보실 수 있습니다.
Udemy는 다음 링크로 들어오시면 10% 할인된 가격으로 수강하실 수 있습니다.
https://www.udemy.com/course/swift5-spritekit-ios-2d-shooting-game/?couponCode=UDEMYSPRITEKIT

인프런은 10월 8일까지 10% 할인을 하고 있으니 관심 주시면 정말 감사하겠습니다.
https://www.inflearn.com/course/Swift-SpriteKit-iOS-%EC%8A%88%ED%8C%85%EA%B2%8C%EC%9E%84#

새 강의 출시기념으로 인프런에 출시한 기존 강의인 “Swift로 iOS 2D 아케이드 게임 만들기”도 20% 할인합니다. 쿠폰번호 5-5a2d96652ed4로 강의를 등록하세요.
https://www.inflearn.com/course/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8-iOS-%EA%B2%8C%EC%9E%84%EA%B0%9C%EB%B0%9C#

강의에 사용한 모든 코드는 강사의 Github에서도 공개하고 있습니다. 실습에 필요한 에셋은 각 강의에서 개별적으로 제공됩니다.
https://github.com/cliearl/SKSpaceShooting


이 코드를 확장시킨 게임은 애플 앱스토어에서 다운로드할 수 있습니다.
Space Piyongpiyong Apple Appstore
https://apps.apple.com/app/space-piyongpiyong/id1462255763
2019/09/25 19:20 2019/09/25 19:20
Posted
Filed under 개발/iOS
* 20 Xcode Tips & Tricks - Updated for Xcode 9 - 2017
https://www.youtube.com/watch?v=38LNXk_oTak&t=308s
- 1. Visual debugging: 앱을 실행시키고 있는 상태에서 디버깅 창의 작은사각+큰사각+작은사각 형태의 아이콘을 클릭하면 층구조의 스토리보드를 볼 수 있다.
- 4. cmd+0: 왼쪽 상태창 숨김. cmd+opt+0: 오른쪽 상태창 숨김
- 5. Automatic indentation: 영역지정후 ctl+I
- 6,7. 컴포넌트 배치나 연결에 View hierachy를 사용하라
- 10. 폰트크기조정: cmd++ or cmd--
- 11. 리네이밍: 영역지정후 오른쪽버튼 -> refactor -> rename 단축키는 cmd+ctl+e
- 12. 리팩토링: 영역지정후 오른쪽버튼 -> refactor -> extract method
- 13. cmd 누른 상태에서 브라킷에 가져다대면 시작 브라킷까지의 영역을 보여줌
- 15. //MARK: - Example 을 쓰면 아웃라인에서 함수를 구분해줌
- 16. 주석 on off: cmd+/
- 17. cmd+shift xcode 전용 스포트라이트 창이 열림
- 18. 커스텀 definition추가: Xcode에서 커스텀 함수로 추가하고 싶은 영역을 선택해서 함수 스니펫에 추가하면 단축키로 함수를 추가 가능.
- 19. 함수를 선택 -> 오른쪽 클릭 -> jump to definition 으로 원래 함수정의 위치로 날라감



* 10 Xcode Tips & Tricks - Xcode 10
https://www.youtube.com/watch?v=1uVnWbygg_c
- 1. 스토리보드 리팩토링: Editor -> Refactor to Storyboard
- 2. Build time Track: defaults write com.apple.dt.Xcode ShowBuildOperationDuration -bool YES 를 터미널에 입력
- 7. 멀티라인 커서 에디팅: ctrl + shift + 클릭
- 8. vertical selection: option + 드래그
- 9. 스토리보드 프리뷰: assistant editor -> Manual -> preview
- 10. #warning("워닝메시지"), #error("에러메시지")를 붙여서 반드시 수정하도록 notice를 줄 수 있다.
2019/09/24 18:54 2019/09/24 18:54
Posted
Filed under 개발/그외
2019 카카오 신입 공채 1차 코딩 테스트 문제 해설
http://tech.kakao.com/2018/09/21/kakao-blind-recruitment-for2019-round-1/


1. 오픈채팅방
https://www.welcomekakao.com/learn/courses/30/lessons/42888

2. 실패율
https://www.welcomekakao.com/learn/courses/30/lessons/42889

3. 후보키
https://www.welcomekakao.com/learn/courses/30/lessons/42890

4. 무지의 먹방 라이브
https://www.welcomekakao.com/learn/courses/30/lessons/42891

5. 길 찾기 게임
https://www.welcomekakao.com/learn/courses/30/lessons/42892

6. 매칭 점수
https://www.welcomekakao.com/learn/courses/30/lessons/42893

7. 블록 게임
https://www.welcomekakao.com/learn/courses/30/lessons/42894



2019/09/19 22:31 2019/09/19 22:31
Posted
Filed under 개발/게임
## 캐릭터 * ゆるドラシル * [http://yurudora.com/tkool/](http://yurudora.com/tkool/) * 立ち絵, 캐릭터 애니메이션, 사운드 * 수정가능, 상용가능, 크레딧필요 * 王国興亡記 * [http://makapri.web.fc2.com/top.html](http://makapri.web.fc2.com/top.html) * 캐릭터, 몬스터 * 수정가능, 상용가능, 크레딧필요, 보고필요 * ぴぽや倉庫 * [http://pipoya.net/sozai/](http://pipoya.net/sozai/) * 캐릭터, 몬스터, 이펙트 * 수정가능, 상용가능, 크레딧불필요 * モンスター&マテリアルズ * [http://darts-x.sakura.ne.jp/m/](http://darts-x.sakura.ne.jp/m/) * 캐릭터, 몬스터 * 수정불가, 상용가능, 크레딧필요 * 星宝転生ジュエルセイバー * [http://www.jewel-s.jp/download/](http://www.jewel-s.jp/download/) * 캐릭터, 스크립트 * 수정자유, 상용가능, 크레딧필요 * 三日月アルペジオ * [http://roughsketch.en-grey.com/](http://roughsketch.en-grey.com/) * 立ち絵 * 수정가능, 상용가능, 크레딧불필요 * Material World * [http://mwhidesp.konjiki.jp/new_m.htm](http://mwhidesp.konjiki.jp/new_m.htm) * 레트로풍 몬스터 * 수정자유, 상용가능, 크레딧불필요 * エトリエ * [http://etolier.webcrow.jp/material/menu.html](http://etolier.webcrow.jp/material/menu.html) * 캐릭터, 몬스터 * 수정가능, 상용가능, 크레딧불필요 * GameArtGuppy * [http://www.gameartguppy.com/](http://www.gameartguppy.com/) * 캐릭터, 오브젝트 * 수정가능, 상용가능, 크레딧필요 * itch.io * [http://itch.io/game-assets/free](http://itch.io/game-assets/free) * 배경, 캐릭터, 오브젝트 세트 * 작품마다 다름 * OpenGameArt.org * [http://opengameart.org/](http://opengameart.org/) * 작품마다 다름 * Kenney * [http://www.kenney.nl/assets](http://www.kenney.nl/assets) * CC0 1.0 Universal * Sprite Database * [http://spritedatabase.net/news](http://spritedatabase.net/news) * 캐릭터, 오브젝트 * 상용불가 * The Spriters Resources * [http://www.spriters-resource.com/](http://www.spriters-resource.com/) * 캐릭터, 오브젝트 * 상용불가 * 16 Sites to Download the Best Free Game Graphics in 2019! * [http://felgo.com/game-resources/16-sites-featuring-free-game-graphics](http://felgo.com/game-resources/16-sites-featuring-free-game-graphics) --- ## 배경 * CLOSET * [http://sites.google.com/site/closetvx/](http://sites.google.com/site/closetvx/) * 배경 * 수정가능, 상용가능, 크레딧필요 * あやえも研究所 * 배경 * [http://ayaemo.skr.jp/materials.html](http://ayaemo.skr.jp/materials.html) * 수정가능, 상용가능, 크레딧불필요 * きまぐれアフター * [http://k-after.at.webry.info/](http://k-after.at.webry.info/) * 배경 * 수정가능, 상용가능, 크레딧불필요 * 背景写真補完の会 * [http://masato.ciao.jp/haikei/furemu.html](http://masato.ciao.jp/haikei/furemu.html) * 배경 * 수정불가, 상용가능, 크레딧불필요 * World Machine * [http://www.world-machine.com/](http://www.world-machine.com/) * 3D 배경 --- ## 아이콘 * Font Awesome * [http://fontawesome.com/](http://fontawesome.com/) * CC BY 4.0 * Google Material Icons * [http://google.github.io/material-design-icons/](http://google.github.io/material-design-icons/) * [http://material.io/tools/icons/?style=baseline](http://material.io/tools/icons/?style=baseline) * Apache License Version 2.0 * SVG Repo * [http://www.svgrepo.com/](http://www.svgrepo.com/) * 대부분 CC BY 4.0 * FLAT ICON DESIGN * [http://flat-icon-design.com/](http://flat-icon-design.com/) * 색이 입혀져있음 * 수정가능, 상용가능, 크레딧불필요 * ICOOON MONO * [http://icooon-mono.com/](http://icooon-mono.com/) * 수정가능, 사용가능, 크레딧불필요 * ヒューマンピクトグラム2.0 * [http://pictogram2.com/](http://pictogram2.com/) * 사람형태 아이콘 * 수정가능, 상용가능, 크레딧불필요 * Icon-rainbow * [http://free-icon-rainbow.com/](http://free-icon-rainbow.com/) * 수정가능, 상용가능, 크레딧불필요 * Game-icons.net * [http://game-icons.net/tags.html](http://game-icons.net/tags.html) * 게임아이콘 * CC BY 3.0 * SHAREICON.NET * [http://www.shareicon.net/](http://www.shareicon.net/) * 작품마다 다름 * freepik * [http://www.freepik.com/](http://www.freepik.com/) * 수정가능, 상용가능, 크레딧필요 * 商用可で無料!最強のフリーアイコン素材サイト14選 * [http://saruwakakun.com/design/tips/icon](http://saruwakakun.com/design/tips/icon) --- ## 이미지 * いらすとや * [https://www.irasutoya.com/](https://www.irasutoya.com/) * 수정가능, 상용가능, 크레딧 불필요 --- ## 사운드 * itch.io * [http://itch.io/soundtracks/free](http://itch.io/soundtracks/free) * BGM, SE * 작품마다 다름 * freesound * [http://freesound.org/search/?g=1&q=cc0&f=%20license:%22Creative+Commons+0%22](http://freesound.org/search/?g=1&q=cc0&f=%20license:%22Creative+Commons+0%22) * BGM, SE * CC0 * 魔王魂 * [http://maoudamashii.jokersounds.com/](http://maoudamashii.jokersounds.com/) * BGM, SE * 수정가능, 상용가능, 크레딧불필요 * PANICPUMPKIN * [http://pansound.com/panicpumpkin/music/index.html](http://pansound.com/panicpumpkin/music/index.html) * BGM, SE * 수정가능, 상용가능, 크레딧불필요 * DOVA-SYNDROME * [http://dova-s.jp/](http://dova-s.jp/) * BGM, SE * 수정가능, 상용가능, 크레딧불필요 * OtoLogic * [http://otologic.jp/](http://otologic.jp/) * BGM, SE * CC BY 4.0, 크레딧필요 * OPENGAMEART.ORG * [http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=12&sort_by=count&sort_order=DESC](http://opengameart.org/art-search-advanced?keys=&field_art_type_tid%5B%5D=12&sort_by=count&sort_order=DESC) * BGM, SE * 작품마다 다름 * freeSFX * [http://freesfx.co.uk/](http://freesfx.co.uk/) * BGM, SE * 로그인 필요 --- ## BGM Only * Soundcloud * [http://soundcloud.com/search?q=cc0](http://soundcloud.com/search?q=cc0) * BGM * CC0 * SLOS * [http://slos.biz/index.htm](http://slos.biz/index.htm) * BGM * 수정가능, 상용가능, 크레딧필요 * INCOMPETECH * [http://incompetech.com/music](http://incompetech.com/music) * BGM * 대부분 CC3.0 * 甘茶の音楽工房 * [http://amachamusic.chagasi.com/index.html](http://amachamusic.chagasi.com/index.html) * BGM * 수정가능, 상용가능, 크레딧불필요 * 近未来的音楽素材屋3104式 * [http://cyber-rainforce.net/](http://cyber-rainforce.net/) * 근미래틱 BGM * 수정가능, 상용가능, 크레딧불필요 * おとわび和風音楽素材 * [http://otowabi.com/music](http://otowabi.com/music * 일본풍 BGM * 수정가능, 상용가능, 크레딧불필요 --- ## SE Only * 効果音ラボ * [http://soundeffect-lab.info/](http://soundeffect-lab.info/) * SE * 수정가능, 상용가능, 크레딧불필요 * くらげ工匠 * [http://www.kurage-kosho.info/](http://www.kurage-kosho.info/) * SE * 수정가능, 상용가능, 크레딧불필요 * ポケットサウンド * [http://pocket-se.info/](http://pocket-se.info/) * SE * 수정가능, 상용가능, 크레딧필요 * 零式マテリアル * [http://www.zero-matter.com/index.html](http://www.zero-matter.com/index.html) * SE * 수정가능, 상용가능, 크레딧불필요 * あみたろの声素材工房 * [http://www14.big.or.jp/~amiami/happy/voice.html](http://www14.big.or.jp/~amiami/happy/voice.html) * 목소리 * 수정가능, 사용가능, 크레딧필요 * Bfxr. Make sound effects for your games * [http://www.bfxr.net/](http://www.bfxr.net/)
2019/09/16 14:23 2019/09/16 14:23
Posted
Filed under 개발/강의
사용자 삽입 이미지

https://www.inflearn.com/course/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8-iOS-%EA%B2%8C%EC%9E%84%EA%B0%9C%EB%B0%9C

Swift 5.0으로 iOS Flappy Bird 게임 만들기

2014년에 대유행했던 플래피버드 게임을 iOS로 만들어보는 강좌입니다.
Swift 언어로 코딩하지만 언어의 기본지식이 없으셔도 괜찮습니다. 코드의 의미를 가능한 구체적으로 설명하며 코딩합니다.

Swift는 최신 버전인 5.0을 사용하였습니다.
코드를 따라하며 강좌를 모두 수강하고 나면 다음과 같이 멋진 게임이 완성될 것입니다.

13강의 내용까지 적용된 코드를 Github에서 다운로드 받아 자신의 코드와 비교해 보세요

https://github.com/cliearl/SpritekitFlappyBirdLike

준비 사항

  • 최신 버전의 Xcode를 사용할 수 있는 매킨토시 환경
  • 그리고 강의를 끝까지 공부하겠다는 의지!

배우면 할 수 있는 것들

  • SpriteKit의 구조와 사용법을 알게 됩니다
  • iOS의 내장 게임엔진으로 2D 게임을 만들 수 있습니다
  • Swift에 대한 감을 잡을 수 있습니다

수강 대상

  • Swift에 대한 호기심이 있으신 분
  • iOS로 간단한 2D 게임을 만들고 싶은 분

선수 지식

  • 아주 약간의 Swift 문법 지식

 

교육과정

배경지식 알아보기
SpriteKit이란?  13 : 18

게임속 객체 준비하기
씬 만들고 이미지 붙이기  23 : 36
플레이어 애니메이션 만들기  16 : 37
무한한 무대 만들기  14 : 44

게임 알고리즘 구현하기
물리효과 적용하기  43 : 35
스코어 만들기  14 : 03
스테이트머신 도입하기  11 : 59
데미지효과 내기  18 : 06
게임오버  20 : 46
소리 재생하기  10 : 02

게임 더 꾸미기
파티클이미터 사용하기  19 : 54
좀 더 게임같이 다듬기  26 : 11
2019/09/13 22:44 2019/09/13 22:44
Posted
Filed under 개발/그외
문제 해설
https://tech.kakao.com/2017/11/14/kakao-blind-recruitment-round-3/



1. N진수 게임
https://www.welcomekakao.com/learn/courses/30/lessons/17687

2. 압축
https://www.welcomekakao.com/learn/courses/30/lessons/17684

3. 파일명 정렬
https://www.welcomekakao.com/learn/courses/30/lessons/17686

4. 방금 그 곡
https://www.welcomekakao.com/learn/courses/30/lessons/17683

5. 자동완성
https://www.welcomekakao.com/learn/courses/30/lessons/17685

필기 시험
http://tech.kakao.com/files/kakao-blind-recruitment.pdf

2019/09/03 14:43 2019/09/03 14:43
Posted
Filed under 개발/그외
https://programmers.co.kr/learn/courses/18


파트1. 자릿수 더하기 문제
https://programmers.co.kr/learn/courses/18/lessons/1876

파트2. 순열 검사 문제
https://programmers.co.kr/learn/courses/18/lessons/1877

파트3. 나머지 한 점 문제
https://programmers.co.kr/learn/courses/18/lessons/1878

파트4. 가장 큰 정사각형 찾기 문제
https://programmers.co.kr/learn/courses/18/lessons/1879

파트5. 땅따먹기 문제
https://programmers.co.kr/learn/courses/18/lessons/1880

파트6. 스티커 모으기 문제
https://programmers.co.kr/learn/courses/18/lessons/1881

파트7. 단어 퍼즐 문제
https://programmers.co.kr/learn/courses/18/lessons/1882
2019/09/01 11:37 2019/09/01 11:37
Posted
Filed under 개발/그외
Swift로 풀어봤따.


문제 해설
http://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/

1. 비밀지도 (비트연산)
https://www.welcomekakao.com/learn/courses/30/lessons/17681

2. 다트 게임 (정규표현식)
https://www.welcomekakao.com/learn/courses/30/lessons/17682

3. 캐시
https://www.welcomekakao.com/learn/courses/30/lessons/17680

4. 셔틀버스 (문자열 시간변환, 딕셔너리)
https://www.welcomekakao.com/learn/courses/30/lessons/17678

5. 뉴스 클러스터링 (집합, 딕셔너리)
https://www.welcomekakao.com/learn/courses/30/lessons/17677

6. 프렌즈 4블록 (2차원배열, 스왑)
https://www.welcomekakao.com/learn/courses/30/lessons/17679

7. 추석 트래픽 (문자열 시간변환)
https://www.welcomekakao.com/learn/courses/30/lessons/17676


2019/08/30 14:06 2019/08/30 14:06