2009년 11월 30일 월요일

아이폰 도착

오늘(월요일) 아침 8시 45분에 아이폰 택배가 집으로 도착했네요.
이제 출근해요.

2009년 11월 26일 목요일

구글 웨이브 초대장 8장 다시 생김. Invite others to Google Wave

초대장이 다 쓰니까 금방 또 생기는군요.
구글 웨이브 초대장이 8장이 생겼습니다.
email주소를 알려주시면 초대해 드릴께요.



2009년 11월 23일 월요일

Ruby on Rails에서 View를 중복없이 개발하기 Haml, Sass and Compass

Ruby on Rails에서 HTML을 중복없이 개발하는 프레임 워크 중에 Haml이라는 것이 있다는 것은 알고 있었는데,
HAML 사용하기 에서 언급된 단점들 때문에 사용하지 않고 있었다.

치명적인 것은, Javascript친화적이지 않다는 단점.

그런데 웹 프론트를 개발하다 보면 HTML보다 CSS에는 엄청난 중복이 있다는 것을 알 수 있다.
그래서 나온 것이 Sass 라는 CSS 프리프로세싱 언어가 있다.

석준님께서 알려주신 http://ruby-toolbox.com/ 에서 알게 된 compass 라는 CSS 관련 gem을 알게 되었는데,
이것이 뭐하는 gem인가 하면,
Sass로 코딩된 것을 CSS로 프리컴파일 해주는 역할을 한다.

$ compass --watch

라고 명령을 주면 Sass 파일을 고치면 자동으로 CSS를 다시 생성해 주어서 개발시에 pre-processing에 대한 불편함이 없다.

Sass 의 사용평은,, 훌륭한 물건이다. 아주 편하다는 것이다.

Ruby on Rails로 웹 개발을 하시는 분은 Sass의 사용을 검토해 보라고 권유해 드리고 싶다.

그리고,, http://ruby-toolbox.com/ 사이트는 대박 유용하다는 것.!!
라이브러리의 용도별로 user rating을 해 두어서 사용자 선호도를 알 수 있다.
아주 훌륭한 수많은 라이브러리들이 있으니,
Ruby , Ruby on Rails 개발자라면 http://ruby-toolbox.com/ 를 적극 활용하기를..
 

구글 웨이브 초대장 8장 생김. Invite others to Google Wave

구글 웨이브 초대장이 8장이 생겼습니다.
email주소를 알려주시면 초대해 드릴께요.
(Mail: jaehyunkim at 쥐메일 닷컴 ,Twitter: @jaehyun )

8장 모두 소진되면 이글은 수정하겠습닌다.

참고로,, 저는 초대장을 빨리 보내드리는데, 바로 초대장이 가지 않을 듯 해요.
구글 웨이브가 아래와 같이 말해주고 있어요. (아마 몇시간 걸리지 않을까..)
Invitations will not be sent immediately. We have a lot of stamps to lick. 

구글 웨이브 초대장이 모두 소진되었습니다.
또 생기면 블로그에 배포를 알려드리도록 하겠습니다.

2009년 11월 19일 목요일

유용한 ruby gem 목록


목록을 페이징 해주는 will_paginate

이미지 첨부파일을 업로드 하고, DB로 관리하며 사이즈별 리사이즈 해주는 attachment_fu

로그인 모듈을 만들어 주는 restful_authentication

간단한 메뉴 네비게이션을 만들어 주는 simple_navigation

이미지 라이브러리 대명사 imagemagick 를 루비로 포팅한 rmagick

잘 모르지만, mysql 관련 성능향상.

prototype.js + scriptaculous.us 를 대체하는 jQuery 기반의 RoR Javascript 대안.

도메인명별로 구분을 할 수 있게 하는 subdomain_fu

사용자에게 페이지 디자인을 위임할 수 있는 템플릿 엔진 liquid

템플릿을 active-record DB에 데이터로 관리할 수 있게 해주는 dynamic_liquid_templates

Mongrel보다 빠른 Passenger  ( + Ruby Enterprise Edition 도 함께 쓰면 좋아요.)

html 파서 hpricot

디렉토리 이벤트 감시 derectory_watcher

문자 캐릭터셋을 알아내는 rchardet

