'Computer'에 해당되는 글 61건
- 2012/01/30 CoffeeScript, prototype의 단축 표현 '::'
- 2012/01/13 vim, 오늘 .vimrc 에 추가된 설정 정보. (4)
- 2011/12/10 CoffeeScript, CoffeeScript 가 바로 생각나지 않는 JavaScript 코드들.
- 2011/12/01 Ruby, accessors 란?
- 2011/11/10 CommonJS 두번째 살펴보기. (2)
- 2011/11/02 vim, pathogen 플러그인
- 2011/10/25 JavaScript, split과 join으로 구현한, replaceAll 함수
- 2011/10/24 MySQL, 매달 방문하는 사용자를 확인하는 쿼리문.
- 2011/06/20 Change the current directory on Vim
- 2011/06/15 제 11회 2011 한국자바개발자 컨퍼런스 (1)
CoffeeScipt 에서 prototype 사용법
JavaScript Prototype
JavaScript에서 prototype은 해당 클래스의 모든 인스턴스가 공유하는 메소드입니다.
String.prototype.bark = function() {
return "멍멍!!";
};
String("강아지").bark(); // 멍멍!!
"Dog".bark(); // 멍멍!!
"고양이".bark(); // 멍멍!!
그런데 .prototype. 이거 입력이 은근 귀찮습니다.
CoffeeScript Prototype
커피스크립트에서는 :: 연산자로 .prototype.을 대신합니다.
String::bark = -> "멍멍!!"
String("강아지").bark() ## 멍멍!!
"Dog".bark() ## 멍멍!!
"고양이".bark() ## 멍멍!!
가끔 prototype의 메소드를 static 메소드인양 쓰고 싶다면 그냥 쓰면 됩니다.
String::bark() ##"멍멍!!"
보다 완벽한 내용은 CoffeeScript 홈페이지에서...
- Class에 관한 내용 바로 다음에 나오네요.
vim, 오늘 .vimrc 에 추가된 설정 정보. [ conceal, LCS, list, listchars, nbsp, Trail, VI, VIM, vimrc ]
Computer 2012/01/13 00:55vim, 탭이나 개행문자를 보고싶어요.
list mode
List mode: Show tabs as CTRL-I is displayed, display $ after end of line.
즉, list mode로 들어가면, 탭문자와 줄바꿈 문자가 화면에 표시되게 됩니다. 그리고 list mode는 다음 명령으로 들어갈 수 있습니다.
:set list
'listchars'
list 모드에서, 탭 문자나, 개행문자를 '→' '↵' 와 같은 문자로... 나타나게 할 수 있습니다.(인코딩이 UTF-8인 경우, UTF-8 문자도 사용 가능.)
그리고 탭문자나 개행문자 이외에도 다음과 같은 문자들을 지원합니다.
| eol:c | 개행문자 'c'로 표시 |
| tab:xy | 탭문자 첫 글자는 'x'로 이후는 탭 너비에 따라 하나 이상의 'y'를 표시 |
| trail:c | 구문이 끝난뒤 들어간 불필요한 공백문자를 'c'로 표시 |
| extends:c | vim이 'nowrap' 상태에서 화면을 뚫고 넘어간 문장이 있는 라인 오른쪽에 'c'표시 |
| precedes:c | 마찬가지로 'nowrap' 상태에서 오른쪽으로 길게 편잡중일때 화면에 가려진 왼쪽 영역에 'c'를 표시 |
| conceal:c | 'conceallevel'이 1인경우, 숨김문자(?, Concealed Text)영역에 'c' 표시. |
| nbsp:c | 줄 바꿈 없는 공백(Non-Breakable Space)를 'c'로 표시 |
위 설정들 중 몇몇을 복합적으로 설정하려면 다음과 같은 방법으로 설정합니다.
:set lcs=tab:>-,trail:- :set lcs=tab:>-,eol:<,nbsp:% :set lcs=extends:>,precedes:<
기존의 lcs 속성에 새로운 속성을 추가하려면 다음과 같이 입력하면 됩니다.
:set lcs+=nbsp:_
색을 다르게..
탭이나 줄바꿈 기호가 들어간 뒤로 코드가 더 지저분해진 경우 다음의 명령으로, 해당 기호의 색을 배경색과 비슷하게 수정할 수 있습니다.
hi NonText ctermfg=7 guifg=gray hi SpecialKey ctermfg=7 guifg=gray
"eol", "extends" 그리고 "precedes"는 NonText으로 "nbsp", "tab" 그리고 "trail"은 SpecialKey로 화면 표시 전/배경 색을 수정해 주면 됩니다.
CoffeeScript, CoffeeScript 가 바로 생각나지 않는 JavaScript 코드들. [ Coffeescript, JavaScript, 자바스크립트, 커피스크립트 ]
Computer 2011/12/10 10:00"setTimeout" on JavaScript.
setTimeout 은 자바스크립트에서 자주 쓰이는 평범한 함수의 형태입니다.
setTimeout(function(){
eat('food');
}, 6000);
CoffeeScript 코드로 바꾸려면 어떻게 해야 할까요?
"setTimeout" on CoffeeScript.
저는 이렇게 작성했습니다. 바로 생각이 나지 않더군요.
setTimeout ()->
eat 'food'
, 6000
"assert.response" on JavaScript
JavaScript TDD 프레임웍인 expresso에서 assert.response 는 이렇게 생겼습니다.
assert.response(server, {
url: '/foo',
method: 'POST',
data: 'bar baz'
}, {
body: '/foo bar baz',
status: 200
}, function(res){
// All done, do some more tests if needed
});
커피 스크립트로, 어떻게 작성해야 할까요?
"assert.response" on CoffeeScript
많은 변종을 거쳐서 다음과 같은 코드가 작성되었습니다. 테스트 링크
assert.response server
,
url: '/foo'
method: 'POST'
data: 'bar baz'
,
body: '/foo bar baz'
status: 200
,
(res) ->
# All done, do some more tests if needed
뭘 기억하고 싶은 거냐면...
CoffeeScript 코드를 작성하다 자주 오류가 나는 부분을 정리해 놓은 것입니다.
Ruby, accessorsThe Day of Code
attr_reader, attr_accessor 는 뭘까요?
흥미만 잔뜩 있던, Ruby에 대해서 알고 싶기도 하고, 리팩터링 책도 읽지 못해본 상태라, 두마리 토끼를 잡아보려, "리팩토링:루비 에디션" 을 읽고 있습니다.
그런데 첫 코드에서 막혀 버렸습니다.
나머지는 대충 알겠는데, attr_reader, attr_accessor 요녀석들은 뭘까요?
class Movie
REGULAR = 0
NEW_RELEASE =1
CHILDRENS =2
attr_reader :title
attr_accessor :price_code
def initialize(title, price_code)
@title, @price_code = title, price_code
end
end
Accessors
Yukihiro Matsumoto 님의 Ruby User’s Guide에 쉽게 설명이 있네요.
| Shortcut | Effect |
|---|---|
| attr_reader :v | def v; @v; end |
| attr_writer :v | def v=(value); @v=value; end |
| attr_accessor :v | attr_reader :v; attr_writer :v |
| attr_accessor :v, :w | attr_accessor :v; attr_accessor :w |
CommonJS 는 JavaScript API를 정의하는 단체(=Group)이다.
자바스크립트는 빠르고 강력한 언어가 되었지만, 현재의 표준 JavaScript 스팩은 브라우져 환경을 벗어날 수 있는 API를 제공해 주지 못하고 있다.
CommonJS 는 JavaScript가 갖지 못한 API,
즉, Java 나 Ruby, Python이 갖고 있는 Standard Library API와 같은 API를 추가로 정의해서,
JavaScript를 범용 언어와 같이 만들고자 하는 것이다.
CommonJS 에서 가장 먼저 완성한 스팩은 Modules/1.0 이다.
(대부분이 말하는 CommonJS 를 따른다. 혹은 CommonJS 이다 라는 표현은, 이 CommonJS 모듈 스팩을 준수하고 있다 라는 뜻이다.)
Kris Kowal 님이 만드신, "CommonJS: JavaScript Everywhere" 라는 슬라이드 자료
매우 간단하게 요약하자면,...
- Slide 5, 슬라이드에 초반에 Python 코드가 등장,
- Slide 6, JavaScript 로 Python 코드와 같은 코드를 작성할 수 있지만, 그 모든 방법은 표준이 아니다.
- Slide 7, 특히, 모듈, 파일 시스템, 웹 서버 게이트 웨이(?), 바이너리 데이터 등등이 표준에 없다.
(ECMAScript의 브라우져 관련 API는 표준으로 있는데,...) - Slide 8, CommonJS에서 표준화를 하자!
- Slide 11, CommonJS는 API 이다.
- Slide 16 ~ 49, CommonJS 표준엔 Modules 1.1 부터.. Packages 까지 정의가 되어 있다.
- Slide 52 ~ 53, (CommonJS API를 이용해서) 처음 등장한 Python 코드와 같은 역활을 하는 JavaScript 코드로 작성!!
CommonJS에서 표준화 작업중인 내용들
현재(2011.11.18), 아래와 같은 내용(=CommonJS 위키 페이지에서 확인 가능)들이 토론되어지고 있는 중이다.
- Uniform Baseline / 글로벌 (discussion) - 여러 JS 엔진에서 동일하게 동작하도록 하기위한 토론.
- 모듈 (1.1.1)
binary: 바이너리 데이터 타입 (byte arrays and/or strings) (proposals, discussion, early implementations)encodings: 인코딩과 문자열 (proposals, discussion, early implementations) -io: I/O 스트림 (proposals, discussion)fs,fs-base: 파일 시스템 (proposals, discussion, early implementations)system: 시스템 인터페이스 (stdin, stdout, stderr, &c) (1.0, amendments proposed)assert,test: 단위 테스트 (1.0, amendment proposals pending)sockets: 소켓 I/O TCP/IP 소켓 (early proposals)event-queue: 리액터(=Reactor, 이벤트 발생자)/이벤트 큐 (early proposals)worker: 워커(Worker) (공유하지 않는 동시(=concurrent) 프로세스/쓰레드) (proposal)console: 콘솔(=console) (proposal)
- 패키지 (1.0)
- Package Mappings (proposal)
- Web Server Gateway Interface (JSGI) (proposals, discussion, early implementations)
- Promises (proposal) - 비동기 처리를 위한 스팩
빔 플러그인 관리를 더 쉽게 해주는, pathogen.vim
빔(Vim) 을 보다 막강하게 쓰기 위해선 적절한 플러그인이 필요하다. 그런데 빔에서 플러그인을 관리하는 일은 생각만큼 쉽지 않다.
특히, 가장 불편한 점은 여러 플러그인을 ~/.vim 폴더(윈도우즈 사용자의 경우, ~/vimfiles 폴더)에 덮어 씌워놓는 점. 그래서 플러그인을 업데이트하는 것은 언제나 어려웠다.
이런 나에게 단비 같은 플러그인이 바로 pathogen.vim이다.
설치
pathogen.vim 의 설치는 매우 간단하다.
- ~/.vim/autoload 안에 pathogen.vim 파일은 복사한 뒤,
- ~/.vimrc(윈도우즈의 경우 ~/_vimrc) 에 다음과 같은 코드를 한 줄 추가하면 된다.
call pathogen#infect()
- 이제 어떤 플러그인이든 ~/.vim/bundle 에 압축을 풀어 놓으면 각각이 플러그인이 인식된다. 버전 컨트롤 되고 있는 플러그인이라면, 그곳에 체크아웃하면 되는 것이다.
동기화
여러 대에서 Vim을 사용하고 있는 경우, 동기화까지 들어가면 더욱 유용하게 쓸 수 있게 된다.
나의 경우, D:\Dropbox 로 몇몇 설정파일을 동기화 중인데 그곳에 .vim 폴더도 포함되어 있다.
아까 수정했던 _vimrc를 다음과 같이 수정하면,
call pathogen#infect('D:\Dropbox\envs\.vim\bundle')
Dropbox에 있는 설정파일을 자동으로 읽어오게 된다.
더 설치하고 싶은 플러그인은 물론, Dropbox\envs\.vim\bundle 안에 설치하면 된다.
JavaScript, split과 join으로 구현한, replaceAll 함수 [ JavaScript, join, replaceAll, SPLIT ]
Computer 2011/10/25 13:49Daum 에 사용되고 있는 Jigu 라는 JavaScript 라이브러리 에는 문자를 치환하는 replaceAll 이라는 함수가 존재한다.
해당 함수는 정규 표현 식을 통한 치환 역시 지원하지만,
난 단순히 텍스트를 치환하는 코드를 통해 느낀 바가 커서 이곳에 기록해 두기로 마음 먹었다.
Code
function replaceAll(s, findstr, newstr) {
// .. 생략, 이곳에서 정규 표현식 처리 ..
return s.split(findstr).join(newstr);
}
코드의 내용은 어렵지 않다, 단순히 찾고자 하는 단어를 기준으로 자른 배열을 만들고(split), 새로운 단어를 구분자로 사용하는 문자열을 만들라(join)는 코드이다
이 코드가 훌륭하다고 느끼는 이유는 split, join 모두 Native 함수라는 것. 그리고 그 연산으로 replaceAll을 만들어 낸 것이다.
코드
SELECT YEAR(`date`), MONTH(`date`), COUNT(DISTINCT `username`) FROM `table` WHERE `date` > '2011-01-01' GROUP BY MONTH(`date`)
date에 설정된 날짜를 기준으로,
2011년 1월 1일 부터 매달 기록된 데이터의 개수를,
username 필드를 기준으로 중복없이 표시.
결과
2010,1,89 2010,2,50 2010,3,62 2010,4,17 2010,5,23 2010,6,68 2010,7,69 2010,8,29 2010,9,71 2010,10,38
용어
- COUNT
- 필드의 수를 표시.
- DISTINCT
- 중복되는 필드는 제거.
빔(VIM)에서 현재 폴더의 위치를 변경하고 싶을 때!
Vim 에서 현재 디렉토리를 변경할 때는 :cd 라고 입력한 뒤, 가고 싶은 폴더 경로를 입력하면 된다. 이렇게 쉬운 명령어였을 줄이야.
만약 {홈디렉토리}/workspace로 이동하고 싶을 땐, 아래와 같이 입력하면 된다.
:cd ~/workspace
Change the current directory to {path}.
If {path} is relative, it is searched for in the directories listed in 'cdpath'.
Does not change the meaning of an already opened file, because its full path name is remembered. Files from the |arglist| may change though! On MS-DOS this also changes the active drive.
To change to the directory of the current file::cd %:hVIM Doc
