The Pursuit of Happyness

실행환경 Ubuntu 14.04 LTS / node v0.10.25


다음은 node.js 로 작성한 채팅 서버 코드.

chat.js라는 파일에 다음과 같이 코드를 작성해서 저장.

var net = require('net');
var sockets = [];

var server = net.createServer(
                function(socket) {
                        socket.name = socket.remoteAddress + ":" + socket.remotePort;
                        sockets.push(socket);
                        socket.write("Welcome " + socket.name + "\n");
                        broadcast(socket.name + " joined the chat\n", socket);

                        socket.on('data',
                                function(data) {
                                        broadcast(socket.name + "> " + data, socket);
                                }
                        );

                        socket.on('end',
                                function(data) {
                                        sockets.splice(sockets.indexOf(socket), 1);
                                        broadcast(socket.name + " left the chat.\n");
                                }
                        );
                }
);

function broadcast(message, sender) {
        sockets.forEach(
                function (socket) {
                        if (socket === sender) return;
                        socket.write(message);
                }
        );
}
server.listen(3000);

실행은 nodejs chat 이라고 입력하면 된다.

코드를 살펴보면, 이 채팅 서버는 3000번 포트로 작동한다.

클라이언트에서 접속하면 소켓 IP와 Port를 아이디로 할당하여 sockets 에 저장.

그리고 새로 접속한 클라이언트에게는 서버 Welcome 메시지를 전송하고, 기존의 클라이언트에게는 새로운 유저가 들어왔다는 메시지를 broadcast로  전송.

클라이언트가 끊고 나가는 경우 sockets에서 해당 소켓 정보를 삭제하고 남은 클라이언트 들에게 유저가 나갔다는 메시지를 전달.

 

테스트를 위해서 telnet 을 이용해서 접속을 한다.

telnet [서버IP] 3000

 

텔넷 창을 여러개 띄워서 상대방이 보낸 메시지가 제대로 오는지 확인한다.

Comment +0

실행환경 Ubuntu 14.04 LTS / node v0.10.25


다음은 클라이언트가 입력한 값을 그대로 돌려주는 Echo Server를 Node.js 스타일로 작성해 보겠다.

이번 예제에서는 소켓 연결을 위해서 net 모듈을 사용했으며, 3000번 포트로 동작하도록 하였다.

echo.js 라는 파일을 생성하여 아래와 같이 작성한다.

var net = require('net');
var server = net.createServer(
                function(socket) {
                        socket.on('data',
                                function(data) {
                                        socket.write(data);
                                }
                        );
                }
);
server.listen(3000);

실행은 nodejs echo 로 하면 되고, 확인을 위해서 telnet 등을 이용해서 서버에 3000 포트로 접속하면 입력한 값을 되돌려 주는 것을 확인 할 수 있다. 

여기서 socket.on 대신 socket.once 를 사용하면 한번 응답후에 연결을 종료시키도록 할 수 있다.

Comment +0

실행환경 Ubuntu 14.04 LTS / node v0.10.25


다음은 8080 포트로 작동하는 Node.js 로 작성한 http 서비스 코드이다.

Node 의 http, fs 서비스를 사용하였고, 요청한 파일이 있으면 내려보내주고, 아니면 간단한 에러를 출력하는데,

실제는 http 서비스의 header 등을 제대로 설정해 주는 것이 좋지만, 예제를 간단히 만들기 위해서 생략하고 파일만 전달하게 작성했다.

Node.js 에서는 많은 코드가 아래와 같이 callback 함수를 등록하는 형식으로 작성된다.

httptest.js 라는 파일을 생성하여 아래와 같이 입력하고 저장한다.


var http = require('http');
var fs = require('fs');

var server = http.createServer(
        function(req, res) {
                var filePath = './public';
                if (req.url == '/') {
                        filePath += '/index.html';
                } else {
                        filePath += req.url;
                }

                fs.exists(filePath,
                        function(exists) {
                                if (exists) {
                                        fs.readFile(filePath,
                                                function(err, data) {
                                                        if (err) {
                                                                res.end('Server Error');
                                                        } else {
                                                                res.end(data);
                                                        }
                                                }
                                        );
                                } else {
                                        res.end('File Not Exists');
                                }
                        }
                );
        }
);
server.listen(8080);


httptest.js 가 실행되는 위치에 public 이라는 이름의 폴더를 만들고 그 안에 필요한 파일들 (index.html 등) 을 넣어 두면 http 서비스가 작동한다. 

