노드 웹킷(Node Webkit) 시작하기

분류없음 2013.11.27 14:59

문제:
얼마 전에 노드웹킷(Node Webkit)을 사용해 프로토타이핑 하는 작업을 맡았었다.


나도 처음 접해보는 거였고, 살펴보면서 메모해둔 게 있어 옮겨둔다.


해결책:

 



소개

크로미엄과 노드를 활용해 네이티브 애플리케이션을 만들 수 있는 환경.
HTML, JavaScript, CSS 같은 웹 기술로 네이티브 앱을 만들 수 있다.

node-webkit slide
(슬라이드를 보면 어떤 컨셉인지 쉽게 이해할 수 있다.)


특징

- node.js의 함수가 렌더러 스레드에 존재한다.
- 즉, 페이지의 스크립트에서 노드의 함수를 호출할 수 있다.
- 다양한 OS를 지원한다. (Windows, Mac, Linux)
- 한 개의 소스로 여러 OS로의 패키징을 쉽게 할 수 있다. (App.nw)


그 밖에

- 대부분의 HTML5 기능을 지워한다.
- GPU 가속을 받을 수 있다.
- 비디오와 오디오를 지원한다.
- 기존의 cocos2d-html5 같은 라이브러리도 동작한다.


이런 것들이 가능

- 페이지에서 노드의 `fs` 모듈을 사용해 로컬 파일에 접근 가능.
- 페이지에서 `net`으로 소켓 통신 할 수 있다.
- 써드파티 노드 모듈을 자유롭게 사용할 수 있다.



어떻게 만드나?

- 간단하다! 노드 모듈을 만드는 것과 거의 동일!
- package.json
- index.html
- node_modules/


package.json

- name: 앱 이름
- window: 윈도우 사이즈를 지정한다.
    - window.width
    - window.height
    - window.toolbar: 툴바 보여줄 거니?
- main: 메인 페이지



어떻게 사용하나?

