2014년 3월 24일 월요일

Javascript, prototype, [[Prototype]]

자바스크립트에는 프로토타입이라는 특이한 요소가 있다.
이 프로토타입이 혼동스러운 가장 큰 이유는 우리말로는 프로토타입 하나지만,
실제 자바스크립트에는 prototype과 [[Prototype]] 두 개가 존재하기 때문이다.
주변에 접할 수 있는 책에서 '프로토타입 객체'라고 하면 prototype을 말하는 것일까 아니면 [[Prototype]]을 말하는 것일까?
솔직히 내가 읽은 여러권의 책으로는 그때그때 달랐다.. 이다. ㅠㅜ
그래서 한 번 명확하게 정리 해봤다.
함수 객체에만 존재하는 prototype 객체와 모든 객체에 존재하는 [[Prorotype]] 객체로 나누어 기술한다.

정리하다가 특이한 점을 하나 더 발견했는데, prototype 객체의 constructor는 실제 그 prototype 객체를 생성한 함수가 아니라는 점이다!!!!
---------------------
  • new를 통해 생성된 객체는 [[Prototype]] 객체를 가진다.
  • new를 통해 생성된 객체의 [[Prototype]] 객체는 생성자 함수의 prototype 객체다.
  • 모든 객체는 new를 통해 생성된다.(리터럴을 쓰더라도 내부적으로는 new를 통해 생성)
  • 따라서 모든 객체의 [[Prototype]] 객체는 생성자 함수의 prototype 객체다.

  • 모든 함수 객체의 constructor는 Function 객체다.
  • 모든 함수 객체만 prototype 객체를 가진다.
  • 함수 객체도 객체다.
  • 따라서 함수 객체는 prototype 객체와 [[Prototype]] 객체를 모두 가진다.
  • prototype 객체는 constructor와 [[Prototype]]라는 property만을 가지고 있는 객체로서, 함수 객체가 아니다.
  • 따라서 일반적인 함수 객체의 prototype 객체와 [[Prototype]] 객체는 당연히 다르다.
  • 다만 Function 객체만 예외적으로 prototype 객체와 [[Prototype]] 객체가 같다.

  • 일반적인 객체의 constructor는 그 객체를 생성하는데 사용된 생성자 함수 객체다.
  • prototype 객체는 실제로 Object 함수에 의해 생성되지만, prototype 객체의 constructor는 Object 함수가 아니라, 그 prototype 객체를 'prototype'이라는 이름의 property로 가지고 있는 함수 객체다.
  • 따라서 prototype 객체의 [[Prototype]]은 constructor의 prototype 객체가 아니라 실제 prototype 객체를 생성한 Object 함수의 prototype 객체다.

  • 이름 있는 함수의 prototype 객체는 그 함수의 이름으로 표시되지만, 그 함수 객체와는 다른 객체다.
  • 이름 없는 함수의 prototype 객체는 Object라는 이름으로 표시되지만, 일반적으로 말하는 Object 객체와는 다른 객체다.

아래의 값은 모두 참이다. 
  [[Prototype]]는 표기법이며, 브라우저에 따라 예약어가 다르다.
  크롬이나 파이어폭스에서는 [[Prototype]] 대신 __proto__라고 쓰면 된다.

  • var obj = {}, func = function func() {};

  • obj.[[Prototype]] === obj.constructor.prototype
  • func.prototype.[[Prototype]] !== func.prototype.constructor.prototype // <- prototype 객체의 constructor와 실제 prototype을 생성하는데 사용된 생성자 함수가 다르다!!
  • func.prototype !=== func.[[Prototype]]

  • Function.prototype.constructor === Function
  • Function.[[Prototype]].constructor === Function
  • Function.prototype === Function.[[Prototype]]
  • Function.constructor === Function
  • Function instanceof Object
  • Object instanceof Function
  • Object.prototype.constructor === Object

2014년 3월 14일 금요일

Cygwin 로컬 파일 권한 문제

Cygwin 로컬 파일 권한 문제

