Search

마카오 : 타이파빌리지 쿤하거리

사진 2019.03.18 01:05 Posted by 파란크리스마스

2018년 4월 14일 회사동료와 함께 우현하게 버스를 잘못타고 내린 타이파빌리지 쿤하거리입니다.

ffmpeg 컴파일 - 2

OS/Windows 2019.03.16 01:36 Posted by 파란크리스마스

출처

--enable-libfdk-aac

$ git clone https://github.com/mstorsjo/fdk-aac
$ cd fdk-aac/
$ ./autogen.sh
$ ./configure --prefix=/usr/local --enable-shared --enable-static
$ make
$ make install

--enable-libaacplus (실패)

$ wget http://tipok.org.ua/downloads/media/aacplus/libaacplus/libaacplus-2.0.2.tar.gz
$ tar zxvf libaacplus-2.0.2.tar.gz
$ cd libaacplus-2.0.2
$ autoreconf -i
$ ./configure --prefix=/usr/local --enable-shared --enable-static
$ make
/bin/sh ../libtool  --tag=CC   --mode=link gcc  -I/usr/local/include -I/mingw64/x86_64-w64-mingw32/include  -L/usr/local/lib -L/mingw64/x86_64-w64-mingw32/lib -o aacplusenc.exe main.o ../src/libaacplus.la -lm
libtool: link: gcc -I/usr/local/include -I/mingw64/x86_64-w64-mingw32/include -o .libs/aacplusenc.exe main.o  -L/usr/local/lib -L/mingw64/x86_64-w64-mingw32/lib ../src/.libs/libaacplus.dll.a -L/usr/local/lib
main.o:main.c:(.text+0x13a): undefined reference to `AuChannelOpen'
main.o:main.c:(.text+0x462): undefined reference to `AuChannelReadFloat'
main.o:main.c:(.text+0x490): undefined reference to `AuChannelReadShort'
collect2.exe: error: ld returned 1 exit status
make[2]: *** [Makefile:438: aacplusenc.exe] 오류 1
make[2]: 디렉터리 '/home/bluesanta/workspace.ffmpeg/libaacplus-2.0.2/frontend' 나감
make[1]: *** [Makefile:517: all-recursive] 오류 1
make[1]: 디렉터리 '/home/bluesanta/workspace.ffmpeg/libaacplus-2.0.2' 나감
make: *** [Makefile:387: all] 오류 2

--enable-libmp3lame

$ wget http://jaist.dl.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz
$ tar zxvf lame-3.99.5.tar.gz
$ cd lame-3.99.5/
$ ./configure --prefix=/usr/local --enable-shared --enable-static
$ make
$ make install

--enable-libopenh264

$ cp ar x86_64-w64-mingw32-ar
$ git clone https://github.com/cisco/openh264.git
$ cd openh264
$ export "CFLAGS=-fno-stack-protector"
$ export "LDFLAGS=-lssp"
$ make
$ make install
sh ./codec/common/generate_version.sh ./
Keeping existing codec/common/inc/version_gen.h
mkdir -p /usr/local/include/wels
install -m 644 .//codec/api/svc/codec*.h /usr/local/include/wels
mkdir -p /usr/local/lib
install -m 644 libopenh264.a /usr/local/lib
mkdir -p /usr/local/bin
install -m 755 libopenh264.dll /usr/local/bin
if [ "dll" != "dll" ]; then \
  cp -a libopenh264.dll /usr/local/bin ; \
  cp -a libopenh264.dll /usr/local/bin ; \
fi
mkdir -p /usr/local/lib/pkgconfig
install -m 644 openh264.pc /usr/local/lib/pkgconfig
install -m 644 libopenh264.dll.a /usr/local/lib

--enable-openssl

$ wget https://ftp.openssl.org/source/old/1.1.1/openssl-1.1.1a.tar.gz
$ tar xvf openssl-1.1.1a.tar.gz
$ cd openssl-1.1.1a/
$ ./config --prefix=/usr/local
$ make
$ make install

--enable-librtmp

$ git clone https://gitlab.com/JudgeZarbi/RTMPDump-OpenSSL-1.1.git
$ cd RTMPDump-OpenSSL-1.1/
$ make SYS=mingw prefix=/usr/local XCFLAGS="-I/usr/local/include" XLDFLAGS="-L/usr/local/lib"
$ make SYS=mingw prefix=/usr/local install

ffmpeg 설치

$ git config --global core.autocrlf false
$ git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
$ cd ffmpeg
$ ./configure --prefix=/usr/local --pkg-config-flags="--static" --extra-ldflags=-L/usr/local/lib --enable-static --disable-shared --enable-gpl --enable-zlib --enable-libx264 --enable-libfreetype --enable-libfribidi --enable-libass --enable-libfdk-aac --enable-libmp3lame --enable-libopenh264 --enable-openssl --enable-librtmp --enable-runtime-cpudetect --enable-swscale --enable-avfilter --enable-ffplay --enable-nonfree
$ make
$ $ ./ffmpeg -version
ffmpeg version N-93332-g0321370601 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 7.3.0 (Rev2, Built by MSYS2 project)
configuration: --prefix=/usr/local --pkg-config-flags=--static --extra-ldflags=-L/usr/local/lib --enable-static --disable-shared --enable-gpl --enable-zlib --enable-libx264 --enable-libfreetype --enable-libfribidi --enable-libass --enable-libfdk-aac --enable-libmp3lame --enable-libopenh264 --enable-openssl --enable-librtmp --enable-runtime-cpudetect --enable-swscale --enable-avfilter --enable-ffplay --enable-nonfree
libavutil      56. 26.100 / 56. 26.100
libavcodec     58. 47.103 / 58. 47.103
libavformat    58. 26.101 / 58. 26.101
libavdevice    58.  6.101 / 58.  6.101
libavfilter     7. 48.100 /  7. 48.100
libswscale      5.  4.100 /  5.  4.100
libswresample   3.  4.100 /  3.  4.100
libpostproc    55.  4.100 / 55.  4.100

Node.js : DB 연동 - Passport 로그인 처리

Programming/Node.js 2019.03.10 03:49 Posted by 파란크리스마스

출처

/config/dbHelper.js

const mariadb = require('mariadb');
var config = require('./db_config');    // ./는 현재 디렉토리를 나타냅니다

const pool = mariadb.createPool({
    host: config.host,
    port: config.port,
    user: config.user,
    password: config.password,
    database: config.database,
    connectionLimit: 5
});

function dbHelper() {
    //
    this.getConnection = function(callback) {
        pool.getConnection()
            .then(conn => {
                callback(conn);
            }).catch(err => {
            //not connected
        });
    };

    //
    this.getConnectionAsync = async function() {
        try {
            let conn = await pool.getConnection();
            // console.log("conn = " + conn); // { affectedRows: 1, insertId: 1, warningStatus: 0 }
            return conn;
        } catch (err) {
            throw err;
        }
        return null;
    };

    //
    this.sendJSON = function(response, httpCode, body) {
        var result = JSON.stringify(body);
        response.send(httpCode, result);
    };
}

module.exports = new dbHelper();

/config/passport.js

var dbHelper = require('./dbHelper');
const LocalStrategy = require('passport-local').Strategy;

module.exports = (passport) => {

    // 로그인이 성공하면, serializeUser 메서드를 이용하여 사용자 정보를 Session에 저장할 수 있다.
    passport.serializeUser((user, done) => {
        console.log('serialize');
        done(null, user);
    });

    // 인증 후, 페이지 접근시 마다 사용자 정보를 Session에서 읽어옴.
    passport.deserializeUser((user, done) => {
        console.log('deserialize');
        done(null, user);
    });

    passport.use(new LocalStrategy({
            usernameField : 'userid',
            passwordField : 'password',
            passReqToCallback : true
        },

        // 인증 요청
        function(req, userid, password, done) {
            if(!userid || !password ) { return done(null, false, req.flash('message','All fields are required.')); }
            dbHelper.getConnection(function(conn) {
                console.log('conn = ' + conn);
                conn.query("select * from member where email = ?", [userid]).then((rows) => {
                    // console.log(rows);
                    if(!rows.length) {
                        return done(null, false, req.flash('message','Invalid username or password.'));
                    }
                    var dbPassword  = rows[0].password;
                    if(!(dbPassword == password)) {
                        return done(null, false, req.flash('message','Invalid username or password.'));
                    }
                    return done(null, rows[0]);
                })
                .then((res) => {
                    console.log('res = '+res); // { affectedRows: 1, insertId: 1, warningStatus: 0 }
                    conn.end();
                })
                .catch(err => {
                    //handle error
                    console.log(err);
                    conn.end();
                    if (err) return done(req.flash('message',err));
                });
            });
        }
    ));
};

웹페이지에 값 전달 (connect-flash 모듈)

/app.js

var flash = require('connect-flash');

app.use(passport.session()); //로그인 세션 유지
app.use(flash());

Node.js : MariaDB 연동

Programming/Node.js 2019.03.02 00:39 Posted by 파란크리스마스

출처

/config/db_config.js

module.exports = (function() {
    return {
        host: "localhost",
        port : 10312,
        user: "root",
        password: "sqldba",
        database: "simplesns"
    }
})();

/config/dbHelper.js

const mariadb = require('mariadb');
var config = require('./db_config');    // ./는 현재 디렉토리를 나타냅니다

const pool = mariadb.createPool({
    host: config.host,
    port: config.port,
    user: config.user,
    password: config.password,
    database: config.database,
    connectionLimit: 5
});

function dbHelper() {
    //
    this.getConnection = function(callback) {
        pool.getConnection()
            .then(conn => {
                callback(conn);
            }).catch(err => {
            //not connected
        });
    };

    //
    this.getConnectionAsync = async function() {
        try {
            let conn = await pool.getConnection();
            // console.log("conn = " + conn); // { affectedRows: 1, insertId: 1, warningStatus: 0 }
            return conn;
        } catch (err) {
            throw err;
        }
        return null;
    };

    //
    this.sendJSON = function(response, httpCode, body) {
        var result = JSON.stringify(body);
        response.send(httpCode, result);
    };
}

module.exports = new dbHelper();

/api/user/UserService.js

var dbHelper = require('../../config/dbHelper');

// https://github.com/jareddlc/node-datatables/blob/master/server.js
function UserService() {
    this.getUserList = function(request, response) {
        dbHelper.getConnection(function(conn) {
            conn.query('SELECT * FROM member')
                .then((results) => {
                    // console.log(results); //[ {val: 1}, meta: ... ]

                    //Output
                    var output = {};
                    var temp = [];
                    output.datas = results;
                    
                    dbHelper.sendJSON(response, 200, output);
                })
                .then((res) => {
                    console.log('res = '+res); // { affectedRows: 1, insertId: 1, warningStatus: 0 }
                    conn.end();
                })
                .catch(err => {
                    //handle error
                    console.log(err);
                    conn.end();
                })
        });
    }
}

module.exports = new UserService();

Node.js : Controller

Programming/Node.js 2019.03.02 00:16 Posted by 파란크리스마스

출처

/api/user/user.ctrl.js

/* api 로직 */
let users = [
    {id: 1, name: 'jinbro'},
    {id: 2, name: 'jinhyung'},
    {id: 3, name: 'park'}
];

let index = function(req, res) {
    if(!req.query.limit){
        res.json(users);
    } else {
        const limit = parseInt(req.query.limit, 10);

        if(isNaN(limit)){
            return res.status(400).end();
        }
        res.json(users.slice(0, limit));
    }
};

let read = function(req, res) {
    const id = parseInt(req.params.id, 10);

    console.log("id = " + id);

    if(isNaN(id)) {
        return res.status(400).end();
    }

    const user = users.filter((user) => {
        return user.id === id;
    })[0];

    if(!user) {
        return res.status(404).end();
    }

    res.json(user);
};

module.exports = {
    index: index,
    read: read
    //create: create,
    //update: update,
    //destroy: destroy
};

/api/user/index.js

const express = require('express');
const router = express.Router();

const controller = require('./user.ctrl');

/* user 라우팅 로직 */
router.get('/', controller.index);
router.get('/:id', controller.read);
//router.post('/', controller.create);
//router.put('/:id', controller.update);
//router.delete('/:id', controller.destroy);

module.exports = router;

/app.js

/* use router class */
const user = require('./api/user/index.js');

/* /users 요청을 모두 /user/index.js로 */
app.use('/users', user);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

실행

Node.js 기초

Programming/Node.js 2019.03.01 19:33 Posted by 파란크리스마스

출처

변수

출처 : 2. 기초문법 · node.js 서버구축하기

var name; // 변수 선언
name = '홍길동'; // 변수 정의

var num2 = 3; // 변수 선언과 정의

함수

출처 : 함수 표현식 vs 함수 선언식 • Captain Pangyo

함수 선언식 - Function Declarations

// 함수 선언
function funcDeclarations() {
  return 'A function declaration';
}
funcDeclarations(); // 함수 호출

함수 표현식 - Function Expressions

// 함수 표현식 -> 함수 변수 선언
var funcExpression = function () {
    return 'A function expression';
}
funcExpression(); // 함수 호출

조건문

if < > && || ==

반복문

for, while

클래스

// User 클래스 선언
function User(_name){
    // 변수를 객체의 멤버로 사용하기 위해 this 예약어를 사용해서 정의
    this.name = _name; // 사용자 이름
    this.age = 0; // 사용자 나이

    // 사용자 이름을 반환 하는 User 클래스의 내장 함수
    this.getName = function() {
        return this.name;
    }

    this.getAge = function() {
        return this.age;
    }
}

var user1 = new User("bluexmas"); // User 객체 생성 
console.log(user1.getName()); // User 클래스의 내장 함수 호출

prototype

// User객체의 prototype을 가져와서 setAge 함수 추가
User.prototype.setAge = function(_age){
    this.age = _age;
}

user1.setAge(10);
console.log(user1.getAge()); // User 클래스의 내장 함수 호출

require - 동적 라이브러리 로딩

출처 : Node.js 기초와 모듈 (내장 모듈, npm, 사용자정의 모듈)

url 모듈을 이용해서 url 파싱하는 예제

var url = require("url");
var parsedURL = url.parse("http://www.example.com/profile?name=barry");
 
console.log(parsedURL.protocol); // "http:"
console.log(parsedURL.host); // "www.example.com"
console.log(parsedURL.query); // "name=barry"