사실 설치형 블로그로 별도의 가상서버에서 운영하고자 하는 계획은 예전부터 있었지만.. 


티스토리의 매력때문에 이동하지 못하고있었습니다. 


해당 블로그에서 이제 http://blog.kazikai.net/ 로 이전 했습니다. 

소소한 개발 이야기를 올릴 생각입니다. 


'포스팅' 카테고리의 다른 글

블로그 이전  (0) 2015.11.24
facebook이 native app으로 전환 하게 된 이유?  (0) 2012.10.08
synergy 설치  (0) 2012.09.13
국가스텐-비트리올  (0) 2010.10.22
삼성 전자 , 갤럭시 Q 연말 출시 예정!!  (0) 2010.06.21
커피 종류에 따른 알기 쉬운 그림  (0) 2010.05.17
by kazikai kazikai 2015.11.24 22:23

ssh를 쓰다보면 서버가 재설치 되었을때 클라이언트에서 ssh 오류가 발생하게 된다. 


SSH connection problem with “Host key verification failed…” error

위와 같은 오류가 나는데 해결법은 생각보다 간단하다. 


terminal에서 


$ ~/.ssh/known_hosts

를 텍스트 에디터로 열어서


접속하려는 host 정보를 지워 주면 된다. 



by kazikai kazikai 2013.10.30 15:36

이번 Mac의 OS/X 가 매버릭스로 업데이트 하면서 접근성관련 메뉴가 변경되어 잘사용하고있던 Synergy가 동작하지 않는 버그가 이따. 


해결방법을 찾아봤지만 제대로 된 (한글로된) 문서는 없어서 적어보고자 한다. 


참조는 

http://sysadministration.wordpress.com/2013/10/23/synergy-fatal-error-in-mac-osx-mavericks/

위 링크에서 하였다. 


방법을 설명하자면, 바뀐 접근성을 다시 enable시켜주고 일단 터미널로 우회 해서 시너지를 실행 시키는 것이다. 


순서는 다음과 같다. 


1. 터미널 실행 

2. $  /Applications/Synergy.app/Content/MacOS/Synergy  

3. 위 2번을 타이핑 하면 시너지가 실행 될텐데 아마 오류가 생성이 될것이다. 

4. 보안/개인정보 로 가서 synergy와 터미널을 enable시켜줘야 한다. ( 접근성에서) 만약 다른 터미널 프로그램을 사용한다면 해당 터미널 프로그램도 enable 

5. 다시 /Applications/Synergy.app/Content/MacOS/Synergy & ( & 는 백그라운드 실행) 


이래도 오류가 난다면 config의 screen name을현재 사용하고 있는 mac 이름과 일치시켜야 한다. 


난 위 스크린 네임을 변경해서 사용하고있었는데 위와 같은 방법으로 하면 맥 이름과 서버 스크린 네임이 무조건 동일해야 한다 





by kazikai kazikai 2013.10.30 10:12

원문 : 

https://github.com/senxation/JavaScript-Weekly-Korean/blob/master/korean/146.markdown



특집 기사

Ember 1.0 출시

첫번째 커밋 이후에 2.5년이나 지난 인기있는 자바스크립트 웹 어플리케이션 프레임워크 Ember가 1.0을 출시하였습니다. Ember 1.0에서 2.0이 될때 까지 더 이상 큰 변화를 하지 않겠다고 약속했습니다. 1.0을 출시한 Ember의 모든팀을 축하 해주세요

Node Weekly 2호: 생성자, 비동기 패턴, 홈 오토메이션와 그 이상의 것들

Node Weekly를 지난주 뉴스레터에서 출시했습니다. Node Weekly 가 다루고 있는 분야를 확인 해보세요


스폰서기사

Frontend Masters: 이안 존슨(Ian Johnson)이 직접 진행하는 D3.js를 사용한 데이터 시각화 실시간 온라인 워크샵

이번 워크샵에서는 D3의 API를 살펴보고 D3 설계에서 쉽게 알아내기 힘든 부분에 대해 알아볼 것입니다. 표현해야 할 다양한 데이터에 적용할 수 있는 여러 가지 패턴을 살펴볼 예정입니다. 9월 20일 금요일 온라인 생방송을 기대하세요.


읽을 거리

AngularJS 지침서: 최신 웹 앱을 만드는 방법 배우기