cygwin을 windows 7에 설치하여 원격 서버에 붙이는 터미널 용도로만 사용하면 괜찮은데, 직접 로컬에서 사용하면 아래와 같이 로컬 파일의 권한이 전혀 주어지지 않는 문제가 있다.
해결 방법은.. 의외로 쉽다.
풀어 쓰면, cygwin에서
vi /etc/fstab
해서 아래와 같이 noacl 만 추가해 주고 저장 후
cygwin을 재시작 하면 된다.

2014년 3월 8일 토요일

리눅스 Tomcat 한글 깨짐

리눅스에서 설치하는 TOMCAT은 기본 인코딩이 UTF-8이 아니라서 설정 해주지 않으면 한글이 깨져나온다.
아래의 내용은 TOMCAT 7.0.47 을 기준으로 작성하였다.

소스 레벨의 처리

HTML

  • HTML5의 경우
    <!DOCTYPE html>
    <html lang="ko">
    <head>
        <meta charset="utf-8"/>
    ...
    
  • 그 외
    ...
    <head>
        <META HTTP-EQUIV="contentType" CONTENT="text/html;charset=UTF-8">
    ...
    

Servlet

  • doPost() 나 doGet() 안에
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        request.setCharacterEncoding("UTF-8");
    
        // 파라미터 받는 부분 utf-8 사용
        String keyword = request.getParameter("keyword");
        String urlEncodedKeyword = URLEncoder.encode(keyword,"utf-8");
    

JSP

  • 페이지 상단 지시자 지정 부분에
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    

서버 설정 처리

server.xml

TOMCAT/conf 에 있는 server.xml 의 connector 지정 부분(70행 쯤에 있다)에 아래와 같이 URIEncoding를 추가하여 지정해준다.

setenv.sh

TOMCAT/bin 디렉토리에 setenv.sh 라는 파일을 새로 만들어 아래 내용 추가하여 기본 파일 인코딩을 utf-8로 지정해 주고 TOMCAT 재시작
    #!/bin/bash
    JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=\"utf-8\""
이렇게 하면 되는 이유는 TOMCAT/bin/catalina.sh 를 열어보면 알 수 있다.
약 23행 정도에 아래와 같은 내용이 있다.
TOMCAT 실행 관련 환경변수는 직접 catalina.sh 에 추가하지 말고, TOMCAT/bin/setenv.sh 에 작성하라고 되어 있다. 실제 스크립트에 setenv.sh를 체크하는 부분이 작성되어 있다.

2014년 2월 13일 목요일

Great D3 book - Data Visualization with D3.js Cookbook






This is so well organized book about D3 data visualization.

Starting from the development environments, it explains Selection, Data Joining, which are the key concepts of D3. Then it begins to show how to draw charts with Scale and Axis. And you can enjoy the real splendid part of D3 like Layout, Interactiveness, Force and so forth.

I could follow this book in pretty good pace, because its simple but essential examples. That's the another good point of this book, so don't have to give up reading this book to the end.

And the author himself made a good D3 library like dc.js which gives great interactiveness to D3. Maybe that's the reason the author has the great insight about D3.

Actually I'm translating other D3 book, which has splendid examples, but is somewhat lack of simpleness. I would be far happier if I was translating this book.

If I have to recommend only 1 book for learning D3, this book will be.

2014년 1월 27일 월요일

윈도우 Git Bash 한글 문제

윈도우 Git Bash 한글 문제

http://git-scm.com/에서 Git를 내려받아 설치하면 Git Bash를 사용할 수 있는데, 두 가지의 한글 문제가 있다.

ls 할 때 한글이 깨져 나온다

증상

해결방법

C:\Users\<사용자ID>\.bashrc 파일을 만들어 아래 내용을 입력하고 저장한 후 git bash를 재실행한다.
alias ls='ls -al --color=auto --show-control-chars'
탐색기에서는 C:\Users\<사용자ID>\.bashrc 파일을 만들 수 없는 경우가 있는데, notepad++ 등 에디터에서 새 문서를 만들어 위 내용을 입력하고 다른 이름으로 저장하기.. 에서 위 이름으로 저장하면 된다.

참고

