제 개인 서버에 Redmine 설치를 하였습니다.


Redmine은 프로젝트 관리/이슈 트래킹 툴입니다. 

Ruby on Rails 어플로 작고, 가볍습니다.

소규모 팀에서 사용가능하며, 사용법다 간단하며, 기본적인 문서화(위키)를 지원하며 여러개의 프로젝트 지원, 프로젝트마다 저장소 따로 지원 + 다양한 저장소 지원(CVS, SVN, Darcs, Mercurial, Git, Bzr …)

을 합니다.


redmine 설치 방법은 아래링크를 통해 보면 됩니다.

http://www.redmine.org/projects/redmine/wiki/RedmineInstall


Redmine를 설치하였으면 Nginx와 결합하여 사용하는 방법에 대해서 적었습니다.

Nginx + Mongrel cluster

일단은 Nginx 웹서버를 설치를 해야 합니다.

저의 개인 서버구성은 NGINX(Web server)+Ruby on Rails +MySQL(DB) 로 구성하였습니다.

개인적으로 웹서버로는 Apache httpd를 주로 많이 사용했기 때문에 Apache보다 가볍고 경량화된 웹서버인 Nginx를 사용하기엔 약간 멈칫했습니다.

일단 Nginx를 사용해보고 나니 환경설정이 apache보다 매우 쉽기 때문에 nginx를 주로 사용하게 되었습니다.

참조: http://wiki.dgoon.net/doku.php?id=config:installredmine 

Nginx의 8000번 포트를 열고, mongrel-cluster 를 7990~7999 까지 열어서 Redmine과 결합하는 설정을 하였습니다

일단 nginx와 mongrel을 설치합니다.

sudo apt-get install nginx

sudo apt-get install mongrel mongrel-cluster


redmine이 설치된 디렉터리에서,

mongrel_rails cluster::configure -e production -p 7990 -N 10 --user redmine --group redmine --log log -P log



위와 같이 config/mongrel_cluster.yml 환경설정 파일을 만듭니다.


mongrel_rails cluster::start


위와같이 mongrel cluster 를 시작시킵니다.. 7990 ~ 7999 까지 실행되니 이중 하나를 확인해보자. http://blahblah.net:7999 mongrel 이 각 포트에 제대로 떳다면, nginx 환경설정에서 mongrel cluster 부분을 설정해줍니다.

/etc/nginx/sites-available/default

에서 아래 부분을 추가합니다.



upstream mongrel {

    server 127.0.0.1:7990;

    server 127.0.0.1:7991;

    server 127.0.0.1:7992;

    server 127.0.0.1:7993;

    server 127.0.0.1:7994;

    server 127.0.0.1:7995;

    server 127.0.0.1:7996;

    server 127.0.0.1:7997;

    server 127.0.0.1:7998;

    server 127.0.0.1:7999;

}

server {

        listen          8000;

        server_name     redmine.blahblah.net;

        root /home/redmine/public;

        location / {

                proxy_set_header  X-Real-IP  $remote_addr;
                proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header  Host $http_host;
                proxy_redirect off;
                proxy_read_timeout 300;
                if (-f $request_filename/index.html) {
                    rewrite (.*) $1/index.html break;
                }
                if (-f $request_filename.html) {
                    rewrite (.*) $1.html break;
                }

                if (-f $request_filename.txt) {
                    rewrite (.*) $1.txt break;
                }
                proxy_pass http://mongrel/;
        }

}



설정파일을 수정했으면 nginx 데몬을 재시작합니다.  


sudo /etc/init.d/nginx restart


재시작후엔 http://redmine.blahblah:8000 으로 redmine 초기 화면이 나와야 합니다. 

Mongrel cluster의 시작/중지/재시작은 순서대로 아래와 같은 명령을 사용합니다.


mongrel_rails cluster::start

mongrel_rails cluster::stop

mongrel_rails cluster::restart



Ruby on Rails로 간단한 프로그램 만들어본 사람이면 Rails 사용법은 알기 때문에, Ruby on Rails 기반의 Redmine 운영이 쉬울것입니다.


Buy me a coffeeBuy me a coffee
오래간만에 Uniccard에서 유니크카드를 주문을 하려고 홈페이지에 들어갔다.
이 것이 바로 유니크카드

여기서 Ruby on Rails(RoR)을 처음 접하게 되었던 유니크카드 홈페이지에서 주문을 하려고 로그인을 하였다.
그런데 뭥미?