AngularJS, Node, Express와 MongoDB를 사용해 완전한 애플리케이션을 만들기위한 대규모의 지침서/가이드

점진적인 향상: Zed는 죽었다

Tom은 "브라우저는 놀라운 인터랙티브 문서 뷰어가 되는것에서 세상에서 가장 진보되고, 널리 배포된 애플리케이션 런타임으로 변모하고 있다"고 언급합니다. 그리고 100% 자바스크립트 애플리케이션을 만드는데 부끄러워할 필요가 없다고 말합니다.

ECMAScript 6 초안 스펙 리비전 18

리비전 18은 리비전 17에 비해 새로운 기술적인 내용은 없지만 완전히 재구성되었습니다. ES6 스펙이 중요하다고 생각한다면, 이 문서에 익숙해지를 원하시겠죠.

ES6 반복자, 제네레이터, 그리고 Iterables

ES6의 반복과 관련된 개념에 대한 용어들에 대한 간단한 가이드문서입니다.

API를 위해 Express.js 사용하기

예제 앱과 함께, Express.js로 RESTful API를 만들고 문서화하기 위한 몇가지 팁과 라이브러리를 공유합니다.

Node.js에서의 ES6

최신 버전의 Node에서 다양한 ECMAScript 6와 Harmony 기능들을 사용하는 방법을 살펴봅니다.

Angular의 방식

Nicolas Bevacqua는 그의 웹 애플리케이션이 "Angular의 방식"으로 처리했을 때 더 개선되었다고 말하면서 AngularJS의 이점을 대부분 이용하는 팁들을 공유합니다.

자바스크립트의 변수와 함수 호이스팅

새로운 자바스크립트 개발자들에게 자바스크립트의 교묘한 점중 하나는, 변수와 함수가 "호이스팅"된다는 사실입니다. 초보자들을 위해 호이스팅이 어떻게 동작하는지 간단하게 살펴봅니다.

5가지 실질적인 예제로 AngularJS 배우기

자바스크립트의 감싸진 고차함수(Nested Higher-Order Functions)

자바스크립트 200줄로 만든 VNC

ES6 스타일 자바스크립트 LINQ

CoffeeScript는 미래가 있을까?

자바스크립트 디버깅에 대한 초보 개발자 가이드


동영상

Ember.js 애플리케이션 제작하기

Ember.js 1.0을 사용하여 블로그 리더 어플리케이션을 제작하는 과정을 담은 27여분의 영상입니다.

Bower에 대한 간단한 소개

자바스크립트 라이브러리들의 디펜던시 관리와 패키징을 해주는데 유명한 Bower의 간단한 소개입니다. Egghead.io 개발자 John이 3분의 짧은 영상에 담았습니다.

QUnit을 이용한 동기/비동기 자바스크립트 콜백 테스트 하기

자바스크립트 단위 테스트 프레임워크인 QUnit을 이용하여 자바스크립트 콜백 테스트를 하는 밥업에 대한 영상 입니다. 약 5분의 영상입니다.


코드, 라이브러리들과 도구들

jquery-textcomplete: Textarea를 위한 자동완성

GitHub의 코멘트 폼과 같이 textarea 필드에서 사용할 수 있는 자동완성 기술입니다.

스탠포드 자바스크립트 암호 라이브러리

자바스크립트에서 암호 작성시 안전하고 강력하며 빠르고 사용하기도 쉬운 크로스 브라우저 지원 라이브러리를 만드는 프로젝트입니다.

parse5: Node를 위한 빠르고 완전한 기능을 갖춘 HTML5 파서

WHATWG HTML5 스펙을 기반으로 하며, Node Weekly에도 소개되었습니다.

xdomain: 순수 자바스크립트를 이용한 CORS의 대안

Cleaver: 해커를 위한 30초 슬라이드쇼

마크다운으로 만드는 깔끔하고 빠르며 훌륭한 슬라이드덱입니다.

dna.js Template Cloner: jQuery를 위한 DOM 템플릿 엔진

JSON 객체 형식의 데이터에서 DOM 엘리먼트를 동적으로 만들어 주는 자바스크립트 템플릿 엔진입니다.

LeapTrainer.js: Leap Motion을 위한 제스쳐를 학습하고 인식시키는 프레임워크

Fortune.js: 리치 하이퍼미디어 API 프로토타이핑을 위한 웹 프레임워크

Histogram.js: 배열 정보의 빈도수 정렬


일자리

