[도커 컨테이너간 네트워크를 잘 몰라서 생긴 삽질]


- 도커를 사용해서 레드마인 서버를 구축하면서 겪은 상황입니다.


- 아래와 같이 docker-compose 를 이용해 레드마인과 mariadb 를 구축했습니다.


* DB 포트인 3306 과 웹포트인 80, 8080 은 이미 사용중이어서 다른 포트로 매핑했습니다.

  여기서... 오해의 시작이...



version: '3'

services:
redmine_db:
image: mariadb
container_name: redmine_db
restart: always
volumes:
- local_directory/db:/var/lib/mysql
ports:
- 9096:3306
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: redmine
MYSQL_USER: user
MYSQL_PASSWORD: user_password
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
networks:
- default
- redmine_network

redmine_web:
image: redmine
container_name: redmine_web
restart: always
volumes:
- local_directory/themes:/usr/src/redmine/public/themes
- local_directory/plugins:/usr/src/redmine/plugins
- local_directory/files:/usr/src/redmine/files
ports:
- 9090:3000
links:
- redmine_db:mysql
environment:
REDMINE_DB_PORT: 9096
REDMINE_DB_MYSQL: redmine_db
REDMINE_DB_USERNAME: user
REDMINE_DB_PASSWORD: user_password
REDMINE_DB_DATABASE: redmine
REDMINE_DB_ENCODING: utf8
depends_on:
- redmine_db
networks:
- redmine_network

networks:
redmine_network:


- 위와 같이 구성한 뒤 컨테이너를 올렸는데 redmine_web 에서 계속 connection 관련 오류가 납니다.


- 도대체 뭘 잘못한거지... 계정도 제대로 만들어졌고 Heidisql 을 이용해서 host:9096 으로 접속도 제대로 되는걸 확인했지만


  레드마인은 계속 오류로 인해 재시작만 반복하네요.



[결국 원인을 찾음]


* 문제는 바로 이부분..



environment:
REDMINE_DB_PORT: 9096 // DB 컨테이너 3306 포트와 매핑된 호스트 서버 포트 / 틀렸다.. 3306 이 정답.
REDMINE_DB_MYSQL: redmine_db // DB 컨테이너 서비스명


- YAML 파일에 작성되는 항목들은 서비스 이름으로 컨테이너들간 연결이 가능하기 때문에 redmine_web 컨테이너에서


  redmine_db 컨테이너로 접근할 시 외부 호스트 포트 인 9096 포트 으로 접근할게 아니라 기본 3306 포트로 접속해야 됩니다.


 9096 포트는 아예 호스트 서버 외부에서 redmine_db 에 직접 접근할 때 사용됩니다.


- 이전 포스트에서는 기본 포트인 3306, 80, 8080 을 사용해서 몰랐는데.. 이걸 몰라서 이번에 삽질을 좀....







[안드로이드 AVD 에뮬레이터 관련]


- 안드로이드 개발 도중 에뮬레이터로 테스트해보려고 앱을 빌드하는데 제대로 진행이 안됨.



"Waiting for target device to come online"


위 상황일때....



[일반적인 해결법 몇가지]


1. SDK 툴에서 에뮬레이터 관련, USB 드라이버 를 체크 해제 -> 적용 -> 체크 -> 적용 해서 재설치


2. Invalidate cacjes / restart


3. AVD 에뮬레이터 목록에서 해당 에뮬레이터 wipe data


등등 검색하면 꽤 나옵니다.


[제가 해당했던 상황]


- 출처

https://stackoverflow.com/questions/42757928/waiting-for-target-device-to-come-online-in-android-studio-2-3#


Offical answer; > You can't run software that uses another virtualization technology at the same time that you run the accelerated emulator. For example, VirtualBox, VMWare, and Docker currently use a different virtualization technology, so you can't run them at the same time as the accelerated emulator. emulator-acceleration – volkan Apr 12 '17 at 4:53


* 즉 다른 에뮬레이터 또는 가상화 프로그램 (도커 등)이 실행 중 일때는 동시에 사용할 수 없다.

[docker 를 이용해 mysql + redmine 설치]


* docker-compose 사용


(docker-compose-redmine.yaml)



version: '2.1'