로그인이 안된다. -_-;;
여기는 오픈아이디(OpenID)로만 로그인 할수 있는데 로그인이 안되니 황당.
로그인을 하는데에 IDtail.com 사이트까지 잘 도착을 하여 로그인 패스워드를 치면 넘어가면서 유니크 카드에 들어가야 하는데 안들어가지더군요.
Ruby on Rails로 만들어진 유니크카드에서 로그인이 안된다는 것은 엄청나게 치명적인 것인데, 로그인이 안되니깐 거의 머리가 미칠정도였습니다. (유니크카드를 모두 소비해서 100장 주문하려고 했더니 이게 로그인 불가?)
RoR에서 사용하는 OpenID library 소개에서 문제가 있는지도 궁금하였음.
하지만 어찌어찌 하다 로그인은 하게 되었습니다.
아래 화면에 있는 사이트에 들어가야만 로그인이 됩니다.

제가 보았을때에는 RoR OpenID library에 뭔가 이상이 있는 것 같습니다.


제가 다른 아이디로 사용해보았는데 다른 아이디는 다 되더군요. 근데 특정 아이디가 로그인 안되는 문제점이 -_-;;

Ruby on Rails소스코드 내부의 문제 같은데 이거 구글링하니깐 이런 문제에 대한 글이 없더군요 ㅠㅠ

Buy me a coffeeBuy me a coffee
이번 제 5회 다음 DevDay에 RoR(ruby on Rails)를 이용하는 것으로 참여하려고 준비를 하고 있습니다.

오픈 API를 가지고 프로그래밍을 하려고 하니 Ruby에 대해서 공부를 하게 되면서 metaWeblog에 대해 공부를 하게 되었습니다.

metaWeblog란?
blogger의 단점을 보완하기 위해 Dave Winer 에 의해 2002년도에 만들어진 블로그를 다루기 위한 interface API입니다.
The MetaWeblog API is an application programming interface created by software developer Dave Winer that enables weblog entries to be written, edited, and deleted using web services.
- Wikipedia : metaWeblog

XML-RPC API들
  1. metaWeblog.newPost (blogid, username, password, struct, publish)  
  2. metaWeblog.editPost (postid, username, password, struct, publish)  
  3. metaWeblog.getPost (postid, username, password)  
  4. metaWeblog.newMediaObject (blogid, username, password, struct)  
  5. metaWeblog.getCategories (blogid, username, password)  
  6. metaWeblog.getRecentPosts (blogid, username, password, numberOfPosts) 
metaWeblog API를 가지고 블로그을 쓸수 있고 볼수 있고 수정을 할수 있다고 하는 SPEC입니다.
위의 API를 적용하여 프로그램을 만든 것이 Windows Live writer등이 있습니다.

위의 API를 가지고 Ruby로 tistory에 글을 올려 보게 하였습니다.
여기서는 BlogAPI가 필요합니다. BlogAPI에 대한 것은 [기타설정] BlogAPI 를 활용해봅시다를 참조하시면 됩니다.
사용자 삽입 이미지

관리자 메뉴에서 BlogAPI사용여부를 통해서 외부에서도 글을 쓸수있다.



티스토리 블로그 관리자 페이지에서 'BlogAPI 세팅주소' 와 ' BlogAPI Blog ID'를 얻을 수 있다.
티스토리에서 BlogAPI를 사용할 떄에 인자값으로 주는 username, password, blogid는 아래와 같이 사용하면 됩니다.
  1. username은 티스토리 관리자로 로그인할 때 사용하는 이메일 주소
  2. password는 티스토리 관리자로 로그인할 때 사용하는 비밀번호
  3. blogid는 ' BlogAPI Blog ID'
metaWeblog.newPost (blogid, username, password, struct, publish) 메소드를 이용해서 티스토리에 글을 올릴 수 있습니다.
newPost()에서 인자값으로 주는 것에 대한 설명입니다.
  1. blogid는 'BlogAPI Blog ID'
  2. username은 티스토리 관리자로 로그인할 때 사용하는 이메일 주소
  3. password는 티스토리 관리자로 로그인할 때 사용하는 비밀번호
  4. struct는 새로운 포스트를 작성할때의 구조체
  5. publish는 글을 작성할때 공개인지, 비공개인지를 확인해주는 인자값 (true, false)
metaWeblog.newPost()를 이용하여 ruby로 글을 올리는 테스트를 해보았습니다.

아래는 ruby code입니다.
require "xmlrpc/client"
api_address = '[자신의 BlogAPI 세팅 주소]'

server = XMLRPC::Client.new2(api_address)
post = {
"title" => "Ruby를 이용하여 Tistory에 글쓰기",
"categories"=> ["컴퓨터"],
"description" => "Ruby를 이용하여 Tistory에 글 쓰고 있습니다.<br/>
MetaWeblog라는 API를 가지고 Tistory에 글을 쓰고 올리니깐 재미가 있군요<br/>
이번에 제 5회 다음 DevDay에 신청을 한다고 Ruby를 가지고 Test를 하고 있습니다.<br/>
여성쿼터제가 있다는데 여성분 모아서 갈 수 있을 것 같기도 하고 아이디어가 시급 ㅠㅠ<br/>
Tistory를 활용한 API등을 생각을 하다 Flickr API를 사용할까 Daum API를 사용할까 고민중 @.@
<br/>2008.8.8<br/>
- Written by StudioEgo (성대현)",
}
server.call('metaWeblog.newPost','[BlogAPI ID]', '티스토리 로그인 메일주소','티스토리 로그인 비밀번호', post, true)