Textile Markup 을 사용할 수 있게 해주는 redcloth

RSS피드를 파싱해 주는 rfeedparser

OpenID Ruby 라이브러리 ruby-openid


더 생각나는 것이 있으면 코멘트 달겠습니다.
사용하시는 유용한 ruby gem이 있으면 알려주세요.


2009년 11월 17일 화요일

mysql 의 my.cnf 설정중에 innodb_buffer_pool_size

내가 사용하는 서버가 두개가 있는데,

하나는 메인 메모리가 512M이고, 또다른 하나는 1G이다.

그런데 둘다 my.cnf에 내가 아는 아래와 같은 옵션 몇개만 설정하고 써 오고 있었는데,..
innodb_file_per_table
innodb_flush_log_at_trx_commit = 1

이상하게 mysql process 의 CPU점유율이 항상 20%~30% 대에서 안내려가는 현상이 생겼다.
crontab에 걸린 데이터 크롤도 있고 많이 쓰긴 하지만..
이렇게 CPU를 차지할 만큼 큰 job은 아니라고 생각이 들었는데.. 찾다보니,

innodb_buffer_pool_size

라는 옵션이 있는데, 권장은 메인메모리의 50~70% 면서(아마도 Mysql 전용 머신의 경우일 듯), 기본 default는 8M 인 옵션이다.
그래서, 이 옵션을 서버 각각 64M, 256M 로 설정했다. (내 머신들은 Mysql 전용이 아니니까.. 별짓 다하는 기계들..)
설정 하고 나니 CPU점유율 상황이 조금 좋아진 듯 하다.
간단한 옵션인데, 모르고 있으니 서버를 엉뚱하게 운영하고 있었다는 생각이 든다.

2009년 11월 15일 일요일

DB저장을 기반한 사용자 편집 UI를 위한 liquid template


liquid template 은 Ruby 에서 사용하는 템플릿 라이브러리 인데,
Ruby on Rails에서 바로 사용하기가 생각보다 편하지 않은 것 같다.

그래서 여기저기 둘러보다가 발견하게 된 것이,
인데, 최근에 릴리즈 된 듯 하고,, 아직 부족한 점이 많아 보인다.

그래도, 개념적으로 내가 바라는 형태로 움직일 듯 하다.
이럴때 저 오픈소스 개발에 뛰어들 수 있는 실력만 되면 정말 좋을텐데 -_-;;
업그레이드 시켜주고 싶은데.. 실력부족.

고수님께서 해주시길 기다리는 수밖에..

2009년 11월 12일 목요일

성공적인 쇼핑몰, e-commerce 사이트가 지켜야 할 것들. 2개의 인용글 포함

아래 원문ㅣ링크의 그림과 함께 봐야 이해하기가 좋다.

17 New Rules for Successful E-Commerce Websites

http://www.seomoz.org/blog/17-new-rules-for-successful-ecommerce-websites

1. 사용자가 어디에 있는지 네비게이션 바를 잘 보이는 곳에 제공할 것.
(e.g. Home > Category > Sub-cat > Product)
2. 좁혀진 카테고리에서 나올 수 있는 방법을 제공하라.
3. 다양한 방법의 오더링을 제공하라
가격 오름차순, 내림차순, 인기도, 베스트셀러, 특징, 유저 선호도, 에디터 선호도 등.
4. 서브 카테고리 내에 200개 이상이 있지 않으면, 한페이지에
볼 수 있는 메뉴를 제공하라.
100 items per page 등.
5. 세부적인 옵션을 제공하라. 사이즈 등.
6. 보다 세부적인 카테고리를 제공하라.
7. 가격이 얼마이고, 얼마를 절약할 수 있는지를 명시하라.
8. 검색창을 잘 보이는 곳에 제공하라.
9. 검색에 편리한 세부적인 옵션을 제공하라.
10. 검색 결과에 가장 가까운 (관련된) 목록을 제공하라.
("ted baker endurance shoes" 만약 검색 상품이 만족하는 것이 없다면,,
검색어를 하나씩 줄인 검색 결과를 제공. ebay)
11. 상세한 사이즈 정보를 제공하라.
12. 재고 여부를 보여줘라. 카트에 담고 주문하는 순간에 재고가 없다는 말은 하지 말아라.
14. 배송 가능 지역의 제한을 명시.
16. 구매한 고객에게 이메일로서 안심시켜라.
17. 주문에 관한 모든 정보를 고객에게 알리고, 사이즈를 잘못 주문한 것 같은 오류를 배송전에 수정될 수 있게 하라.