2014-01-27 현재 검색을 해보면 Git설치디렉토리/etc/inputrc를 편집하라는 정보가 있지만 그렇게하면 alias의 첫글자인 'a' 키를 git bash에서 입력할 수 없게 되고 한글 문제도 해결되지 않는다.

git status 할 때 한글이 깨져 나온다

증상

해결 방법

git bash 창에서 아래의 명령을 실행한다.
git config --global core.quotepath false
참고로 Git의 global 스코프 config 파일은 C:\Users\<사용자ID>\.gitconfig 이다.

2014년 1월 21일 화요일

ReviewBoard 사이트 생성

리뷰보드 사이트 생성

리뷰보드 사전 설치 사항 및 리뷰보드의 설치가 완료되었으면, 실제 웹에서 리뷰보드를 수행할 사이트를 생성해야 한다.
사이트 생성 과정에서 웹 애플리케이션 파일들, 업로드/다운로드할 위치 설정, 데이타베이스 테이블 생성 등 웹 서비스를 위한 설정을 수행한다.

사이트 생성 명령 실행

sudo mkdir /var/www/

sudo rb-site install /var/www/rb-test.apexsoft.co.kr

필요 모듈 확인

PostgreSQL 관련 안내가 나오나, MySQL이 설치되어 있으므로 무시하고 Next

도메인 네임

리뷰보드 접속을 위한 URL을 입력한다. 서버의 경우 적절한 도메인을 http:// 와 포트 번호 없이 입력하고, 로컬에 테스트용으로 설치하는 경우 localhost 로 입력한다.

URL path

앞에서 정한 서버 도메인 다음에 이 사이트에 접속하기 위한 URL path 를 지정한다.

사이트 설치 파일들이 저장될 위치

기본값인 static 그대로 둔다.

리뷰보드를 통해 업로드한 파일이 저장될 위치

기본값인 media 그대로 둔다.

사용할 DBMS 선택

mysql 선택

사용할 데이타베이스 이름

리뷰보드 사전 설치 사항 중 MySQL 설치 과정 마지막에 리뷰보드를 위해 생성했던 데이타베이스 이름을 입력한다.

DBMS 주소

기본값인 localhost 그대로 둔다.

DB 사용자 계정 입력

리뷰보드 사전 설치 사항 중 MySQL(또는 MariaDB) 설치 과정 마지막에 리뷰보드를 위해 생성했던 데이타베이스에 대한 전체 권한을 가진 계정 정보를 입력한다.

캐쉬 방식 지정

기본값인 memcached 그대로 둔다.

memcached 위치 및 포트 지정

기본값인 localhost:11211 그대로 둔다.

웹 서버 지정

기본값인 apache 그대로 둔다.

파이썬 로더 모듈 지정

기본값인 wsgi 그대로 둔다.

사이트 관리자 계정 생성

사용자명, 비밀번호, 메일주소 입력

사이트 생성 작업 진행

아래와 같이 사이트 생성이 진행된다

사이트 생성 작업 완료

아래와 같이 사이트 생성이 완료된다.

MySQL UTF-8 설정

MySQL의 Character Set 확인

mysql -u root -p
로 DBMS에 접속 후
mysql> status;
를 치면 아래와 같이 character set 확인 가능
최초 설치 직후에는 위와 같이 Server와 Db가 latin1으로 설정되어 있다.

MySQL의 한글 설정

기본 character set 은 utf8이 아니라 latin으로 되어있으므로 /etc/mysql/my.cnf 파일을 열어 [mysqld] 란에 아래의 내용을 추가하고
character-set-server=utf8
collation-server=utf8_general_ci
MySQL을 재시작 한다.
sudo service mysql restart
mysql 클라이언트로 접속 하여
mysql> status;
를 실행하면 Server/Db/Client/Conn. 의 characterset이 모두 utf8로 되어 있는 것을 확인할 수 있다.

리뷰보드 용 데이타베이스의 한글 확인

mysql 클라이언트에서 아래의 명령을 실행한다.
mysql> use <database이름>;
mysql> status;
Db가 latin1으로 되어있으므로 한글 설정을 해준다.