Backbase에서 근무할 시니어 프론트엔드 웹 개발자 @ 네덜란드, 암스테르담

Backbase는 암스테르담에 본사를 둔 국제적으로 빠르게 성장하고 있는 포털 소프트웨어 판매사입니다. 암스테르담의 팀에서 근무할 시니어 프론트엔드 웹 개발자를 찾고 있습니다. 자바스크립트, CSS, HTML5을 능숙하게 사용할 수 있나요? Backbase로 오세요.

소프트웨어 개발자 (자바스크립트 또는 자바) - 연구/개발직 @ 오스트리아 비엔나

젊고 여러 분야의 인력들로 구성된 팀에서 수상 경력이 있는 연구 프로젝트에 참여하세요. 풀타임/파트타임 근무 가능하며 시각적 분석, 웹 인텔리전스, 공동 지식 창출에 집중할 혁신적인 자바(스크립트) 개발자에 지원할 박사 과정 지원자를 찾습니다.

OrderGroove에서 근무할 자바스크립트 제다이 (프론트엔드 기술 리더) @ 뉴욕주, 뉴욕시

OrderGroove는 구독방식의 e커머스 혁명을 주도하고 있습니다. 우리는 애자일 팀으로 세계 최대의 브랜드를 판매하고 수백만 사용자의 삶을 변화시킬 우리의 구독 방식 소매 플랫폼을 만들 수 있는 '포스'를 지니고 있는 월드클래스의 JS 해커를 찾고 있습니다.


마지막으로,

무료 e북: 더 빠른 ASP.NET 애플리케이션의 25가지 비밀

여러분의 ASP.NET 애플리케이션의 속도를 개선하길 원하시나요? 개발 커뮤니티와 ASP.NET MVP로부터 여러분이 만든 웹 애플리케이션의 최대 성능을 이끌어낼 수 있는 25가지 팁을 추려 Red Gate사의 새로운 e북에 담았습니다. 무료 e북을 다운로드 하세요.

console.logtro: 세계 최초의 console.log 데모

자바스크립트 콘솔에서 실행되는 작은 컴퓨터 아트 스타일의 데모입니다.

'JavaScript Weekly번역' 카테고리의 다른 글

JavaScript Weekly 146호  (0) 2013.10.22
JavaScript Weekly 145호  (0) 2013.10.22
JavaScript Weekly 번역  (0) 2013.10.22
by kazikai kazikai 2013.10.22 10:54

원문 : https://github.com/senxation/JavaScript-Weekly-Korean/blob/master/korean/145.markdown


특집 기사

Ember.js 1.0 의 전망: 마침내 이번 주에 출시?

만약 당신이 Ember 의 팬이라면 다음주 JavaScript Weekly를 살펴 보세요. 마침내 Ember 1.0 이 릴리즈 됩니다. (8/31). 해당 포스트에서 Ember의 메인 개발자인 Tom Dale이 방대해진 1.0에 다가서기 위해 필요한 모든 것들을 공유합니다.

Yeoman 1.0 출시: 최신 WebApp들을 위한 워크플로우

yo 는 독립적인 스캐폴딩(개발의 기본이 되는 뼈대와 환경을 구축해주는 기술) 툴 입니다. 더 나은 generator 시스템, 성능 향상, 설치 과정의 자동화가 추가 되었습니다. 단지 yo 를 실행하는 것 만으로 새로운 도움말 프롬프트 시스템을 사용할 수 있습니다. (generator를 업데이트 하거나, 설치하거나, 도움말을 찾는 기능을 가집니다.) 예전 버전에 비하여 추가된 부분은 위 링크의 Hightlights를 보시면 됩니다. Addy Osmani가 5분 분량의 발표영상을 통해서 Yeoman의 미래에 대해 공유 합니다.


읽을 거리

ECMAScript 국제화 API

ECMAScript 국제화(Internationalization) API (ECMA-402)가 ECMAScript 5.1이나 그 이후버전에서 동작하도록 설계되었습니다. 이 API는 collation(문자열 비교), 숫자 포맷팅, 그리고 날짜와 시간 포맷팅 같은 로케일-특화 서비스를 제공합니다. 이 글은 해당 API에 대해 소개합니다.

자바스크립트에서 객체 보호하기

자바스크립트에서 객체가 어떻게 보호될 수 있는지에 대해 환기시킵니다. 총 3가지 수준의 보호단계가 있습니다. 확장을 방지하는 가장 약한 수준, 씰링(sealing)은 조금 강한 수준, 그리고 프리징(freezing)은 가장 강한 수준입니다.