Is your website easy to buy from? Tips you can test to improve your site's checkout process

http://conversionroom.blogspot.com/2009/11/is-your-website-easy-to-buy-from-tips.html

1. 제품 이미지를 상세히 제공하는 것.
ajax, flash, video 등의 기술을 통해.
2. 구매 버튼
눈에 띄는 색깔의 버튼.
크고 읽기 쉬운 글자체.
(+)등의 아이콘
버튼의 위치는 제품의 오른쪽 하단에 위치
버튼은 크게 만들 것.
긴 설명문장을 가지고 있다면? 위에 버튼 하나. 가장 아래에도 버튼 하나.
3. 구매전에 가입을 강요하지 말라.
입력 필드는 꼭 필수인 것만 입력하도록 강요하기.
고객에게 왜 이 입력필드가 필요한지 인지시키기. (이메일 주소는 주문 확인을 하는데 사용됩니다.)
4. 구매 프로세스 상태 스텝 인식 그림.
내가 구매 스탭중 어디까지 와 있는지?
구매가 끝날 때 까지 몇개의 스탭이 더 남았는지?
다음 스탭은 무엇인지?
내가 주문한 제품을 다시한번 확인 할 수 있는 스탭이 남아있는지?
5. 입력창은 간단해야 한다.
입력 필드명은 산업에서 사용하는 명확하고 범용적인 것을 사용할 것.
체크박스나 라디오 버튼을 활용하여 옵션을 보여줄 것.
팝업 에러를 피하고, 문제 영역에 인라인 에러를 보여줄 것.
어떤 상황에서도 폼을 리셋시키지 말것. (사용자가 뭔가를 잘못 입력해서 에러가 발생하더라도.)
6. 고객에게 잦은 질문(FAQ)에 대한 답변을 제공할 것.
7. 구매를 위한 특별한 프로모션 이메일을 구매 전에 확인하라고 강요 하지 말것.
구매 후에도 할수 있는 마케팅들.
구매 후에 우아하게 나중에 마케팅 정책을 할 것.
8. 고객에게 사이트에 대한 신뢰를 주기 위해, 신뢰 인증 마크를 보여줄 것.
9. 구글 웹사이트 옵티마이저를 이용하여, 사이트를 지속적으로 테스트 하고 최적화 할 것.



외국의 쇼핑몰과 국내의 쇼핑몰은 완전히 다르다. 문화적 차이가 큰 듯 하다.
그나저나,, 쇼핑몰도 SaaS로 운영되면 Social 의 매력을 묻어나게 할 수 있지 않을까?


2009년 11월 10일 화요일

구글 크롬 chromeplus + Daum 영어사전

최근에 브라우저를 파이어폭스를 주로 사용하는데, 메모리를 너무 많이 먹는다.
그리고 처음 나왔을 때는 빠르다고 느꼈었는데, 요즘은 빠르다고 느끼지 못한다.
아무래도 그때는 인터넷 익스프로러 6.0 을 기준으로 비교해서 그런 듯 하고.. 최근에는 크롬이 나오면서 파이어폭스도 느리다고 느껴질 때가 많다.

게다가 회사에서 Eclipse, 사내메신저, Outlook, IE7.0 을 기본으로 사용하는데다가 Firefox까지 띄우면 컴퓨터가 아주 느려진다.

그래서 발견한 것이
구글 크롬의 장점 + 마우스 제스쳐 + javascript 셀렉션 등의 많은 장점을 가지고 있다.

다만 구글 툴바 및 플러그인등을 설치할 수가 없어서.. 사전 기능을 사용하지 못한다는 점.

그래서, 셀렉션 영역을 다음 사전으로 검색하는 Javascript북마크릿을 만들었다.
사전은 다음 사전이 좋다.


위 링크를 즐겨찾기 영역에 드래그 해서 북마크릿으로 사용하면 편리하다.

2009년 11월 7일 토요일