서버의 실행은 nodejs httptest 라고 입력하면 된다.

확인은 웹브라우져를 하나 열고 http://[서버 IP]:8080 식으로 입력하면 된다.


Comment +0

실행환경 Ubuntu 14.04 LTS / node v0.10.25


프로그래밍 책을 보면 대부분 시작은 Hello World 이다.

Node.js 는 수많은 모듈들을 이용해서 상당히 간결한 코드로 구현하는 경우가 많은데, 

Hello World는 정말 말 그대로 한 줄로 끝난다.

hello.js 라는 파일을 만들어서 다음과 같이 한줄 적고 저장하자.

console.log("Hello World");

긴 설명이 필요 없을 것 같은데, console.log 는 서버쪽에 로그를 남기는 명령어라고 생각하면 된다.

Ubuntu 서버에서는 다음의 명령어로 실행한다.

nodejs hello

확장자가 붙어 있지 않은 경우 자동으로 js 파일로 인식하므로 nodejs hello 라고만 입력하면 된다.





Comment +0

설치 환경 Ubuntu 14.04 LTS

Root 권한이라고 가정 (아니면 앞에  sudo 를 붙여주면 됨)


패키지 툴을 이용하는 경우 아래의 명령어만 실행하면 바로 설치가 됩니다.

apt-get install node npm

위의 문장을 실행하면 build-essential, libssl-dev 등의 패키지가 같이 설치되므로 별도로 설치할 필요가 없음


다음으로 Node 를 시작하게 되면 항상 만나게 되는 기본 용어 중에 npm 과 nvm 에 대해서 알아보겠습니다.

 npm

 node package manager

 node 프로그래밍시 사용하게 되는 패키지들을 추가할 때 사용하는 툴

 nvm

 node version manager

 node를 원하는 버전으로 설치하여 관리하기 위해 사용하는 버전 관리자


Ubuntu 에서는 node 실행시 node 대신 nodejs 라는 명령어를 써야한다.

설치가 완료되면 nodejs -v 혹은 nodejs --version 명령어로 설치된 패키지의 버전을 확인할 수 있다.



Comment +0

개발 환경 

JDK 1.8.x

MySQL


먼저 Eclipse 를 실행합니다.

참고로 저는 최신버전 LUNA를 사용중입니다.

Help -> Install New Software 선택

Find 에 hibernate 을 입력하여 검색

JBoss Tools 를 설치합니다.


그리고 eclipse에 hibernate을 사용할 프로젝트를 생성합니다. (여기서는 편의상 HibernateDB001 java 프로젝트)


MySQL DB와의 연결을 위해서 JDBC 드라이버를 build path 에 추가합니다. 

MySQL JDBC 드라이버는 아래 링크에서 다운로드가 가능합니다.

http://dev.mysql.com/downloads/connector/j/


저는 프로젝트에 lib 폴더를 만들어서 jar 파일을 추가하고 build path에 추가하였습니다.


그리고 Hibernate prospect 에서 config 파일을 생성합니다.

위의 아이콘을 클릭하거나 오른쪽 클릭하여 config 파일을 생성합니다.



hibernate.cfg.xml 파일을 생성합니다.


DB설정에 맞게 필요한 정보를 입력하고 Finish 를 누릅니다.


최종 설정은 대략 다음과 같습니다.



위의 정보를 제대로 입력했다면 Database에 아래와 같이 DB 정보가 나오게 됩니다.

Eclipse 위쪽의 Hibernate Code Generation 아이콘을 눌러서 코드를 생성합니다.

필요한 옵션은 다음과 같습니다.



ps. 내용 추가합니다.

hibernate 코드를 생성하려고 할때, hibernate.cfg.xml 을 파싱할 수 없다는 에러가 나는 경우가 있습니다.

Configuration 부분에 classpath에 에러 표시가 나타나면서 파싱이 안되는 경우인데요,

(Could not parse configuration 등의 에러..)

이 경우 hibernate.cfg.xml 파일의 헤더부분에 나오는 http://hibernate.sourceforge.net 부분을 http://www.hibernate.org/dtd 로 변경하면 문제가 해결됩니다. 구글링 결과 네트워크 연결이 되지 않거나 해당 사이트에 접속이 되지 않는 경우 생기는 문제라고 하니, parsing 에러가 나타나는 경우 위와 같이 변경하면 해결이 되는 경우가 있으니 참고하세요.