문자열이 하위문자열을 포함하는지 확인하기

문자열이 하위문자열을 포함하는지 확인하기위해 String.prototype.indexOf()와 정규 표현식을 사용하는 방법을 설명합니다.

아웃라이닝(Outlining): JIT와 큰 함수를 위한 제2의 해결책

자바스크립트 엔진과 같은 JIT(Just In Time) 컴파일러는 동일한 크기로 조합된 짧은 함수보다 긴 함수를 컴파일하는데 더 많은 시간이 걸립니다. 이 블로그 글은 긴 함수를 쪼개어 컴파일시간을 줄이는 기법인 아웃라이닝(outlining) (인라이닝(inlining)의 반대)에 대해 설명합니다.

클라이언트측 의존성 관리: npm, Bower와 컴포넌트중에 선택하기

자바스크립트의 스코프와 컨텍스트에 대해 이해하기

Ryan Morr는 자바스크립트에서 스코프(지역 변수)와 컨텍스트(this)의 차이와, 그 차이가 왜 여러가지 공통 디자인 패턴에서 중요한지에 대해 설명합니다.

즉시 실행되는 함수 표현식(IIFE) 소개

블록 스코프지정을 시뮬레이션하기위해 공통 자바스크립트 패턴을 설명합니다.

ES6 제네레이터는 Go 스타일의 동시성을 제공합니다

David Nolen은 자바스크립트에서 Go 스타일의 동시성(커뮤니케이팅 시퀀셜 프로세스(Communicating Sequential Processes, CSP)에 기반한)을 제공하기위해 ECMAScript 6의 제네레이터를 사용하는 방법을 보여줍니다.

최신 웹 애플리케이션 디버그하기 Part 1

크롬의 개발자도구를 통해 루비온레일즈 웹 애플리케이션의 클라이언트측 코드를 디버깅하는 방법을 설명합니다. 총 3부중 1부에서는 크롬을 IDE로 사용하고 콘솔을 이용해 마크업과 CSS를 디버깅합니다.

커다란 Backbone 애플리케이션 만들기

웹 컴포넌트 자료들

Eric Bidel은 웹 컴포넌트에 대한 자료들에 대한 페이지를 만들었습니다.

아주 작은 테이블 정렬기 혹은 '자바스크립트로 LINQ를 작성할 수 있습니다’

기본 DOM 조작과 map()이나 sort()같은 배열 메서드를 사용해 HTML 테이블을 정렬하는 방법을 설명합니다.

주목할만한 React

Stoyan Stefanov는 페이스북의 UI라이브러리인 React에 대해 간략하게 소개합니다.

자바스크립트 개발자는 반드시 '진짜' 물건을 만들어야 하나?

자바스크립트를 하드웨어를 프로그래밍하는데 사용하는 최근의 경향에 대한 포괄적인 분석글

이미 존재하는 Backbone.js 프로젝트를 Require.js로 변환하기

Mocha 테스트를 Node의 표준 디버거로 디버깅하기

Yeoman, Grunt와 Bower로 AngularJS 개발 킥스타트하기


동영상

WDCNZ 2013 의 The Loading Point: 얼마나 작은 모듈들이 큰 차이를 만들어낼 수 있는지 (00:45)

Walter Rumsby는 WDCNZ 2013에서 모듈들로 개발하기 위한 YUI, RequireJS, Ext JS, Browserify의 최선의 실천사례와 테크닉에 대해 소개합니다.

WDCNZ 2013 의 Data Driven Delirious: D3.js를 사용한 데이터 시각화 소개 (00:31)

크롬 개발툴 Flame 차트로 자바스크립트 프로세싱 시간 시각화 (02:30)


코드, 라이브러리들과 도구들

jsPDF: 클라이언트측 PDF 생성 솔루션

즉각적인 문서 생성시 사용합니다(티켓, 보고서 등등...). IE6+, 파이어폭스 3+, 크롬, 사파리 3+, 오페라에서 동작합니다.

D3.js 3.3 릴리즈

크롬과 Node.js를 위한 자바스크립트 디버거 'Theseus(테세우스)'