Apache Lucene + Solr (아파치 루씬 + 솔라) 오픈소스 텍스트 검색 엔진 사용

ApacheLucene
오픈소스 검색엔진인 Lucene


Solr
엔터프라이즈 검색서버인 Solr


오픈소스 검색엔진인 Lucene 과 그의 서브 프로젝트로서 엔터프라이즈 검색서버인 Solr 를 활용하여,
Twicco 서비스의 검색 기능을 개선하게 되었다.



처음에는 Twicco를 오픈 하였을 때는 트위터 글이 적어서 데이터베이스의 like 검색으로 가능 할 줄 알았다.
그런데, 몇만건 이상의 트위팅 글이 쌓이면서, DB like 검색은 수십초가 넘게 걸리는 문제가 발생했다.

이뿐만 아니라, 쇼핑몰을 만들어도 쇼핑 아이템 수가 늘어나면 검색 기능이 필요해 지고,
Stackoverflow와 같은 Q&A 커뮤니티 서비스를 만들어도 검색 기능은 빠질 수 없는 필수 기능이다.
그리고, DB like검색으로는 해결이 안되는 용량의 수준은 어느 서비스에서나 겪을 수 있는 문제라고 생각된다.

그래서, 이번 기회에 기존에 들어봤던 오픈소스 검색엔진인 Lucene 을 적용해 보기로 했다.
(회사에서 검색 부서 옆에서 일하면서도, 검색을 잘 모르지만... )

예전에 검색 교육을 받았던 문서도 뒤져보고, 웹서핑을 하면서 검색의 기초 개념을 조금 익혔다.

예전부터 거론된 Lucene을 사용하기에 가장 문제가 되는 점은..
한글 형태소 분석기가 없다는 것이다.

이 말은 쉽게 표현하자면,
"톱스타 장동건이 연인 고소영을 위해 담배를 끊었다고 일간스포츠가 7일 보도했다."
라는 문장을 검색 할 때,
Lucene에 기본으로 포함되어 있는 형태소 분석기를 이용하게 되면 스페이스 기준으로
Term을 구분하고 indexing하게 되어,
"장동건이" 를 치면 검색이 되지만, "장동건" 을 치면 검색이 되지 않는 치명적인 문제가 있다.
"담배를" 을 검색하면 검색이 되고, "담배" 를 검색하면 검색이 되지 않는..
얼마나 치명적인 문제점인가!