- 패키징 후 실행하기
    $ zip -r app.zip /path/to/your/app/*
    $ nw ./app.zip

- 스탠드얼론 버전으로 만들기 (사용자가 노드 웹킷을 설치할 필요 없다)
    $ cat /path/to/nw ./app.zip > app



구현 특징

- 노드와 크로미엄의 메시지 룹(message loop)을 머지했다.
    - 크로미엄은 MessagePump* 라는 걸로 내부 메시지 룹을 지원함
    - 노드는 libuv 라는 걸로 메시지 룹을 제공함
    - 노드웹킷은 libuv를 크로미엄의 메시지 룹을 사용할 수 있게, MessagePumpForUv 라는 걸 구현했음.
    - (즉, 메시지 룹을 하나만 사용한단 얘기)
- 노드의 심볼을 웹킷으로 추가했다.
    - 웹킷은 필요할 때에 자바스크립트 컨텍스트를 초기화함
    - 노드는 메시지 룹에 들어가기 전에 초기화함
    - 노드의 심볼은 웹킷이 DOM을 인스톨하자마자 추가됨
    - (즉, 웹킷에 노드의 글로벌 객체를 넣었다는 얘기)
- 웹킷의 보안 모델을 다운그레이드함
    - 웹킷은 사용자 액션에 의해서만 동작하는 기능이 있음 (예: File API)
    - 노드웹킷은 모든 스크립트는 사용자의 제스처로 동작한다고 가정함
    - 웹킷에서는 동일근원정책으로 크로스도메인 요청할 수 없음
    - 노드웹킷은 모든 페이지의 보안 토큰이 노드와 동일하게 사용함. 그리고, 로컬 페이지에 대해 전역 접근 기능을 줌.
    - (즉, 크로스도메인 요청 걱정하지 않아도 된다)



설치하기

각 OS 별 바이너리를 다운로드 받는다.

* npm으로 제공하지는 않는다.
  100% 자바스크립트 모듈은 npm 으로 설치할 수 있지만, C++ 모듈은 그렇지 않기 때문이다.

* 그래도, npm installer가 있기는 한데, 사용해보지는 않았다.


난 Mac OS 버전에서만 실행해봤다.
다운로드 받는 바이너리를 `Application` 디렉토리에 넣는다.

`node-webkit` 앱을 바로 실행하면 사파리 브라우저 같은 창이 뜬다.
여기서 개발자도구를 열면 (설정 아이콘) 콘솔에서 바로 노드의 객체를 호출할 수 있다.

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


터미널에서 작업하기 편하게 `~/.bash_profile`에 alias를 추가해두면 좋다.
# alias to nw
alias nw="/Applications/node-webkit.app/Contents/MacOS/node-webkit"



앱 만들기

기본 웹페이지를 만드는 것과 동일하고, `package.json`으로 앱의 이름과 메인 페이지만 지정해주면 된다.



트레이에 아이콘을 표시할 수 있을까?


트레이에 표시할 수 있고, 메뉴를 추가하고 click 이벤트를 할당할 수 있다.
하지만, 맥의 경우엔 click 이벤트를 할당할 수 없다.
click 이벤트를 할당할 수 없으면 의미가 없는데…

만들려고 하는 것 같다.



백단의 작업을 먼저 실행할 수 있을까?


브라우저를 띄우기 전에 뭔가 작업하게 하려 한다면,
`node-main`의 스크립트를 실행하도록 한다.



앱을 시작할 때 창을 숨길 수 있을까?


매니페스트 파일에서 `show` 속성의 값을 `false`로 설정한다.



앱 아이콘을 생성할 수 있을까?


패키징 후에 플랫폼 별로 별도로 만들어야 한다.



후기

웹 애플리케이션을 플랫폼 별로 앱으로 만들어 배포할 수 있는게 꽤 매력적이다.
그치만 아직은 안정적이진 않아서 제품에 쓰기엔 조심스럽다.
UI에서 노드 모듈을 사용할 수 있고, 파일 리소스나 디비 등에도 접근할 수 있어서,
어드민 툴로 활용하면 굉장히 유용하지 않을까 싶다.

 

 

출처: http://ohgyun.com/454 

설정

트랙백

댓글

불펌 방지 뚫기

분류없음 2013.11.11 15:50

1. 파이어폭스 설치

2. 부가기능 중 grease monkey 설치

3. http://userscripts.org/ 사이트에서 scripts > anti naver 검색 및 스크립트 설치

설정

트랙백

댓글

Mysql Binary Log 관리

MySQL 2013.11.11 15:48

Mysql은 기본적으로 바이너리 로그를 남긴다.

해당 파일은 복구시에도 사용할 수 있다.


my.cnf에 보면

log-bin=mysql-bin

을 주석처리 하지 않는다면 로그를 지속적으로 쌓을 것이다.


기본적으로 data 디렉터리에 쌓이는 것 같다.


필요치 않다면 해당 부분을 주석처리하면 된다.


복구할 때는


mysqlbinlog msyql-bin.000001 > bakcup.sql


형식으로해서 쿼리문으로 복구가 가능하다.


로그를 관리할려면 my.cnf에 아래와 같이 설정하면 된다.


binlog_cache_size      =  50M      # binlog cache 사이즈
max_binlog_size        =  500M    # bin로그 maximum 사이즈
expire_logs_days        = 3       # 로그 만료기간


바이너리 로그 리스트는


mysql> show binary logs;
mysql> show master logs;


해당 로그 파일을 삭제할 때는


mysql> purge master logs to 'mysql-bin.000010';


특정 일자기준으로 삭제할 때는


mysql> purge master logs before date_sub(CURRENT_DATE, INTERVAL 31 DAY);


my.cnf 설정 외에 환경변수를 수정해도 된다.


mysql>show variables;

에서 expire_logs_days를 보면 알 수 있다.


기본적으로는 0으로 되어 있어 삭제가 되지 않으나


mysql> set global expire_logs_days=7;

로 설정하면 7일동안 저장하고 삭제한다.


'MySQL' 카테고리의 다른 글

Mysql Binary Log 관리  (0) 2013.11.11
MySQL INSERT 속도 향상  (0) 2013.11.10

설정

트랙백

댓글

MySQL INSERT 속도 향상

MySQL 2013.11.10 16:10

열을 삽입하는데 필요한 시간은 아래의 요소들을 가지고 판단할 수가 있는데, 여기에서 보여주는 숫자는 대략적인 수치이다:

  • 연결: (3)
  • 서버에 쿼리를 보내기: (2)
  • 쿼리 파싱: (2)
  • 열 삽입: (1 × size of row)
  • 인덱스 삽입: (1 × number of indexes)
  • 마침: (1)

여기에는 테이블을 처음에 열 때 발생하는 오버헤드는 고려하지 않았는데, 이것은 동시에 구동하는 각 쿼리에 대해서 한번씩 발생을 한다.

여러분은 아래의 방법을 통해서 삽입 속도를 개선 시킬 수가 있다:

  • 만일 여러분이 같은 클라이언트로부터 동시에 많은 수의 열을 가져와서 삽입하고자 한다면, INSERT 명령문을 다중 VALUES 리스트와 함께 사용한다. 이것을 사용하면 개별적인 단일-INSERT 명령문을 사용하는 것 보다 훨씬 속도의 개선을 가져올 수가 있다. 만일 비어 있지 않는 테이블에 데이터를 추가한다면, bulk_insert_buffer_size 변수를 튜닝해서 데이터 삽입의 속도를 개선시킬 수가 있다. Section 5.2.2, “서버 시스템 변수를 참조할 것.
  • 만일 여러분이 다른 클라이언트로부터 많은 열을 가져와서 삽입을 한다면, INSERT DELAYED 명령문을 사용함으로써 속도의 개선을 얻을 수가 있을 것이다. Section 13.2.4.2, “INSERT DELAYED 신텍스를 참조할 것.
  • MyISAM 테이블의 경우, 테이블 중간에 삭제된 열이 없다면, SELECT 명령문이 구동되고 있을 때에 열을 추가할 수 있는 동시 삽입을 사용할 수 있게 된다. Section 7.3.3, “동시 삽입을 참조.
  • 텍스트 파일에서 테이블을 읽어 올 때(loading)에는, LOAD DATA INFILE을 사용한다. 이것은 INSERT 명령문을 사용하는 것보다 20배 정도 속도가 빠르다. Section 13.2.5, “LOAD DATA INFILE 신텍스를 참조할 것.
  • 추가적인 작업으로는, 많은 수의 인덱스를 가지고 있는 MyISAM 테이블에 대해서 보다 빠른 LOAD DATA INFILE을 만들 수가 있는데, 이렇게 하기 위해서는 아래의 과정을 따라 진행한다:

1.       CREATE TABLE을 사용해서 선택적으로 테이블을 만든다.

2.       FLUSH TABLES 명령문 또는 mysqladmin flush-tables 명령어를 실행한다.

3.       myisamchk --keys-used=0 -rq /path/to/db/tbl_name를 사용한다. 이것은 테이블에 대한 모든 인덱스 사용을 제거한다.

4.       LOAD DATA INFILE을 사용해서 데이터를 테이블에 삽입시킨다. 이것은 어떠한 인덱스도 업데이트를 시키지 않기 때문에 속도가 매우 빠르게 된다.

5.       만일 여러분이 나중에 테이블에서 데이터를 읽기만 할 생각이라면, 이것을 압축하기 위해서는 myisampack를 사용한다. Section 14.1.3.3, “압축된 테이블의 특성을 참조할 것.

6.       myisamchk -rq /path/to/db/tbl_name를 사용해서 인덱스를 다시 생성 시킨다. 이것은 디스크에 기록을 하기 저에 메모리에 인덱스 트리를 먼저 생성을 하는데, 이렇게 하는 것이 LOAD DATA INFILE를 실행하는 동안 인덱스를 업데이트하는 것을 보다 빠르게 만들게 되는데, 그 이유는 이것이 디스크 검색을 피하기 때문이다. 그 결과 인덱스 트리 또한 완벽하게 균형이 잡히게 된다.

7.       FLUSH TABLES 명령문 또는 mysqladmin flush-tables 명령어를 실행한다.

여러분이 데이터를 삽입 시키는 MyISAM 테이블이 비어 있을 경우에는, LOAD DATA INFILE은 앞에서 설명하는 최적화 동작을 자동으로 실행한다는 점을 알아두자.

여러분은 myisamchk을 사용하는 대신에 아래의 명령문을 사용해서 MyISAM 테이블에 대한 인덱스를 비활성화 또는 활성화 시킬 수도 있다. 만일 이 명령문을 사용한다면, 여러분은 FLUSH TABLE 동작을 하지 않아도 된다:

ALTER TABLE tbl_name DISABLE KEYS;
ALTER TABLE tbl_name ENABLE KEYS;
  • 비 트랜젝셔널 테이블에 대해서 다중 명령문과 함께 실행되는 INSERT 연산의 속도를 향상 시키기 위해서는, 여러분의 테이블에 대해 잠금을 실행한다:
·                LOCK TABLES a WRITE;
·                INSERT INTO a VALUES (1,23),(2,34),(4,33);
·                INSERT INTO a VALUES (8,26),(6,29);
·                ...
·                UNLOCK TABLES;

이렇게 함으로써 속도를 개선 시킬 수가 있는데, 그 이유는 인덱스 버퍼는 모든 INSERT 명령문이 실행이 완료된 후에 디스크에 오직 한번만 플러시 되기 때문이다. 보통의 경우, INSERT 명령문의 개수만큼의 인덱스 버퍼 플러시가 생기게 된다. 만일 여러분이 단일 INSERT 명령문만을 가지고 모든 열을 삽입할 수가 있다면, 명확한 잠금 명령문은 필요하지 않게 된다.

트랜젝셔널 테이블에 대해서, 보다 빠른 삽입 성능을 얻기 위해서는, LOCK TABLES를 사용하는 대신에, 여러분은 START TRANSACTION COMMIT를 사용해야 한다.

출처: http://blog.naver.com/gckcs2?Redirect=Log&logNo=10020613837


'MySQL' 카테고리의 다른 글

Mysql Binary Log 관리  (0) 2013.11.11
MySQL INSERT 속도 향상  (0) 2013.11.10

설정

트랙백

댓글

logwatch 시스템 로그 메일로 받기

리눅스 2013.11.08 11:06

logwatch 시스템 로그 메일로 받기

 

1. logwatch 설치 확인
[root@byungun ~]# rpm -qa | grep logwatch
logwatch-7.3-8.el5

 

2. logwatch 설치
[root@byungun ~]# yum install logwatch

 

3. logwatch 설정 파일
/usr/share/logwatch/default.conf/logwatch.conf :
설정 파일
/etc/cron.daily/0logwatch :
크론(하루에 한 번 구동)

 

4. 메일주소 변경(받는 메일)
[root@byungun ~]# vi /usr/share/logwatch/default.conf/logwatch.conf
---------------------------------------------------------------------
# Default Log Directory
# All log-files are assumed to be given relative to this directory.
LogDir = /var/log

 

# You can override the default temp directory (/tmp) here
TmpDir = /var/cache/logwatch

 

# Default person to mail reports to. Can be a local account or a
# complete email address.
#MailTo = root
MailTo =
webmaster@sangchul.kr
# Default person to mail reports from. Can be a local account or a
# complete email address.
MailFrom = Logwatch
---------------------------------------------------------------------

 

5. 보내는 메일 도메인 변경
[root@byungun ~]# vi /etc/hosts
---------------------------------------------------------------------
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1               byungun byungun.secdns.co.kr localhost
#127.0.0.1              byungun localhost.localdomain localhost
::1             localhost6.localdomain6 localhost6
---------------------------------------------------------------------

 

6. 메일 보내기(메일 테스트)
[root@byungun cron.daily]# cd /etc/cron.daily
[root@byungun cron.daily]# ./0logwatch

 

출처: http://sangchul.kr/194

 

 

설정

트랙백

댓글

MySQL INSERT 성능 향상

리눅스 2013.11.07 15:16

MySQL 테이블에 INSERT 구문을 수행 시킬때 성능을 향상시킬 수 있는 방법입니다.

여러 데이터를 INSERT 구문으로 수행시 VALUES 리스트를 다중으로 사용하는것이 개별적으로 INSERT것보다 빠릅니다. 비어 있지 않은 테이블에 INSERT를 수행한다면 my.ini 파일 안에 bulk_insert_buffer_size 를 변경하여 속도를 개선 시킬 수 있습니다.

INSERT INTO `테이블` (필드1, 필드2) VALUES ('값1', '값2'),('값1', '값2')...('값1', '값2');

# My.ini 파일 내에 bulk insert buffer size를 변경하고 MySQL을 재시작 합니다.
bulk_insert_buffer_size = 64M

여러 클라이언트에서 대량의 데이터를 삽입을 한다면 INSERT DELAYED 명령문을 사용하면 속도를 개선 할 수 있습니다. 서버로 부터 수행 응답을 받은 후 큐에 적재 후 테이블에 사용이 되지 않을때 테이블에 삽입이 됩니다.  INSERT DELAYED 는 MyISAM, MEMORY, ARCHIVE 테이블에서 사용 가능합니다. 그외 테이블에서는 성능 저하가 발생 할 수 있습니다. affected row 값은 테이블이 바쁘지 않을때는 정확한 값을 출력을 하나 그렇지 않을때는 1의 값을 반환을 합니다. DELAYED 이외에 LOW_PRIORITY, IGNORE, HIGI_PRIORITY 등을 이용하여 작업의 순위, 중복 오류등을 무시 할 수 있습니다.
LOW_PRIORITY : 최 하위 순위로 INSERT구문을 수행합니다. 다른 클라이언트의 SELECT가 종료된 후 수행합니다.
IGNORE : 키 중복 (PRIMARY KEY, UNIQUE KEY)의 오류를 무시하고 진행합니다.
HIGH_PRIORITY : 최 우선 작업으로 INSERT구문을 수행합니다.

INSERT DELAYED 구문을 수행할때에는 Slave replaction 와는 다른 데이터를 가질 수 있습니다.
INSERT DELAYED INTO `테이블` (필드1, 필드2) VALUES ('값1', '값2'),('값1', '값2')...('값1', '값2');

대량의 데이터를 삽입을 할때는 LOAD DATA INFILE 을 사용합니다. 대량의 데이터를 INSERT 구문을 이용해서 삽입을 하는것 보다, 필드 구분자로 분리가된 LOAD DATA INFILE 을 이용하면 INSERT 구문보다 매우 빠른 동작을 합니다.

Slave Replaction 에 동일한 구문이 전달이 가능하고 INSERT가 가능합니다.
-- 필드 구분이 , (쉼표) 로 되어 있고 라인 구분이 개행으로 되어 있을때 아래와 같이 수행하면 됩니다.
LOAD DATA INFILE '파일경로' INTO TABLE `테이블명` FIELDS TERMINATED BY ',' LINES TERMINATED By '\r'

INDEX가 많이 사용된 테이블에 대량으로 INSERT 구문 시 INDEX를 비활성화 한 후 수행을 하는것이 좋습니다. 한개의 열을 삽입하고 인덱스를 계산 후 다시 다른 행을 삽입하는 것 보다는 전체 키를 비 활성화 한 후에 데이터 입력이 종료되고 다시 키를 활성화 시키는것이 전체적으로 빠른 수행을 할 수 있습니다.
-- 테이블의 INDEX를 비활성화 시킵니다.
ALTER TABLE `테이블` DISABLE KEYS;
-- 대량 INSERT 구문을 수행합니다.
INSERT INTO `테이블` VALUES ('값1', '값2')....;
.....
INSERT INTO `테이블` VALUES ('값1', '값2')....;
-- 수행이 종료된 후 다시 INDEX를 활성화 시킵니다. 
ALTER TABLE `테이블` ENABLE KEYS;

트랜젝션이 지원하지 않는 테이블PROCEDURE , FUNCTION , 다중 쿼리문 에서 수행되는 INSERT연산의 속도를 향상 시키기 위해서는 테이블 잠금을 실행하여 속도를 향상 시킬 수 있습니다. 인덱스 버퍼 플러시를 매번 수행하지 않고 모든 INSERT 구문의 모든 열이 삽입 되었을때 인덱스 버퍼 플러시가 이루어져 성능향상이 됩니다.
-- 테이블의 WRITE 잠금을 수행합니다.
LOCK TABLES `테이블` WRITE;
-- 대량 INSERT 구문을 수행합니다.
INSERT INTO `테이블` VALUES ('값1', '값2')....;
.....
INSERT INTO `테이블` VALUES ('값1', '값2')....;
-- 테이블의 WRITE 잠금을 해제 합니다.
UNLOCK TABLES `테이블` WRITE;

트랜젝션이 지원하는 테이블에서는 START TRANSACTION 과 COMMIT을 활용하면 성능이 향상이 됩니다.

위와 같이 MySQL INSERT 수행시 성능을 향상시킬 수 있습니다.
참고 : MySQL 메뉴얼 (Speed of INSERT Statements)

 

출처: http://www.lovelgw.com/Blog/225

설정

트랙백

댓글