"Theseus"는 Brackets 코드 에디터를 위한 자바스크립트 디버거로 크롬과 Node.js에서 실행되는 자바스크립트를 디버깅이 가능하게 해줍니다. 한 가지 흥미로운 기능은 모아진 디버그 정보를 에디터 내에서 이용 할 수 있다는 점입니다.

Sifter.js: 자동 완성 검색 라이브러리

속성 값을 이용해 배열과 해쉬로 구성된 정보 객체를 텍스트 검색하는 CommonJS 라이브러리입니다. Sifter는 자동완성 기능을 위해 설계되었고 데이터셋 테스트를 위한 커맨드 라인 인터페이스도 제공합니다.

Hopscotch: 웹 페이지 안의 내용 설명을 위한 프레임워크

Hopscotch는 JSON 객체로 투어 정보를 받습니다. 그리고 투어 진행과 화면을 관리할 수 있는 API를 제공합니다. 기능 : 투어 이벤트에 대한 콜백(onNext 등...)를 제공하고 여러 페이지에 걸쳐 사용 할 수 있으며 국제화 지원 등의 다양한 기능을 제공합니다.

웹페이지 내의 내용을 설명하기 위해 요소 사이를 이동하는 것을 'tour'라 칭함.

RequireBin: Node.js 모듈을 이용하여 브라우저 코드를 공유하기

Node.js 모듈을 사용하여 클라이언트측 코드를 공유하고 편집할 수 있는 웹앱니다. 코드는 browserify를 통해 변환되고 Gist에 저장됩니다.

mdn.io: MDN을 위한 간접적인(passive) URL 단축기

웹 서비스의 URL을 모질라 개발 네트워크 사이트로 한정하여 구글링 한 후 첫 번째 검색 결과로 이동시켜 줍니다.mdn.io/defineproperty와 같은 단축 URL 표시를 가능케 해줍니다.

원문의 'passive'라는 의미는 1:1 매칭의 URL 단축서비스가 아닌 url을 구글링하여 검색 결과를 통해 redirect 시켜주는 방식에 대한 의미로서 사용된 듯 합니다.

url-to-screenshot: PhantomJS를 이용하여 웹 페이지의 스크린샷을 캡쳐하기

XHook: XHR 요청과 응답을 가로채고 변경하기

Ajax 요청을 조작 할 수 있게 도와주는 XMLHttpRequest 패치입니다.

JsDebuggr: Sublime Text에서 자바스크립트 브레이크 포인트를 추가하고 제거하기

Backbone.Modal: modal 창을 간편하게 만들수 있게 도와주는 플러그인

wu.js: 자바스크립트에서 지연 함수 프로그래밍을 지원하는 라이브러리

이 라이브러리는 map()과 filter()등에 반복자(iterator)를 적용하여, 지연되어 처리되는('just-in-time') 일련의 요소를 만들 수 있게 해줍니다.

Antycs: 분석 이벤트 수집 관련 코드를 단순화하고 조직화 하기

Hammer.js: 멀티 터치 제스쳐 라이브러리

탭, 더블 탭, 스와이프, 드래그, 핀치 그리고 로테이트 제스쳐를 지원합니다. 각 제스쳐는 이벤트를 발생시킵니다.

Minivents: 아주 작은 자바스크립트 이벤트 라이브러리

Flipload: 로딩 중 화면을 보여주기 위해 HTML 엘리먼트를 뒷면으로 뒤집기


일자리

소프트웨어 엔지니어 @ Turn (실리콘 밸리)

Angular, Node, Bootstrap, Big data, machine learning, 분산 시스템. 여러분이 이런 기술에 관심을 갖고 있고 자바스크립트 실력이 좋다면 턴(Turn)의 프론트 엔드 애플리케이션 팀에서 같이 일하는 것에 대해 이야기를 나눠보고 싶습니다.

웹 디자이너 @ Booking.com (네덜란드 암스테르담)

세계 1위의 숙박 웹사이트인 Booking.com은 세계에서 가장 스마트한 디자이너를 찾고 있습니다. 웹의 무한한 잠재력과 환상적인 HTML & CSS를 만드는 일에 홀딱 빠져 있나요? 수백만명의 사람들에게 도움이 되는 중요하고 거대한 혁신을 직접 만들어보세요.


마지막으로,

더 간단한 배포 방법

레드 게이트(redgate)에서 만든 Deployment Manager 2를 사용하여 컴포넌트와 컴퓨터에 관계 없이 배포하세요. 하나의 프로세스에 SQL 서버 데이터베이스와 .NET 애플리케이션을 함께 제공하세요. 바로 지금 시작하세요.

