install elasticsearch

설치

source 설치

1
2
3
$ curl -L -O http://download.elasticsearch.org/PATH/TO/VERSION.zip 
$ unzip elasticsearch-$VERSION.zip
$ cd elasticsearch-$VERSION

실행

1
2
3
4
5
6
7
8
9
10
11
12
$ ./bin/elasticsearch
[2014-09-22 23:11:58,615][INFO ][node ] [Bevatron] version[1.3.2], pid[62710], build[dee175d/2014-08-13T14:29:30Z]
[2014-09-22 23:11:58,616][INFO ][node ] [Bevatron] initializing ...
[2014-09-22 23:11:58,631][INFO ][plugins ] [Bevatron] loaded [marvel], sites [marvel, bigdesk, head]
[2014-09-22 23:12:01,453][INFO ][node ] [Bevatron] initialized
[2014-09-22 23:12:01,453][INFO ][node ] [Bevatron] starting ...
[2014-09-22 23:12:01,577][INFO ][transport ] [Bevatron] bound_address {inet[/127.0.0.1:9300]}, publish_address {inet[/127.0.0.1:9300]}
[2014-09-22 23:12:01,613][INFO ][discovery ] [Bevatron] elasticsearch_J2P/fhrTURb8SSywjSVwOj3H8g
[2014-09-22 23:12:04,631][INFO ][cluster.service ] [Bevatron] new_master [Bevatron][fhrTURb8SSywjSVwOj3H8g][Jung-ui-MacBook-Pro.local][inet[/127.0.0.1:9300]], reason: zen-disco-join (elected_as_master)
[2014-09-22 23:12:04,663][INFO ][http ] [Bevatron] bound_address {inet[/127.0.0.1:9200]}, publish_address {inet[/127.0.0.1:9200]}
[2014-09-22 23:12:04,663][INFO ][node ] [Bevatron] started
[2014-09-22 23:12:05,312][INFO ][gateway ] [Bevatron] recovered [3] indices into cluster_state

elasticsearch 압축을푼 디렉토리 안에 bin 디렉토리에 있는 elasticsearch 파일을 실행한다.

OSX brew install

1
2
3
4
5
6
7
8
9
10
11
12
$ brew update
$ brew install elasticsearch
Data: /usr/local/var/elasticsearch/elasticsearch_J2P/
Logs: /usr/local/var/log/elasticsearch/elasticsearch_J2P.log
Plugins: /usr/local/var/lib/elasticsearch/plugins/