여기서 struct로 이용하는 post는 글을 올릴때 사용합니다.
title는 포스트에 넣을 제목
categories는 포스트에 넣을 카테고리, 본인이 만든 카테고리의 이름을 넣으면 됨. 없는 카테고리 쓰면 분류없음으로 나옵니다.
description 은 포스트에 넣을 본문입니다.

티스토리서 제공하는 metaWeblog API를 이용하여 Ruby 코드를 넣어보니 글 올라가는 것에 신기했지요.
그러나 비밀번호를 직접 넣어야 하는 것에 약간은 보안의 위험성이 있는 것 같습니다.
누가 패킷스니핑하여 티스토리 로그인 메일주소와 티스토리 로그인 비밀번호를 알아 내서 주인 몰래 글을 지우고등의 일이 일어날 가능성이 있지요.
이글루스에서는 비밀번호를 직접 넣지 않고 보안에 신경을 쓴 듯 API Key를 제공하여 암호 대신 사용하더군요.

Tistory관계자분게서는 암호를 직접 넣는 것 대신에 API Key를 사용하여 넣는 것이 보안에 좋을 듯한 생각을 해보았습니다.

metaWeblog로 사용하는 Windows Live Writer도 암호를 넣는 문제때문에 갑자기 쓰기가 껄끄러워지더군요.


Referrence
MetaWeblog API specification

ps. Ruby를 이용하여 블로그도 만들어보고 별에 별 기능들을 사용해보니, ruby에 대해서 전반적으로 모르고도 가독성이 좋아서 금방 배울 수 있어서 좋더군요. 제 5회 다음 DevDay에 붙었으면 하는 바람이 있습니다.
Buy me a coffeeBuy me a coffee

에이콘출판사 - 웹 개발 2.0 루비 온 레일스

웹 개발 2.0 루비 온 레일스
카테고리 컴퓨터/인터넷
지은이 황대산 (에이콘출판, 2007년)
상세보기

 예전에 루비가 대세라는 말이 뜨면서 작년인 2007년 12월 20일에 사본 책이다.

책에 있는 예제를 따라하면서 루비가 엄청 쉽구나를 알게 되었지만, 프레임워크(Framework)이라는 용어도 생소하고, MVC라는 용어도, Model, View, Controller[각주:1]의 역할에 대해 이해 못한채로 따라만 하고 덮은 책이였다.

Ruby라는 언어라는 것을 처음 알게 된 책이면서, 책을 열심히 보면서 Ruby란 언어가 예전에 써보았던 Perl의 강력한 정규표현식처리, Prolog의 함수형 프로그래밍언어의 내용, C++, JAVA에서 볼 수 있는 객체지향성을 통합시킨 것을 알게 되었다.

Perl을 써보면서 강력한 문자 처리에 감동하고 이번 학기 프로그래밍 과제하는데 Perl을 가지고 파일 옮기고 유사도 검사를 해보았던 생각을 해보면서 루비로도 해볼까라는 생각을 해보았다. Prolog와 같이 다른 함수를 정의하는 함수를 정의하는 함수를 작성하는 프로그래밍기법을 사용하여 다양한 종류의 함수 정의를 자동화 시키는 기법에 대해서도 신기하게 느꼈다.
(프로그래밍언어 시간에 Prolog로 과제 하다 함수정의하다 이해안되는 부분때문에 몇일동안 고생한 기억이 나서 Prolog에 대해서 기억이 안좋다만, Ruby를 다뤄보니 Prolog과 유사한 부분이 많아서 신기했음)

프로그래밍 언어인 Ruby의 문법을 보면서 일본사람이 정말 Ruby란 언어 잘만들었다는 생각이 들었다.

이분이 Ruby를 만드신 마츠모토 유키히로(松本 行弘, Yukihiro Matsumoto)

이번에 다시 루비언어를 다시 기억을 다시 되살린다고 책을 다시보게 되었다. (루비를 써봐야 하는 입장이 되어서 급하게 책을 펼쳐보았다.)

책에 있는 예제를 그대로 따라하는데에 오류가 생긴 것이다. ㅠㅠ