'JavaScript Weekly번역' 카테고리의 다른 글

JavaScript Weekly 146호  (0) 2013.10.22
JavaScript Weekly 145호  (0) 2013.10.22
JavaScript Weekly 번역  (0) 2013.10.22
by kazikai kazikai 2013.10.22 10:52

일주일에 한회씩 나오는 JavaScript Weekly  : http://javascriptweekly.com/


같은팀에 근무중인 분이 번역을 진행 해오고 계신데 . 145호 부터는 나도 작지만 참여 하게 되었다. 


(특집기사 / 동영상 부분)


내가 맡은 부분이 분량이 작지만 매주 일정하게 진행해야 하기때문에 (때론 밀리면 1주에 2회분씩 )

으의로 일정 지키기가 쉽지 않다 ㅎㅎ 


참여한 145호 부터는 내블로그에도 공유 하도록 해야겠다. 


같이 작업하는 문서는 https://github.com/senxation/JavaScript-Weekly-Korean/

위 링크의 korean부분을 확인하면 된다. 



'JavaScript Weekly번역' 카테고리의 다른 글

JavaScript Weekly 146호  (0) 2013.10.22
JavaScript Weekly 145호  (0) 2013.10.22
JavaScript Weekly 번역  (0) 2013.10.22
by kazikai kazikai 2013.10.22 10:49

티스토리에서 설치형 블로그로 옮기는것에 대한 고민중에 있다. 


설치형 블로그로 옮기면 호스팅 업체도 알아봐야 하고 아무래도 도메인도 알아봐야 할것 같은데 .

(가장 큰 고민은 검색 트래픽이다. ) 


일단 가상서버 발급 후 => 설치형 블로그로 가는것으로 결정하자 



by kazikai kazikai 2013.07.16 23:12
by kazikai kazikai 2013.07.11 16:22

http://www.nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misunderstood/

에대한 내용을  참고 하여 정리 해보았다. 


자바스크립트에서 대부분 eval 함수는 계륵 같은 존재 인것 같다. 이 함수에  대해서 "evil"이라고 비방 하고 있는데 .. 과연 이 놈이 evil 일까??

(: 즉 eval함수는 쓰지 않는것이 보안 문제 에 좋다고 알고있으며 본인도 대부분 지양 해서 프로그래밍 중이다. )


이 간단한 함수는  string 으로 자바스크립트 코드를 실행 할수 있게 설계 되었다. 

( 사실 무척이나 유용하다고 할 수 있다. !!) 


하지만  "더글라스 크락포드" 에 의해 "eval() is evil " 이란 구절이 생기면서 대부분의 자바스크립트 개발자는 기피 하고있기도 하다. 


우선 위에서 더글라스 크락포드가 뭐라고 말했는지 살펴보자 

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

eval() 함수는 자바스크립트 컴파일러에 접근하는것을 제공 해준다

( Function, setTimeout, setInterval 과 비슷함 )

하지만 대부분의 경우에서 나쁜 코딩에 존재 한다. 

eval 함수의 대부분은 javaScript 의 특징을 오용 하고 있다. 

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


즉 String 으로 자바스크립트를 작성한다음 eval( string ); 을 하면 

해당 자바스크립트가 실행 되는 아주 고마운(?) api라고 할 수있다. 

하지만 이 eval  이 잘못 사용 되고 있다는 말인데... 


그러면 여기서 의문점이 하나있다. 

" 응 ? 그러면 eval을 잘 사용 하면 사용 해도 된다는 말인가? "


그렇다 해당 블로그를 읽어 보면 eval() 함수는 "악" 이 아니라 단지 오해 일 뿐이라고 한다. 


그렇다면 일단 eval() 함수가 "악" 처럼 보이는 이유에 대해서 알아보자 . 


1. misuse : 오용/남용 

eval 함수를 나쁘다(악을 풀어서 나쁘다라고 적겠다.) 라고 말한 유래에는 대부분 자바스크립트란 언어에 대해서 잘 이해 하지 못한 사람들이 잘못 사용 하는것에 있다고 한다. 

이것은 성능이나 보안 이슈와는 관계가 없다. 

단지 자바스크립트에서 참조를 사용 하고 설계 하는것에 대해 잘 이해 하지 못해서 발생하는 현상이라고 한다. 