리뷰보드 용 데이타베이스의 한글 설정

mysql 클라이언트에서 아래의 명령을 실행한다.
mysql> alter database <database이름> default character set = utf8
status를 치면 Server/Db/Client/Conn. 의 characterset이 모두 utf8로 되어 있는 것을 확인할 수 있다.

사이트 접속 설정

사이트 생성이 완료되면 웹 서비스를 위해 폴더 권한 설정 및 웹 서버 설정을 해야한다.

권한 설정

sudo chown -R www-data /var/www/rb-test.apexsoft.co.kr/htdocs/media/uploaded
sudo chown -R www-data /var/www/rb-test.apexsoft.co.kr/data

웹 서버 설정

rb-site 는 /var/www/rb-test.apexsoft.co.kr/conf/ 에 샘플 설정 파일을 제공한다. 대부분의 경우 이 샘플 설정으로도 잘 동작하지만, 현재 웹 서버 설정에 따라 수정이 필요할 수도 있다.
설정 파일은 사용하는 웹 서버 종류와 파이썬 모듈 로더의 종류에 따라 여러가지로 제공된다.
여기서는 아파치 웹 서버와 wsgi 를 사용했으므로 conf/apache-wsgi.conf 파일을 기준으로 설명한다.
아래의 설정이 끝난 후 아파치를 재시작하면 사이트에 접근할 수 있다.

아파치 설정 디렉토리에 sites-available 디렉토리가 있는 경우

아파치 설정 폴더 아래에 sites-available 폴더가 있다면(ex: /etc/apache2/sites-available), apache-wsgi.conf 파일의 이름을 사이트명으로 바꿔주고, sites-available 디렉토리에서 그 conf 파일에 심볼릭 링크를 생성해야 한다.
아래는 위에서 설명한 경우에 대한 예이다.
$ cd /etc/apache2/sites-available
$ sudo cp /var/www/rb-test.apexsoft.co.kr/conf/apache-wsgi.conf rb-test.apexsoft.co.kr.conf
$ cd ../sites-enabled
$ sudo ln -s ../sites-available/rb-test.apexsoft.co.kr.conf .
여기까지 하고 브라우저에서 확인해도 404 나온다.
아래 명령으로 아파치를 재시작 한다.
apachectl -k graceful
혹시 위 명령 수행 시 아래와 같은 에러메시지가 나는 경우
아래의 명령을 수행하여 wsgi 모듈을 재설치 한다.
sudo apt-get purge libapache2-mod-wsgi
sudo apt-get install libapache2-mod-wsgi
libapache2-mod-wsgi 설치 시 아파치를 재시작하므로 별도로 재시작 할 필요는 없다.

sites-available 디렉토리가 없는 경우

이 경우에는 설정 파일(apache-wsgi.conf)을 아파치 전체 설정 파일(보통 /etc/apache2/apache2.conf 또는 /etc/httpd/httpd.conf)에 Include 구문을 사용하여 포함시켜야 한다.
apache2.conf 의 제일 마지막행에 아래 내용 추가
Include /var/www/rb-test.apexsoft.co.kr/conf/reviews.example.com.conf
아파치를 재시작 한다.
apachectl -k graceful
apache 재시작 오류 시 아파치 설정 디렉토리에 sites-available 디렉토리가 있는 경우의 마지막 부분을 참고하여 wsgi 모듈을 재설치 한다.

리뷰보드 사이트 접속

http://localhost/rb-test 로 접속하면 아래와 같은 화면이 로딩된다.
화면의 안내에 따라 아래 명령을 실행한다.
sudo chown -R www-data "/var/www/rb-test.apexsoft.co.kr/htdocs/media/ext"
접속화면을 새로고침 하면 아래와 같이 리뷰보드 로그인 창이 뜬다.
로그인 하면 아래와 같은 창이 뜬다.

참고

리뷰보드 사이트 생성은 위와 같이 GUI 버전 외에 터미널로도 생성할 수 있다.
아래 그림들을 참조한다. 생성 후의 특정 디렉토리 권한 변경 등은 GUI 버전 설치 설명을 따른다.