책에 있는 내용대로 따라해서 ruby 1.8.4를 설치한 다음에 rails를 gem으로 설치하는 것인데 gem으로 rails를 설치하면 책에서 설치하는 것 같은 rails-1.2.2가 설치되지 않고 rails-2.0으로 설치되는 것이다.
rails-2.0으로 설치가 되니 rails-1.2에서 없는 문제가 생겼다.

그것은 책에서 쓰는 scaffold가 rails-2.0에는 없다는 치명적인 에러이다.

그래서 책의 예제를 따라하기 위해서는 책에 있는 내용을 아래와같이 수정을 해야할 것 같다.

c:\> gem install rails --include-dependencies

현재 위에서 같이 쓰여진 책의 내용을 쓰면 rails-2.0이 깔려져서 책의 예제를 따라하기 어렵다. 책의 예제를 따라하기 위해서 (특히 scaffold 부분의 경우) 레일스 1.2.3을 다시 설치해야 한다.

c:\> gem uninstall rails
c:\> gem install rails --version '= 1.2.3' --include-dependencies

위의 설치명령어로 설치를 하면 책에 있는 예제가 잘 될 것이다.

책은 잘 써진 것 같은데 버전 문제가 껄끄럽긴 합니다. 책 쓸 당시에는 이렇게 바뀔줄은 몰랐기 때문이라고 생각됩니다.

Ruby on Rails를 프로그래밍을 해야할 상황인데 Ruby를 빠르게 배우고 싶다면 이 책을 추천하긴 한데 책의 내용을 약간 바뀌어서 내야 할것 같다.

아래는 Rails Framework에 대한 출판사의 설명이다.

[ 레일스 프레임워크에 대해 ]

레일스는 루비 프로그래밍 언어로 만들어진 웹 개발 프레임워크로 덴마크의 데이빗 해너마이어 한슨(David Heinemeier Hansson)에 의해 2004년 7월 처음 공개되었다. 지난 3년간 레일스는 전 세계적으로 빠르게 확산되어 왔으며, 현재까지 레일스로 구축된 B2C 사이트만도 수백여개에 이르고 있다.

레일스가 이처럼 빠른 성공을 거둘 수 있었던 데에는 몇 가지 이유가 있다. 첫째로 오늘날의 웹 개발은 너무나도 복잡해져서 수많은 개발자들이 웹 개발에 넌더리를 내고 있었다. 자바, PHP, .NET 등 개발 환경을 막론하고 많은 웹 개발자들은 뭔가 새로운 것을 시도해 볼 마음의 채비를 하고 있었다.

둘째로 레일스는 개발자의 생산성을 획기적으로 높여 준다. 레일스는 ORM(객체/관계 매핑, Object/Relational Mapping), 코드 생성(Code Generation), 메타프로그래밍 등 최신 프로그래밍 기법을 사용해 개발자가 코딩에 들이는 시간을 현저히 줄여주고 있다. 비슷한 코드를 계속해서 반복적으로 작성하는 일은 개발자의 사기를 떨어뜨리는 일이다. 레일스는 위에서 언급한 프로그래밍 기법을 활용하여, DRY(반복적인 코딩 작업은 피하시오, Don’t Repeat Yourself) 원칙을 적극적으로 장려하고 있다.

셋째로 레일스는 웹 2.0 애플리케이션의 개발에 최적화된 프레임워크이다. 레일스에는 Ajax와 웹 서비스 개발을 위한 컴포넌트가 포함되어 있어서 웹 2.0 서비스를 구축하는 작업을 매우 편리하게 해준다. 실제로 레일스에서는 Ajax 애플리케이션을 개발하기 위해 자바스크립트를 직접 코딩하는 일은 하지 않아도 된다.

마지막으로 레일스를 사용한 웹 개발은 즐겁다. 지금 이 글을 읽는 독자는 다소 회의적인 생각이 들지도 모르겠지만, 이는 레일스를 접해본 수많은 웹 개발자들의 공통된 반응이다. 이 책을 통해 독자 여러분이 레일스가 선사하는 즐거운 웹 개발의 세계를 발견하게 된다면 필자는 그보다 더 큰 보람이 없을 것 같다.
  1. MVC에 대해서는 소프트웨어공학시간에 나오는 개념이다. Model, View, Controller의 약자로서 애플리케이션 코드를 기능별로 분산하여 관리하는 프로그래밍을 말한다. 코드를 분산해서 관리하는 이유는 용도에 따라서 코드의 형태나 구성이 달라지기 때문이다. 결국 이렇게 코드를 나눠 작업함으로써 코드를 좀더 효율적으로 관리하게 되면서 프로그래밍 개발이 효율적으로 진행된다. 자세한 내용은 소프트웨어공학책에 나옵니다. (뇌이버 검색하면 MVC패턴에 대해서 나옵니다.) [본문으로]
Buy me a coffeeBuy me a coffee

+ Recent posts