예제 코드 1 //잘못된 사용의 예 


function isChecked( optionNumber ) {

return eval ( "forms[0].option" + optionNumber + ".checked:" );

}

var result = isCheced( 1 );




위 코드를 보게 되면 개발자는 forms[0].options1.checked  란 것을 최종적으로 반환 받고 싶어 한하지만 eval()을 사용 하지 않고 이 값을 알수 있는 방법이 있다. 하지만 위와 같이 작성 대부분 eval()을 사용 하지 않고 알수있는 법을 모른다고 보여진다. 

(블로그저자는 실제로 10년차 이상의 개발자 중에 저런 패턴의 코드를 쓰는 경우를 많이 볼수있다고 한다. ) ( 하긴 .. JavaScript 를 대충 사용 하다보면 저런 패턴이 사실 편하긴 할것 같다. )


eval()의 사용은 위 코드에서 적절치 못하며 불필요하다. 즉 위 코드는 나쁘다고 할수있다. 

위 코드는 아래와 같이 쉽게 리팩토링이 가능하다. 


예제 코드 2 // 예제코드 1리팩토링 



 function isChecked( optionNumber ) {

return forms[0]["options" + optionNumber].checked;

}

var result = isChecked(1);



즉 eval()이 사용된 코드중에 대부분은 괄호표기법을 사용해서 대체가 가능하다. 

위의 잘못된 사용이 대부분 크락포드가 잘못된 사용이라고 포함 했던 것들이다. 


2. Debugability : 디버깅 

자 이제 eval()  의을 피해야 하는 좋은 이유중에 하나중 디버깅에 대해서 이야기를 꺼내보자  


지금까지  eval()  코드 안에서 어떤 부분이 잘못되었는지 디버깅 하는것은 불가능해왔다. 

즉 해당 코드는 블랙박스와 같다는 말이다. 

크롬 개발자 툴에서는 eval() 코드를 현재 디버깅 할수있다고 하지만 ( 이부분은 반성해야겠다.. 몰랐다..).. 여전히 그 디버깅 과정이 고통 스럽다고 한다. ( 나중에 예시를 만들어봐야 하나..) 

소스 패널에서 코드가 보이기 전에 한번 코드가 실행 될때까지 기다려야 한다. 

(풀어서 말하자면 코드가 한번 실행 된다음 소스패널에 해당 코드가 보이고나서 디버깅 할수있다는말 ) 


즉 결론적으로 eval()된 코드를 사용 하지 않는것이 소스코드를좀더 단계적으로 쉽게 보일수있다는 말이다.  이것은 eval() 이 evil이란 말이 아니다. 단지 일반적인 개발 과정에서 있는 사소한 문제다 


eval debug problem !== eval is evil 

: 즉 위와 같다는 말이다. :)


3. Performance : 성능 

그다음 문제는.. 좀 중요한 문제라고 할수있다. 


바로 eval()의 성능에 대한 문제다.  


예전 버전의 브라우저에서는 eval()은 중복 Interpretation 패널티를 가졌다. 즉 코드가 한번 interpret 되고, eval() 이 한번더 interpret 가 된다는 말이다. 

eval()이 한번더 interpret될때는 자바스크립트 컴파일링 엔진 없이 되기 때문에 브라우저에서 10배 정도 느려진다 


최근의 자바스크립트 컴파일 엔진에서도 eval()은 여전히 문제를 내포 하고있다. 

대부분의 엔진들은 2가지 방법으로 코드를 실행 하는데. "Fast path ", Slow path " 로 돈다. 

fast path코드는 안정적이고 예측 가능한 코드들이고 빠르게 실행을 위해 컴파일 된다. 하지만 slow path의 경우 예측 하기 힘들기 때문에 컴파일 하기 어렵기 때문에 여전히 interpreter에 의해 실행 된다.

(이부분은 아래의 링크를 봐두면 좋을것 같다. ) 

  1. Know Your Engines by David Mandelin (SlideShare)

즉 eval()부분은 최근의 빠른  자바스크립트 엔진을 사용 하지 못하고 예전 브라우저 속도로 실행 된다는 말이다. ( 다시 말하자면 10 배 느리다. ) 


그리고 또 문제가 있다. eval() 은 YUI Compressor 를 통해 변수 이름을 변경 하는게 불가능 하다. 

eval()은 변수에 바로 접근 할 것이고 이것은 오류로 나타난다.