To have launchd start elasticsearch at login:
ln -sfv /usr/local/opt/elasticsearch/*.plist ~/Library/LaunchAgents
Then to load elasticsearch now:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.elasticsearch.plist
Or, if you don't want/need launchctl, you can just run:
elasticsearch --config=/usr/local/opt/elasticsearch/config/elasticsearch.yml

실행

1
2
$ ln -sfv /usr/local/opt/elasticsearch/*.plist ~/Library/LaunchAgents
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.elasticsearch.plist

링크를 걸어주고 launchctl 로 실행한다.

Testing

1
$ curl 'http://localhost:9200/?pretty'

위와 같이 curl 로 request 를 날리면 다음과 같은 결과를 볼수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
{
"status" : 200,
"name" : "Bevatron",
"version" : {
"number" : "1.3.2",
"build_hash" : "dee175dbe2f254f3f26992f5d7591939aaefd12f",
"build_timestamp" : "2014-08-13T14:29:30Z",
"build_snapshot" : false,
"lucene_version" : "4.9"
},
"tagline" : "You Know, for Search"
}
공유하기 댓글

how to install psycopg2 on os x

문제

djagno 에서 postgresql을 쓰기 위해서 psycopg2를 install 하려고 했는데 다음과 같은 에러가 발생했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Error: pg_config executable not found.



Please add the directory containing pg_config to the PATH

or specify the full executable path with the option:



python setup.py build_ext --pg-config /path/to/pg_config build ...



or with the pg_config option in 'setup.cfg'.

----------------------------------------
Cleaning up...
Command python setup.py egg_info failed with error code 1 in /Users/J2P/.virtualenvs/coupon/build/psycopg2
Storing debug log for failure in /var/folders/m7/mvzr8gc13yb5tk_b2zrqg3l80000gn/T/tmpy7yqQi

해결방법

고맙게도 참 잘 설명해준다.

먼저 pg_config PATH 설정하고 해봤지만 똑같은 오류가 발생해서 그냥 소스를 다운받아서 설치해보기로 했다.

소스를 다운받고 압축을 푼다.

1
2
$ wget http://initd.org/psycopg/tarballs/PSYCOPG-2-5/psycopg2-2.5.3.tar.gz
$ tar xzf psycopg2-2.5.3.tar.gz

압축이 풀린 디렉토리로 이동해서 build, install 을 한다.

pg_config 옵션을 주고 자신의 postgresql 설치되어 있는 곳에 bin/pg_config 파일의 path 를 넣어서 build, install 하면 된다.

나같은 경우엔 brew 로 postgresql을 설치해서 “/usr/local/Cellar/postgresql/9.3.4/bin/pg_config” path 를 넣어주면 됐다.

1
2
3
$ cd psycopg2-2.5.3
$ python setup.py build_ext --pg-config /path/to/pg_config build
$ python setup.py build_ext --pg-config /path/to/pg_config install
공유하기 댓글

Remove duplication from Python list

프론트 단에서 중복된 데이터를 삭제해서 사용하다가
백엔드에서 처리하고 데이터를 넘겨주는 방식이 더 좋다고 생각해서 Python으로 list에서 중복을 제거 하는 방법을 찾아봤다.

코드는 다음과 같다.

1
2
3
4
5
6
7
8
>>> arr = ['a', 'b', 'c', 'a', 'a', 'b', 'f', 'g', 'c']
>>> set_arr = set(tickets)

>>> print set_arr
>>> set(['a', 'c', 'b', 'g', 'f'])

>>> print list(set_arr)
['a', 'c', 'b', 'g', 'f']

위에서 set 함수가 몬가 하고 알아보니.

순서하고 상관없는 컬렉션(unorderd collection) 이고 집합이기 때문에 중복된 값을 넣을 수 없다는 것을 알게 되었다.

이렇게 중복을 제거 한 다음 다시 list 함수로 감싸주면 배열에서 중복된 값이 제거 list를 얻을 수 있다.

공유하기 댓글

node.js로 html파일 indent 적용해서 파일 생성하기

간단하게 파일을 쓰려고 할때 다음과 같이 사용하면 된다.

1
2
3
4
fs.writeFile('파일명', '내용', function (err) {
if (err) throw err;
console.log('It\'s saved!');
});

근데 html 파일을 작성할때 내용을 자동으로 indent 해주는 모듈은 없을라나… 했는데

htmltidy

요런게 있구나~

1
2
3
4
5
6
7
8
9
10
11
12
var tidy = require('htmltidy').tidy;
var opts = {
doctype: 'html5',
indent: true
};
tidy('<ul><li>1</li><li>2</li><li>3</li></ul>, opts, function(err, html) {
if (err) throw err;
fs.writeFile('index.html', html, function (err) {
if (err) throw err;
console.log('It\'s saved!');
});
});

요렇게 해주면 index.html 파일에 이쁘게 indent 가 적용되서 저장된다~ 좋은데?!

공유하기 댓글

node.js로 크롤링해서 메일로 보내주기.

우리 회사는 교육 부분에 많은 서비스 하고 있다.

Google Play 교육 카테고리 최고 매출 순위를 보는 회사분들이 있는거 같다.

그래서 크롤링해서 메일로 보내주는 스크립트를 node.js로 한번 만들어 봤다.

크롤링은 jsdom 모듈을 사용하고,
jsdom

메일 보내기는 nodemailer를 사용하였다.
nodemailer

코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
var fs = require('fs');
var jsdom = require('jsdom');
var nodemailer = require('nodemailer');

var smtpTransport = nodemailer.createTransport('SMTP', {
service: 'Gmail',
auth: {
user: '구글 메일 주소',
pass: '구글 메일 패스워드'
}
});

function sendMail(mailOptions) {
smtpTransport.sendMail(mailOptions, function (error, response) {
if (error) {
console.log(error);
} else {
console.log('Message sent :' + response.message);
}

smtpTransport.close();
});
}

(function getMailOptions() {
jsdom.env({
url: 'https://play.google.com/store/apps/category/EDUCATION/collection/topgrossing',
scripts: ['http://code.jquery.com/jquery-2.1.0.min.js'],
done: function (err, window) {
var $ = window.jQuery;
var cards = $('.card-list .card');
var result = '<div style="width: 100%; font-size: 16px;">';
result += '<h1 style="font-size: 0.875em;">Google Play 최고 매출 - 교육</h1>';
result += '<ul style="width: 100%; list-style:none; margin: 0 auto; padding: 0; overflow: hidden; position: relative;">';

$.each(cards, function(i, card) {
var $card = $(this);
var cover = $card.find('.cover-image').attr('src');
var title = $card.find('h2').text();
var subtitle = $card.find('.subtitle').text();
var link = $card.find('h2 a').attr('href');

++i;

result += '<li style="border: 1px solid #ccc;padding: 0;margin: 5px; width: 15%; text-align: center; float: left; border-radius: 5px;">';
result += '<h2 style="background: #ccc; margin: 0 0 5% 0; padding: 2% 0; font-size: 0.813em;">'+ i +'위</h2>'
result += '<img src="'+ cover +'" alt="'+ title +'" style="width: 80%; height: auto;">';
result += '<p style="word-wrap:break-word; width: 70%; height: 10%; font-size: 0.750em; max-height: 50px; overflow: hidden; margin: 2% auto; 0">';
result += '<a href="'+ link +'">'+ title +'</a></p>';
result += '<p style="word-wrap;break-word; font-size: 0.623em; color: #ccc;">'+ subtitle +'</p>';
});

result += '</ul></div>'

// 파일로 저장해서 미리보기
fs.writeFile('index.html', result, function (err) {
if (err) throw err;
console.log('It\'s saved!');
});

// 메일 보내기
sendMail({
from: '보내는사람 mail',
to: '받는사람 mail',
subject: '제목',
html: result
});
}
});
})();

html을 꾸며준답시고 css를 쑤셔 넣어서 코드가 좀 지저분 하다 ㅋㅋ

공유하기 댓글

node.js 환경에 맞춰서 config 불러오는 방법

development 환경 실행

1
$ NODE_ENV=development node app.js

production 환경 실행

1
$ NODE_ENV=production node app.js

config.js

1
2
3
4
5
6
7
8
9
10
11
12
module.exports = function(){
switch(process.env.NODE_ENV){
case 'development':
return {dev setting};

case 'production':
return {prod settings};

default:
return {error or other settings};
}
};

사용

1
2
var Config = require('./config'),
conf = new Config();
공유하기 댓글

do a drawing

어렸을때부터 그림을 그림을 배우고 싶었지만 여러 사정에 의해서 그림을 배우지 못했다.

최근 그림을 배우고 싶다는 생각이 커져서 큰맘을 먹고 그림을 배우기 시작했다.

학원을 다니는건 아니고 그냥 몇개씩 그려서 회사 디자이너분에게 모가 잘못되었는지 확인을 부탁하고 있다.

(커피와 함께…)

그림을 배운지 이제 10일 정도 지나 처음 그렸던거 부터 쭉 나열해서 보면 어떨까 싶어서 블로그에 올려본다.

(창피하지만…)

공유하기 댓글

try the node-webkit

갑자기 만들어 보고 싶은게 생겼는데 node-webkit으로 만들면 괜찮을꺼 같아서 사용해 볼까 한다.

일단 난 mac를 사용하니까 mac 에서 실행하는 방법을 알아보자.

Downloads

위 링크에서 다운로드를 받아서 압축을 풀고 Applications 디렉토리로 이동시킨다.

alias 등록

사용하기 편하게 .bash_profile 에 alias를 등록한다.

alias 등록
1
2
#alias to nw
alias nw="/Applications/node-webkit.app/Contents/MacOS/node-webkit"

앱 실행

nw 명령어를 치면 다음과 같은 창을 볼수 있다

앱실행
1
$ nw

Quick Start

https://github.com/rogerwang/node-webkit 에 있는 Quick Start 소스를 따라서 앱을 하나 만들어보자.

디렉토리를 하나 만들어서 index.html, package.json 파일을 생성하고 아래와 같은 내용을 넣어준다.

index.html
1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<h1>Hello World!</h1>
We are using node.js <script>document.write(process.version)</script>.
</body>
</html>
package.json
1
2
3
4
{
"name": "nw-demo",
"main": "index.html"
}

앱을 실행 하기 위해서 app.nw 파일로 압축을 한다.

package.json
1
2
3
$ zip app.nw index.html package.json
adding: index.html (deflated 30%)
adding: package.json (deflated 8%)

위와 같이 하면 app.nw 파일이 생성된걸 확인 할 수 있다.
이제 실행해 보자.

앱실행
1
$ nw app.nw

앱을 실행 하면 다음과 같은 창을 볼수 있다.

근데 파일을 수정할때 마다 압축을 시켜서 앱을 실행을 하려니 너무 귀찮은 것이다.

그래서 Haroopad 를 만든 Rhiokim 에게 문의를 해서 앱을 실행하는 다른 방법을 알아 냈다.

압축할 필요없이 다음과 같이 앱 디렉토리를 압축한 파일 대신 써주면 디렉토리에서 파일을 찾아서 앱을 실행해준다.

압축없이 실행
1
$ nw node_webkit_test_app/
공유하기 댓글

Django create super user

Django 를 사용할때 syncdb 를 했을때 super user 가 생성이 안되는 경우나, 혹은 계정을 생성했지만 아이디 패스워드가 생각이 나지 않을때 user 를 확인해서 user 가 없으면 신규로 생성하거나 user 가 있는 경우에 password 를 변경 하는 방법에 대해서 적어 볼까 한다.

User 확인

user 확인
1
2
3
4
5
6
$ ./manage.py shell
>>> from django.contrib.auth.models import User
>>> users = User.objects.all()
>>> users
[<User: j2p>] // user 가 있는 경우
[] // user 가 없는 경우

User 가 있는 경우 password 변경

password 변경
1
2
3
4
5
$ ./manage.py changepassword userid
Changing password for user 'userid'
Password: // 입력
Password (again): // 다시 입력
Password changed successfully for user 'userid'

User 가 없는 경우 신규 유저 생성

신규 유저 생성
1
2
3
4
5
6
$ ./manage.py shell
>>> from django.contrib.auth.models import User
>>> u = User.objects.create_user('userid', 'useremail', 'userpassword')
>>> u.is_staff = True
>>> u.is_superuser = True
>>> u.save()
공유하기 댓글

Blender

Blender란 무료로 사용할 수 있는 3D 그래픽 프로그램이다.

오픈소스 진영의 대표적인 그래픽 프로그램이라고 한다.

윈도우, 맥, 리눅스등 여러 운영체제를 동시에 지원 하기 때문에 운영 체제가 달라도 작업들을 쉽게 공유 가능하다고 한다.

3D 모델링툴에 비해 매우 배우기 쉬우면서 높은 수준의 렌터링 퀄리티를 보여준다고 한다.

애니메이션, 파티클, 텍스쳐 페인팅, 옷감 시뮬레이션, 스컬핑 등 값비싼 사용 프로그램에서 쓸 수 있는 기능을 거의 다 쓸 수 있으며 자체 게임 엔진을 내장하고 있다고 한다.

이외 간단한 음향/영상 편집이나 복잡한 노드 합성 기능까지 내장하고 있다고 한다.

스크립트로 3D 게임을 만들 수 있지만 게임 전용툴이 아니다 보니 복잡한 게임일수록 스크립트 노가다를 해야 하고 퍼포먼스가 좋지 않다고 한다.

Unity3D 엔진이 Blender 파일을 지원하기 때문에 게임을 개발하기 위해서는 Unity3D 엔진을 사용하는게 좋다고 한다.

출처 : 엔하위키 미러

특색

  • Interface

참고 할만한 사이트 모음

국내

해외

공유하기 댓글