services:
redmine:
image: redmine
restart: always
container_name: redmine
ports:
- 3000:3000
environment:
REDMINE_DB_MYSQL: db
REDMINE_DB_PASSWORD: pass
REDMINE_DB_DATABASE: redmine
REDMINE_DB_ENCODING: utf8
depends_on:
db:
condition: service_healthy

db:
image: mysql
restart: always
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: pass
MYSQL_DATABASE: redmine
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci



$ docker-compose -f docker-compose-redmine.yaml up -d


위 상태로 실행하면 redmine 이 실행되었다가 계속 restart 를 반복합니다.


mysql 은 잘 실행되지만 redmine 이 실행 도중 오류가 발생하는 것으로 보이는데..


$ docker logs -f redmine


redmine 로그를 확인해보면 


' Authentication plugin 'caching_sha2_password' cannot be loaded '


위와 같은 오류를 확인할 수 있습니다.


검색 해 본 결과 mysql 버전에 따른 오류라고 하는데요...

(https://stackoverflow.com/questions/49979089/authentication-plugin-caching-sha2-password-cannot-be-loaded-in-circleci-mysql)


그래서 mysql 버전을 5.7 버전으로 지정해서 설치하니까 잘 됩니다.


image: mysql    ->   image: mysql:5.7




version: '2.1'

services:
redmine:
image: redmine
restart: always
container_name: redmine
ports:
- 3000:3000
environment:
REDMINE_DB_MYSQL: db
REDMINE_DB_PASSWORD: pass
REDMINE_DB_DATABASE: redmine
REDMINE_DB_ENCODING: utf8
depends_on:
db:
condition: service_healthy

db:
image: mysql:5.7
restart: always
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: pass
MYSQL_DATABASE: redmine
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci




[추가사항]


혹시나 해서 mysql 대신 mariadb 로 하니까 최신버전이어도 잘 되는듯 합니다.


image: mariadb


(mariadb 만세)


[주사위 던지기용 소스]


* Terrain 태그 = Ground, 큐브가 Ground 에 닿아있을 때만 클릭으로 큐브를 던질 수 있음

* 큐브 inspector 에서 position x,z 값 고정하여 다른 방향으로 움직이지 않고 오직 위아래로만 움직이게끔 만듬



using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class cubeMove : MonoBehaviour {

public int speed = 10;
public bool isJumpping = false;

private Rigidbody rb;
// Use this for initialization
void Start () {
rb = GetComponent<Rigidbody>();
    }
    
    // Update is called once per frame
    void Update () {
moveCube();
}

void moveCube()
{
if (!isJumpping)
{
if (Input.GetMouseButtonDown(0))
{
this.isJumpping = true;
transform.position = new Vector3(50,1,50);
transform.rotation = Quaternion.identity;
rb.AddForce(transform.up * 500);
rb.AddTorque(Random.Range(0,500), Random.Range(0, 500), Random.Range(0, 500));
this.GetComponent<Rigidbody>().velocity = Vector3.up * this.speed;
}
}
}


private void OnCollisionEnter(Collision collision)
{
if (collision.transform.tag == "Ground")
{
this.isJumpping = false;
}
}

}





[GoLang 에서 json 사용하기]


* struct 구조체 선언시 변수명의 첫글자는 반드시 대문자여야 합니다.

* omitempty 입력 시 앞 쉼표 사이에 빈칸은 넣지 않으며 (넣으면 단순 경고 표시 발생)

  설정하게 되면 json 객체를 생성할때 해당 필드에 값이 없을 경우에만 필드를 변환하지 않고 건너뜁니다.

* `json:"-"` 설정 시 해당 필드는 무조건 변환되지 않습니다.



[예제 소스]


package main

import (
    "encoding/json"
    "fmt"
)

// Data is data
type Data struct {
    Name string `json:"Name"`
    Age int `json:"Age"`
    Etc1 string `json:"Etc1,omitempty"`
    Etc2 string `json:"Etc2,omitempty"`
    Temp string `json:"-"`
}

func main() {

    var jobj = Data{Name: "aaa", Age: 19, Etc1: "bbb", Etc2: "", Temp: "1123123"}
    jstrbyte, _ := json.Marshal(jobj)
    fmt.Println("---- jobj")
    fmt.Println(jobj)
    fmt.Println()
    fmt.Println("---- jstrbyte")
    fmt.Println(jstrbyte)
    fmt.Println()
    fmt.Println("---- string(jstrbyte)")
    fmt.Println(string(jstrbyte))
    fmt.Println()

    var jobj2 Data
    err := json.Unmarshal(jstrbyte, &jobj2)
    if err != nil {
        fmt.Println(err.Error())
    }
    fmt.Println("---- jobj2")
    fmt.Println(jobj2)
    fmt.Println()
    fmt.Println("---- jobj2.Name, jobj2.Age, jobj2.Etc1, jobj2.Etc2")
    fmt.Println(jobj2.Name, jobj2.Age, jobj2.Etc1, jobj2.Etc2)
    fmt.Println()

}



[결과]


* "omitempty", "-" : 두 설정 결과


---- jobj
{aaa 19 bbb 1123123}

---- jstrbyte
[123 34 78 97 109 101 ...... 98 98 98 34 125]

---- string(jstrbyte)
{"Name":"aaa","Age":19,"Etc1":"bbb"}

---- jobj2
{aaa 19 bbb }

---- string(jstrbyte)
{"Name":"aaa","Age":19,"Etc1":"bbb"}

---- jobj2.Name, jobj2.Age, jobj2.Etc1, jobj2.Etc2
aaa 19 bbb


[express-ipfilter]

- winston daily log 와 같이 사용할 경우 error 라고 해서 uncaughtException 로그에 남지는 않는다.

- npm install express-ipfilter

- 다른 라우터보다 위에 위치해야 합니다.



var ipfilter = require('express-ipfilter').IpFilter;
var IpDeniedError = require('express-ipfilter').IpDeniedError;

// 차단, 허용할 특정 아이피 목록
var ips = ['192.168.0.10', '192.168.0.11'];

// 범위 사용 예시
// 192.168.0.10 ~ 192.168.0.20 안의 범위와 192.168.0.100 차단 or 허용, 
// var ips = [['192.168.0.10', '192.168.0.20'], '192.168.0.100'];

// ips 목록의 ip들만 허용
app.use(ipfilter(ips, {mode: 'allow'}));

// ips 목록의 ip들 차단
// app.use(ipfilter(ips));

app.use(function(err, req, res, _next) {
    //console.log('Error handler', err);
    res.send('Access Denied');                     // page view 'Access Denied'
    if(err instanceof IpDeniedError){
      res.status(401).end();
    }else{
      res.status(err.status || 500).end();
    }
    // res.render('error', {
    //   message: 'You shall not pass',
    //   error: err
    // });
});

..........

app.get('/', function(req, res){
    res.send('allowed IP');
});


'Programming > Node.js' 카테고리의 다른 글

[Node.js] winston Daily 로그 남기기  (0) 2018.05.21

[Node.js Daily 로그 남기기]


- 인터넷에서 검색해서 적용해 봤는데 모듈이 업데이트 되면서 약간 바뀌었는지 filename , datePattern 부분이 제대로 적용이 되지 않았음.

- 나머지 부분은 다른게 없고 filename , datePattern 두 부분만 바뀌었음.


var winston = require('winston'); // 로그 처리 모듈 var winstonDaily = require('winston-daily-rotate-file'); // 로그 일별 처리 모듈

// Date Format 선택
// moment 모듈 설치 필요
function timeStampFormat() {
    return moment().format('YYYY-MM-DD HH:mm:ss.SSS ZZ'); // '2018-01-01 12:12:12.500 +0900'
};

// 그냥 
const tsFormat = () => (new Date()).toLocaleTimeString();      // '2018-01-01'

// 로그 설정
var logger = new (winston.Logger)({
    transports: [
        new (winstonDaily)({                                              // 로그 파일 설정
                name: 'info-file',
                filename: './logs/app_%DATE%.log',                  // 파일 이름 (아래 설정한 날짜 형식이 %DATE% 위치에 들어간다)
                datePattern: 'YYYY-MM-DD',                           // 날짜 형식 (대문자여야 적용된다.)
                colorize: false,
                maxsize: 50000000,                                       // 로그 파일 하나의 용량 제한
                maxFiles: 1000,                                             // 로그 파일 개수 제한
                level: 'info', // info이상 파일 출력                      // 로그 레벨 지정
                showLevel: true,
                json: false,
                timestamp: timeStampFormat                          // 저장될 시간 형식
            }),
        new (winston.transports.Console)({                            // 콘솔 출력
                name: 'debug-console',
                colorize: true,
                level: 'debug', // debug이상 콘솔 출력
                showLevel: true,
                json: false,
                timestamp: timeStampFormat
        })     
    ],
    exceptionHandlers: [                                                  // uncaughtException 발생시 처리
        new (winstonDaily)({
                name: 'exception-file',
                filename: './logs/exception_%DATE%.log',
                datePattern: 'YYYY-MM-DD',
                colorize: false,
                maxsize: 50000000,
                maxFiles: 1000,
                level: 'error',
                showLevel: true,
                json: false,
                timestamp: timeStampFormat
        }),
        new (winston.transports.Console)({
                name: 'exception-console',
                colorize: true,
                level: 'debug',
                showLevel: true,
                json: false,
                timestamp: timeStampFormat
        })     
    ]
});


// 원하는 위치에 로그 삽입
...................
logger.info('Hello, World');
...................


* ./logs/ 위치에
app_2018-05-21.log
exception_2018-05-21.log

형식으로 로그 파일이 생성됨

출력 내용은 아래와 같은 형태.
2018-05-21 15:59:38.764 +0900 - info: Hello, World




'Programming > Node.js' 카테고리의 다른 글

[Node.js] express-ipfilter IP필터 모듈 사용하기  (2) 2018.05.23

[fabcar 예제 오류 발생]


* (2018.05.08) 새로 fabric-samples 프로젝트를 받아서 fabcar 예제를 진행할 경우 아래와 같은 오류가 발생합니다.


* startFabric.sh 실행 -> node enrollAdmin.js 실행 시 오류!


[user@localhost fabcar]$ node enrollAdmin.js module.js:549 throw err; ^ Error: Cannot find module './api.js' at Function.Module._resolveFilename (module.js:547:15) at Function.Module._load (module.js:474:25) at Module.require (module.js:596:17) at require (internal/module.js:11:18) at Object.<anonymous> (/home/user/go/src/github.com/hyperledger/fabric-samples/fabcar/node_modules/fabric-ca-client/lib/FabricCAClientImpl.js:19:11) at Module._compile (module.js:652:30) at Object.Module._extensions..js (module.js:663:10) at Module.load (module.js:565:32) at tryModuleLoad (module.js:505:12) at Function.Module._load (module.js:497:3)



[원인 파악 및 해결]


* 이유는 fabric-ca-client 의 FabricCAClientImpl.js 에서 api.js 를 사용하는데

  해당 위치 (./fabcar/node_modules/fabric-ca-client/lib/) 에 api.js 파일이 없습니다.


* fabric-ca-client 패키지를 확인해보니 최신버전이 1.1.0 -> 1.1.1 로 업데이트 되면서 내용이 약간씩 바뀌었으며 그로인해 필요한 파일들이 누락된듯 합니다.


* 따라서 저는 기존 1.1.0 버전 모듈로 다시 설치해서 문제를 해결했습니다.



<fabcar 폴더 안의 package.json 내용>

{ "name": "fabcar", "version": "1.0.0", "description": "Hyperledger Fabric Car Sample Application", "main": "fabcar.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { "fabric-ca-client": "~1.1.0", "fabric-client": "~1.1.0", "grpc": "^1.6.0" }, "author": "Anthony O'Dowd", "license": "Apache-2.0", "keywords": [ "Hyperledger", "Fabric", "Car", "Sample", "Application" ] }


*fabcar 폴더 안에서 npm install --unsafe-perm 을 통해 package.json 에 입력된 모듈들을 자동으로 설치하게 됩니다.

* dependencies 항목에 fabric-ca-client 버전의 경우 틸드형식으로 지정되어 표시된 버전 마지막 자리의 최신버전으로 설치되게 됩니다.
(즉 현재 저상태로 실행하면 fabric-ca-client 버전은 1.1.1 이 설치됩니다.)

* 틸드형식을 제거하고 고정 버전을 설치하면 정상적으로 fabcar 예제를 테스트 하실 수 있습니다.
(node_modules 폴더를 삭제한 후 진행)

"name": "fabcar", "version": "1.0.0", "description": "Hyperledger Fabric Car Sample Application", "main": "fabcar.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { "fabric-ca-client": "1.1.0", "fabric-client": "~1.1.0", "grpc": "^1.6.0" }, "author": "Anthony O'Dowd", "license": "Apache-2.0", "keywords": [ "Hyperledger", "Fabric", "Car", "Sample", "Application" ] }


[user@localhost fabcar]$ npm install --unsafe-perm ....... [user@localhost fabcar]$ node enrollAdmin.js

* 추후에 fabric-ca-client 모듈이 안정화 되면 신경쓰지 않으셔도 될 듯 합니다.


* 기존 모듈에서 api.js 파일을 복사해 와도 가능할 것으로 보이지만 그 외 어떤 다른파일이 누락되어 있을지 알 수 없어서

  이전버전을 설치하는 방향으로 진행했습니다.



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

(English)


['fabcar' example error]


* (2018.05.08) If you take a new fabric-samples project and proceed with the fabcar example, the following error occurs.


* Run 'startFabric.sh' -> error when running 'node enrollAdmin.js'


[user@localhost fabcar]$ node enrollAdmin.js module.js:549 throw err; ^ Error: Cannot find module './api.js' at Function.Module._resolveFilename (module.js:547:15) at Function.Module._load (module.js:474:25) at Module.require (module.js:596:17) at require (internal/module.js:11:18) at Object.<anonymous> (/home/user/go/src/github.com/hyperledger/fabric-samples/fabcar/node_modules/fabric-ca-client/lib/FabricCAClientImpl.js:19:11) at Module._compile (module.js:652:30) at Object.Module._extensions..js (module.js:663:10) at Module.load (module.js:565:32) at tryModuleLoad (module.js:505:12) at Function.Module._load (module.js:497:3)


[Cause & Solution]


* There is no api.js file in that location (./fabcar/node_modules/fabric-ca-client/lib/).


* Checking the fabric-ca-client package shows that the latest version has been updated with 1.1.0 -> 1.1.1, and the contents have been slightly changed, so that the necessary files are missing.


* So I reinstalled it with the existing 1.1.0 version module and solved the problem.


<'package.json' contents in fabcar folder>

{ "name": "fabcar", "version": "1.0.0", "description": "Hyperledger Fabric Car Sample Application", "main": "fabcar.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { "fabric-ca-client": "~1.1.0", "fabric-client": "~1.1.0", "grpc": "^1.6.0" }, "author": "Anthony O'Dowd", "license": "Apache-2.0", "keywords": [ "Hyperledger", "Fabric", "Car", "Sample", "Application" ] }


* 'npm install --unsafe-perm' inside the 'fabcar' folder will automatically install the modules in package.json. * Dependencies item will be installed with the latest version of fabric-ca-client(1.1.1). (by tiled version range : ~1.1.0)
* If you remove the tilde format and install the fixed version, you can test the fabcar example normally.    (proceed after deleting the node_modules folder)

{ "name": "fabcar", "version": "1.0.0", "description": "Hyperledger Fabric Car Sample Application", "main": "fabcar.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { "fabric-ca-client": "1.1.0", "fabric-client": "~1.1.0", "grpc": "^1.6.0" }, "author": "Anthony O'Dowd", "license": "Apache-2.0", "keywords": [ "Hyperledger", "Fabric", "Car", "Sample", "Application" ] }


[user@localhost fabcar]$ npm install --unsafe-perm ....... [user@localhost fabcar]$ node enrollAdmin.js

* If the 'fabric-ca-client' module stabilizes later, you do not need to worry about it.


* It seems possible to copy the 'api.js' file from the existing module(1.1.0), but I could not figure out what other files were missing, so i proceeded to install the previous version.


[SourceTree 에서 GitLab 연결하기]


1. Clone




2. GitLab 프로젝트의 URL 복사


* 프로젝트 페이지에서 SSH -> HTTPS 로 바꾸고 URL을 복사한다.




* 복사한 URL 을 소스경로 위치에 붙여넣고 다른 위치(목적지 경로나 이름에 해당하는 칸)를 클릭하면 자동으로 연결시도를 한다.





3. GitLab 프로젝트 아이디로 로그인





4. 해당 프로젝트 파일을 Clone 해놓을 Local 위치를 지정합니다.


* 복사해서 새로 만드는 것이므로 만들려는 폴더 이름이 기존에 존재하면 안됩니다.


* 브랜치는 그대로 두셔도 무방합니다.





5. Clone 완료


* 이후 작업을 시작합니다.






* 이후 깃 사용방법은 따로 정리할....지도...

'Programming > GIT' 카테고리의 다른 글

Git 사용법 정리  (0) 2018.10.15

[출처]

http://cyberx.tistory.com/70

http://www.bloter.net/archives/209318

https://olis.or.kr/license/introduction.do


1. GPL ( General Public License )

자유소프트웨어재단에서 만든 라이선스로 GNU 프로젝트로 배포하는 소프트웨어에 적용하기 위하여 리처드스톨만이 만들었습니다. 오픈 소스들 중에서 많이 알려져 있고 의무사항들도 다른 오픈 소스 라이선스에 비해 엄격한 편입니다. GPL프로그램은 어떤 목적으로, 어떤 형태로든 사용할 수 있지만 사용하거나 변경된 프로그램을 배포하는 경우 무조건 동일한 라이선스로 공개해야 하며. ”본 제품(SW)은 GPL 라이선스 하에 배포되는 SW인 ○○○ (사용한 GPL SW 이름)를 포함합니다”와 같은 문구를 매뉴얼 혹은 그에 준하는 매체에 포함시키고, GPL 전문을 첨부해야 합니다.

2. AGPL ( Affero General Public License )

GPL을 기반을 만든 라이선스로 버전 1, 2는 Affero, 버전 3은 자유소프트웨어재단에 의해 개발됐습니다. 이 라이선스는 수정한 소스코드를 서버에서만 사용하는 개발자가 그 프로그램을 배포하지 않을 경우 사용자는 소스코드를 가질 수가 없는 문제를 해결하기 위해 마련됐습니다. 서버에서 프로그램을 실행해 다른 사용자들과 통신하면, 실행되고 있는 프로그램의 소스코드를 사용자들이 다운로드 할 수 있게 해야 한다는 조항을 담고 있습니다.

3. LGPL ( Lesser General Public License )

LGPL은 자유소프트웨어재단이 일부 라이브러리(Library)에 대하여 GPL보다 소스코드의 공개 정도를 다소 완화된 형태로 사용할 수 있도록 만든 라이선스입니다. 상용 라이브러리와 동일한 기능을 제공하는 오픈 소스 라이브러리에 GPL과 같은 엄격한 라이선스를 적용하면 소스코드를 공개해야 하기 때문에 개발자들이 사용을 꺼려할 것이기 때문에 이를 막고 오픈 소스의 사용을 장려하기 위해 만들어 졌습니다. LGPL이 적용된 라이브러리는 원 프로그램의 소스코드를 공개하지 않고 이에 사용된 오픈 소스의 소스코드만 공개하면 됩니다. 원래는 한정된 라이브러리에만 적용하려는 의도로 Library GPL이라는 이름을 붙였으나, 모든 라이브러리에 적용된다는 오해를 사 Lesser GPL로 2.1버전에서 변경되었습니다.

4. BSD ( Berkeley Software Distribution )

BSD는 버클리의 캘리포니아 대학에서 배포하는 공개 SW라이선스로 SW의 소스코드를 공개하지 않아도 되는 대표적인 오픈 소스 SW의 라이선스 중 하나입니다. 이렇게 BSD의 라이선스의 허영범위가 넓은 이유는 BSD라이선스로 배포되는 프로젝트가 미국 정부에서 제공한 재원으로 운영되었기 때문입니다. 즉, SW에 대한 대가를 미국 국민의 세금으로 미리 지불했기 때문에 사람들에게 그들이 원하는 방식으로 SW를 사용하거나 만들도록 허가된 것입니다. 따라서 BSD라이선스의 소스코드를 이용하여 새로운 프로그램을 개발하여도 새로운 프로그램의 소스코드를 공개하지 않고 BSD가 아닌 다른 라이선스를 적용하여 판매할 수 있습니다.

5. MPL ( Mozilla Public License )

MPL은 Netscape브라우저의 소스코드를 공개하기 위해 개발된 라이선스로 공개하여야 할 소스코드의 범위를 좀 더 명확하게 정의하고 있습니다. 즉 GPL에서는 링크되는 SW의 소스코드를 포함하여 공개하여야 할 소스코드의 범위가 모호하게 정의되어 있지만 MPL에서는 링크 등의 여부에 상관없이 원래의 소스코드가 아닌 새로운 파일에 작성된 소스코드에 대해서는 공개의 의무가 발생하지 않습니다. 따라서 MPL SW 그 자체는 어떻게 하든 공개를 해야 하지만 원래 소스코드에 없던 새로운 파일들은 공개할 의무가 발생하지 않습니다.

6. Apache

Apache License는 아파치 웹 서버를 포함한 아파치 재단(Apache Software Foundation)의 모든 SW에 적용되는 라이선스로 BSD라이선스와 비슷하여 소스코드 공개 등의 의무가 발생하지 않습니다. 다만 "Apache"라는 이름에 대한 상표권을 침해하지 않아야 한다라는 조항이 명시적으로 들어가 있고, 특허권에 대한 내용이 포함되어 있습니다. 아파치 라이선스 소스코드를 수정해 배포하는 경우 아파치 라이선스 버전 2.0을 꼭 포함시켜야 하며 아파치 재단에서 만든 소프트웨어임을 밝혀야 합니다.

7. MIT

MIT는 미국 Massachusetts Institute of Technology에서 해당 대학 SW 공학도들을 돕기 위해 개발한 라이선스 입니다. 라이선스와 저작권 관련 명시만 지켜주면 되는 라이선스로, BSD라이선스를 기초로 작성되었으며 소스코드를 수정하여 배포 시에도 반드시 오픈 소스로 배포해야 한다는 규정이 없어 GPL등의 엄격함을 피하려는 사용자들에게 인기가 많습니다.

8. 기타

WTFPL (Do What The Fuck You Want To Public License) 당신이 하고 싶은 대로 마음 것 하라는 라이선스

Beerware 마음대로 사용하고 SW가 마음에 들었다면 언젠가 만났을 때 맥주나 한잔 사달라는 라이센스


  1. GPL
  • 수정한 소스코드 혹은 GPL소스코드를 활용한 소프트웨어 모두 GPL로 공개
  • 라이선스 및 저작권 명시
  • 변경사항 안내
  1. AGPL
  • 수정한 소스코드 혹은 AGPL소스코드를 활용한 소프트웨어 모두 AGPL로 공개
  • 라이선스 및 저작권 명시
  • 변경사항 안내
  • 네트워크상 소프트웨어 사용자에게 소스코드 공개
  1. LGPL
  • 수정한 소스코드 LGPL로 공개 ( 단순 활용시 공개 의무 없음 )
  • 라이선스 및 저작권 명시
  1. BSD
  • 라이선스 및 저작권 명시
  1. MPL
  • 수정한 소스코드 MPL로 공개( 단순 활용시 공개 의무 없음)
  • 라이선스 및 저작권 명시
  • 특허기술이 구현된 프로그램의 경우 관련 사실을 'LEGAL'파일에 기록하여 배포
  • 상표권 침해 금지
  1. Apache
  • 라이선스 및 저작권 명시
  • 변경사항 안내
  • 상표권 침해 금지
  1. MIT
  • 라이선스 및 저작권 명시





 라이선스

특이 사항 

 GPL

  • 수정한 소스코드 혹은 GPL소스코드를 활용한 소프트웨어 모두 GPL로 공개
  • 라이선스 및 저작권 명시
  • 변경사항 안내 

 AGPL

  • 수정한 소스코드 혹은 AGPL소스코드를 활용한 소프트웨어 모두 AGPL로 공개
  • 라이선스 및 저작권 명시
  • 변경사항 안내
  • 네트워크상 소프트웨어 사용자에게 소스코드 공개 

 LGPL

  • 수정한 소스코드 LGPL로 공개 ( 단순 활용시 공개 의무 없음 )
  • 라이선스 및 저작권 명시

 BSD

  • 라이선스 및 저작권 명시

 MPL

  • 수정한 소스코드 MPL로 공개( 단순 활용시 공개 의무 없음)
  • 라이선스 및 저작권 명시
  • 특허기술이 구현된 프로그램의 경우 관련 사실을 'LEGAL'파일에 기록하여 배포
  • 상표권 침해 금지

 Apache

  • 라이선스 및 저작권 명시
  • 변경사항 안내
  • 상표권 침해 금지

 MIT

  •  라이선스 및 저작권 명시




+ Recent posts