다른 툴들도 마찬가지다 Closure Compiler나 UglifyJS 에서도 이 문제는 나타난다. 


그래서 eval()을 사용 할때는 성능에 관해서 여전히 심각한 문제들이 잇다. 

하지만... 이렇다고  evil은 아니다. ( 거의 evil일듯...) 


4. Security : 보안 

마지막으로 eval논쟁의 꽃 !! 보안 문제이다. 

이런 논쟁의 화두는 XSS 공격 에 취약하다는 것인데. eval() 이 코드를 오픈 시킬수있다는 것이다. 

표면적으로는 eval()이 정의한 코드가 제멋대로 실행 되는것에대한 우려는 있을만 하다고 보여진다. 

(걱정 하는게 이해가 간다.)

이것은 만약에 사용자 입력을 개발자가 다루고 eval() 에 의해 이게 실행 된다면 위험하다고 할수있다. 

그렇지만 만약에 사용자에 대한 입력을 다루지 않는다면 진짜 위험 할까?


ib/blob/master/src/css/PropertyValuePart.js#L145위 참조한 블로그의 저자는 최근에 eval()을 사용한 CSS Parser의 코드에 대한 complain을 받았다고 한다. ( 링크 : https://github.com/nzakas/parser-lib/blob/master/src/css/PropertyValuePart.js#L145 )


이 부분은 css 에 문자열 토큰을 변환 하기 위해 eval()을 사용 한 것인데  이 경우 어떤 사용 자도 해당 코드를 공격 하고나 문제를 일으킬수 없다고 판단 된다고 한다. 

그렇게 주장하는 이유는 다음과 같다고 한다. 


1. tokenizer 를 통해 전달된 값이 eval()된다. 

2. tokenizer는 이미 해당 string이 유효한 값이라고 판단 한다. 

3. 해당 코드는 커맨드 라인에서 자주 실행 되는 코드다. 

4. 브라우저안에서 실행 될때 해당 코드는 클로저를 통해 보호되고 직접 호출이 불가능하다. 


해당 코드를 직접 본게 아니기 때문에 맞는지 확신은 못하겠지만  어쨌든 보안에 대한 문제는 없다는 것으로 보인다. 


결론적으로 eval()을 사용할때 사용자 입력에 관한  보안 이슈가 있는것은 맞다. 하지만 개발자가 사용자 입력을 eval에서 활용 하지 않고 사용자에 의해 해당 코드가(eval 에서 도는 코드)  변하지 않는다면 보안 위험은 없다고 판단된다. 


(그리고 위 블로그 저자는 보안 이슈에 대한 우려가 있다면 외부 자바스큽트 로딩 코드에 대한 보안을 더 신경 써야 된다고 한다...)


5.Conclusion


결론적으로 eval()을 언제 어디에서나 사용하는것은 적절치 않다. 

그리고 eval()을 사용한 좋은 케이스도 있다!!( 물론, 여기에 code 투명성, 디버깅, 성능에대해서는 간과 하지 말아야 한다.) 

그렇기 때문에 개발자는 eval()을 사용 하는것을 두려워 하지 말아야 한다. 

eval()을 쓰지않는것이 최선이 아니라 eval()을 적절하게 사용 하는것이 최선이라고 말할수있다. 



- 개인적인 결론-

위에 모든 이슈를 다 따지면서 코딩하기는  초급 개발자 또는 중급 개발자도 힘든것 같다. 

가능한 eval()을 안쓰면서 구현 하도록 버릇이 들이고, eval()에 대한 예제를 몇개 만들어 보면서 

정말 필요할때는 같이 프로젝트를 진행 하는 사람들의 동의를 얻어서 code에 추가하는게 좋을것같다. 

참고로 JSLint에서는 무조건 eval()이 검출 되니 .. JSHint 를 사용하는것이 조금더 바람직(?) 할 것 같다. 


















 

by kazikai kazikai 2013.07.03 14:46
JavaScript 기반의  Build Tool로는  Grunt.js만한게 없다. 

자료 정리는 오래됐지만 블로그에도 공유 ..



개발에 아주 유용하며 , 

각 Task로 나누어져있어서 프로젝트 진행시에 엄청난 도움이 된다. 


Node.js 기반으로 이루어져 있으며 npm을 사용 가능하기때문에 오픈되어있는 소스가 상당히 많은것이 장점 




by kazikai kazikai 2013.01.15 23:59