Comment +0

우분투 PPTP VPN 설치

1. pptpd 설치

 $ sudo apt-get install pptpd


2. PPTP VPN 에서 사용할 Private IP 대역 설정

$ vi /etc/pptpd.conf 

아래 내용을 추가

localip 10.0.10.1

remoteip 10.0.10.101-110 


3. ms-dns 추가

$ vi /etc/ppp/pptpd-options 

아래의 DNS 이외에 현재 서버가 사용중인 DNS를 추가해도 무방

ms-dns 8.8.8.8

ms-dns 8.8.4.4 


4. VPN으로 접속할 계정 추가

$ vi /etc/ppp/chap-secrets 

아래의 형식으로 [id], [password] 부분을 변경하여 추가

[id] pptpd [password] *


5. pptpd 리스타트

 $ sudo service pptpd restart


6. IP 포워딩 설정 활성화

 $ vi /etc/sysctl.conf 

아래와 같이 설정 변경

net.ipv4.ip_forward=1 

변경된 설정을 적용

 $ sudo sysctl -p


8. iptable 설정

 $ sudo iptables -t nat -A POSTROUTING -s 10.0.10.0/24 -o eth0 -j MASQUERADE


9. 방화벽 설정

서버에 방화벽이 존재하는 경우 1723포트를 열어준다.



Comment +0

mysql 데이터 저장 경로 변경하기

/data/mysql 로 변경한다고 가정


  • mysql 설정 파일을 변경한다.

vi /etc/mysql/my.cfg

datadir 부분을 찾아셔 다음과 같이 변경한다.

datadir     = /data/mysql


  • Apparmor access 변경

설정 파일을 변경한 후에 mysql 서비스를 실행하는 경우 로그에 다음과 같은 에러가 나올 경우

/etc/apparmor.d/usr.sbin.mysql 파일을 편집하여 해당 datadir 경로의 권한 추가해 준다.

110727 12:48:32 [Note] Plugin 'FEDERATED' is disabled.
/usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13)
110727 12:48:32 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
110727 12:48:32  InnoDB: Operating system error number 13 in a file operation.
InnoDB: The error means mysqld does not have the access rights to
InnoDB: the directory.
InnoDB: File name ./ibdata1
InnoDB: File operation call: 'open'.
InnoDB: Cannot continue operation.

/data/mysql/ r,
/data/mysql/** rwk,

  • ldata 경로 변경
경로 변경 및 access 설정 변경후 아래와 같은 에러가 발생할 경우 다음과 같이 조치한다.
[ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist
> mysql_install_db –-user=mysql ldata=/data/mysql
+ 잘 안되는 경우 그냥 mysql_install_db 만 실행 


Comment +1

  • selinux 2015.09.14 11:57

    please also check selinux configurations
    https://blogs.oracle.com/jsmyth/entry/selinux_and_mysql

Install Ubuntu Server


Select a language

English - English


Select your location

United States


Configure the keyboard

No


Configure the keyboard

English (US)


Configure the keyboard

English (US)


Configure the network

[hostname]


Set up users and passwords

Full name for the new user:

[display name]


Set up users and passwords

Username for your account:

[account name]


Set up users and passwords

Choose a password for the new user:

****

Set up users and passwords

Re-enter password to verify:

****

Set up users and passwords

Encrypt your home directory?

No


Configure the clock

Yes


Partition disks

Partitioning method:

Guided - use entire disk and set up LVM


Partition disks

Select disk to partition:

[select partition]


Partition disks

Write the changes

Yes


Partition disks

Amount of volume group to use for guided partitioning:

max


Partition disks

Write the changes to disks

Yes


Configure the package manager

Continue


Configuring tasksel

No automatic updates


Software selection

Continue


Install the GRUB boot loader on a hard disk

Yes


Finish the installation

Continue



Comment +0


Android


 Currency currency = Currency.getInstance(Locale.getDefault());

 String currencyCode = currency.getCurrencyCode();



iOS


 
 NSString *localeIdentifier = [[NSLocale availableLocaleIdentifiers] objectAtIndex:72];

 NSLocale *selectedLocale = [[NSLocale alloc] initWithLocaleIdentifier:localeIdentifier];

 NSString *currencyCode = [selectedLocale objectForKey:NSLocaleCurrencyCode];




Comment +0