이 문제를 오픈소스로 해결해 주신 멋진, 존경스러운 분이 계셨다.
네이버에 루씬 한글 분석기 오픈소스 프로젝트 까페( http://cafe.naver.com/korlucene )
에 가면 KoreanAnalyzer 를 다운로드 받을 수 있다.

검색을 위한 형태소 분석 면에서 영어에 비해서 한글은 훨씬 어려운 점을 가지고 있다.
잘은 모르지만, 우리나라에서 한글 검색기술은 잘 오픈되지 않았던 것 같다.
그래서, 더 갑진 듯 하다. 이 한글 형태소 분석기를 개발해 주신분께 다시한번 감사의 말씀을 전한다.

KoreanAnalyzer를 활용하여 Lucene 커멘드 명령어로  한글 검색을 해 보니,
한글의 조사, 어미, 접두어, 접미어, 조합어 등의 사전을 기반으로 하기 때문에,
Lucene의 기본 형태소 분석기와는 차원이 다르게 훌륭한 결과를 얻을 수 있었다.
그리고, 기본 사전을 추가, 변경하면서 검색 성능을 향상 시킬 수도 있다.

위 문장에서 예를 들었던  "장동건", "담배" 등이 검색이 잘 된다.

2단계 Apache Solr.

검색 결과를 어플리케이션으로 전달하기 위해서는 많은 작업을 해 줘야 한다.
보통 아래와 같은 XML로 검색결과를 전달하는 방법이 많이 사용하는 것 같다.


















검색 대상 도큐먼트 추가, 색인 데이터 관리, 검색 결과를 전달 하는 등의 동작을
HTTP XML RESTful 방식으로 사용할 수 있게 해 주는 것이 Solr 이다.
아래와 같은 웹 인터페이스로 질의 테스트 및 색인어 보기 등의 많은 기능을 제공하여 편하게 사용할 수 있다.

































Solr를 사용하기 위해서는 위에서 언급했던 KoreanFilter, KoreanTokenizer 의 Factory 클래스를 아래와 같이 만들어 줘야 한다. 이것은 Solr의 설정을 통해 Lucene의 에서 사용된다.


package org.apache.lucene.analysis.kr;

import org.apache.lucene.analysis.TokenStream;
import org.apache.solr.analysis.BaseTokenFilterFactory;

public class KoreanFilterFactory extends BaseTokenFilterFactory {
    public TokenStream create(TokenStream input) {
        return new KoreanFilter(input);
    }
}


package org.apache.lucene.analysis.kr;

import java.io.Reader;
import org.apache.lucene.analysis.TokenStream;
import org.apache.solr.analysis.BaseTokenizerFactory;

public class KoreanTokenizerFactory extends BaseTokenizerFactory {
    public TokenStream create(Reader input) {
        return new KoreanTokenizer(input);
    }
}

그리고, Solr 홈페이지에 있는 Getting Started (Tutorial) http://lucene.apache.org/solr/tutorial.html 을 보고 설치하면 된다.
설정하는 과정에서 schema.xml 파일의 설정을 보면
<fieldType> 의 <analyzer>부분을 아래와 같이 수정한다.

...
      <analyzer type="index">
        <!-- modified by jaehyun
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        -->
        <tokenizer class="org.apache.lucene.analysis.kr.KoreanTokenizerFactory"/>
        <filter class="org.apache.lucene.analysis.kr.KoreanFilterFactory"/>
...
      <analyzer type="query">
        <!-- modified by jaehyun
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        -->
        <tokenizer class="org.apache.lucene.analysis.kr.KoreanTokenizerFactory"/>
        <filter class="org.apache.lucene.analysis.kr.KoreanFilterFactory"/>
...

그리고 검색할 데이터의 형태에 맞게 field를 정의해야 한다.
이것은 마치 DB설계를 할 때, 테이블 설계와 유사한 형태라고 생각하면 된다.

그리고 몇가지 설정해야 할 것들이 더 있는데, 아래 문서를 보면서 따라하면 쉽게 될 것으로
생각되어 모두 기술하지는 않겠다. 자세한 사항은
http://lucene.apache.org/solr/tutorial.html
http://www.ibm.com/developerworks/kr/library/tutorial/os-dw-os-apachelucene.html
http://wiki.apache.org/solr/
http://gurchin.tistory.com/153
등의 문서를 참고 하면 된다.
Tomcat을 같이 사용하려면 http://wiki.apache.org/solr/SolrTomcat 을 보면 된다.


끝으로..
지금까지는 검색엔진 기술은 전공자가 아니면 쉽게 따라할 수 없는 기술로 여겨져 왔으나,
훌륭한 오픈소스인 Apache Lucene, Solr, KoreanAnalyzer 등을 이용하면, 누구나 기초적인 텍스트 검색엔진 구축하여 활용 할 수 있게 되었다.
이제 막 기초적인 설정을 마무리 하였으니, 앞으로 Lucene, Solr 를 좀 더 공부해 봐야겠다.


2009년 11월 6일 금요일

Stackoverflow 사용하면서 또 하나 알게 된 것

짧은 나의 영어실력으로 오늘 간단한 질문을 하나 올려보려고, Stackoverflow에 갔다.

http://stackoverflow.com/users/174583/jaehyun

Tag를 ruby-on-rails, hudson, ci-server 로 달려고 했는데.. ci-server가 없다.
내가 보기엔 적당한 tag인것 같은데..

글쓰기를 누르니, reputation 250점 이하는 신규 tag생성을 못한다는 룰이 있다.
그래서 다시 tag를 입력하다보니, continuous-integration 라는 Tag로 글이 많더라는...
이것으로 Tagging했다.

생각하고 보니, 낮은 reputation 사용자에게 tag를 생성하게 하면,, 많이 난잡해 질 것 같다.
이것은 훌륭한 사용 제한.!

역시나,, 이 블로그글 쓰는 약 10분여 동안 답글이 두개나 달렸다..
이건 정말 훌륭한 시스템! Stackoverflow ..