잊지 않겠습니다.

사용하던 Trac에서 redmine으로 이전하기로 결정하였다. redmine으로 이전하기로 한 이유는 다음과 같다.


1. Gantt chart 및 calandar를 이용한 프로젝트 관리가 용이하다.

2. Forum 기능이 기본으로 제공된다.

3. SVN 서버와 동일 서버에 설치될 필요가 없다. 

4. issue의 start date와 end date가 제공되며, issue work log를 작성 가능하다. 




redmine 설치 (for windows)


1. ruby instance download

http://www.rubyinstaller.org/ 에서 제공하는 windows용 installer를 이용

2. mysql download & install

3. ruby gem update

: gem update --system

: gem update

4. ruby devkit download & install

http://www.rubyinstaller.org/ 에서 제공. native build시에 필요한 파일들이 포함되어 있다.

: ruby directory에 dev folder 생성, 압축을 풀어서 넣어준다. 

5. windows path 등록

: mysql/bin, ruby/bin, dev/bin, dev/mingw/bin 를 windows path에 등록한다. 

6. ImageDrive 설치

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

: set CPATH=C:\Program Files\ImageMagick-6.7.7-Q16\include

: set LIBRARY_PATH=C:\Program Files\ImageMagick-6.7.7-Q16\lib

7. install bundler

: gem install bundler

8. mysql DB 준비

  > create database redmine character set utf8;

  > create user 'redmine'@'localhost' identified by 'my_password';

  > grant all privileges on redmine.* to 'redmine'@'localhost';

9. redmine source download

10. redmine bundler gem install

: 개발환경이나 테스트 환경이 아니고, postgresql을 사용하고 있지 않기 때문에 이 부분을 제외하고 설치를 진행한다.

: bundle install --without development test postgresql

11. session token 생성

: rake generate_secret_token

12. mysql db schema 생성

: set RAILS_ENV=production

: rake db:migrate

13. default data load

: rake redmine:load_default_data --q

14. run redmine

: ruby script/rails server webrick -e production


* msvcrt-ruby18.dll 를 발견할 수 없다는 에러가 발생하는 경우, gem uninstall json을 시킨 이후에, bundle install 작업을 다시 한다.

14번과정까지 모두 마쳐지면, 이제 redmine을 사용할 수 있는 준비가 모두 된 상황이다. 






trac migration 작업


redmine은 기본적으로 trac에서 migrate되서 기본 project를 생성하는 기능을 제공한다. 명령어는 다음과 같다.

rake redmine:migrate_from_trac RAILS_ENV="production"


그런데, 이 migration 기능은 다음과 같은 문제점을 가지고 있다.

1. 한글명으로 된 첨부 파일이 ticket 또는 wiki에 있는 경우 migration 실패

2. trac에서 sqlite3를 사용한 경우, 날짜 값이 정상적으로 표시되지 않음

3. ticket과 issue의 데이터 차이로 인해, closed된 issue들이 모두 start_date와 end_date가 정상적으로 표시되지 않음

4. trac에서 사용된 head format이 redmine과 다르기 때문에 wiki 페이지가 정상적으로 표시되지 않음


이 4가지 문제점은 1, 2번은 migration을 수행하기전에, 3, 4번은 migration을 수행한 후 mysql의 데이터를 변경해서 수정 가능하다. (물론 3, 4번을 해결하기 위해서 migration부분 redmine 코드를 수정해서 migration을 수행해도 된다.)


1번 문제점은 노가다로 해결을 봤다.; 한글로 된 첨부파일 및 Image를 모두 제거하고, 영문으로 이름을 변경후에 다시 첨부하는 노가다 작업을 해서 해결을 했다. ruby에서 설정된 cp949 format의 한글을 정상적으로 decoding을 못하는 느낌인데... 일단 노가다로 되는 문제였어서;; 노가다로 해결;


2번은 unix에서의 timestamp을 mysql timestamp로 변경시킬 때 나오는 에러다.. trac.db 파일을 sqlite browser로 열어 다음과 같은 query를 실행한다.

UPDATE ticket SET time = time / 1000000 where time > 9999999999;

UPDATE ticket SET changetime = changetime / 1000000 where changetime > 9999999999;

UPDATE ticket_change SET time = time / 1000000 where time > 9999999999;

UPDATE milestone SET due = due / 1000000 where due > 9999999999;

UPDATE milestone SET completed = completed / 1000000 where completed > 9999999999;

UPDATE version SET time = time / 1000000 where time > 9999999999;

UPDATE auth_cookie SET time = time / 1000000 where time > 9999999999;

UPDATE session SET last_visit = last_visit / 1000000 where last_visit > 9999999999;

UPDATE session_attribute SET value = value / 1000000 where value > 9999999999 and name = 'query_time';

UPDATE attachment SET time = time / 1000000 where time > 9999999999;

UPDATE wiki SET time = time / 1000000 where time > 9999999999;

UPDATE revision SET time = time / 1000000 where time > 9999999999;


1, 2번 문제를 해결하면 migration 작업은 정상적으로 수행된다. migration이 수행된 후에 3,4 번 문제를 해결하도록 한다.


3번 문제점은 trac의 ticket은 start_date와 end_date 및 done_ratio를 지원하지 않기 때문에 issue의 값들이 null로 나오기 때문에 나오는 현상이다. 종료된 ticket의 생성날짜를 start_date로, 최종 변경날짜를 end_date로 변경해서 캘린더와 간트차트를 정상적으로 표시되게한다. 다음 query를 mysql에서 실행한다.

update issues set due_date = updated_on, start_date = created_on, done_ratio = 100 where status_id = 5;


4번 문제점은 migration된 trac wiki와 head format과, image 표시 방법, Table 표시방법이 다르기 때문에 나오는 문제상황이다.이 부분은 간단한 console 프로그램을 작성해서 해결했다. NHibernate를 기반으로 작성되어 있다. app.config에 redmine db 접속 정보만 넣어주고 실행시키면 된다.

RedmineWikiConvert.zip



trac에서 redmine으로 migration을 모두 마쳤다. T-T

약간 한가지 문제가 있는 것이, Grantt chart의 image export시에 한글이 모두 깨지는 문제가 발생하는데. 이에 대한 해결책은 gantt.rb 파일의 411 line에 다음과 같은 코드를 추가시켜주면 된다.


원 코드(굵은 색이 추가된 코드)

gc = Magick::Draw.new

gc.font = "G:\\Redmine\\font\\NanumGothic.ttf" (사용할 font의 ttf 파일 path를 넣어준다.)


Posted by Y2K
,

MVC4에서 API Controller가 나왔지만, 기존 MVC3에서도 API Controller와 거의 유사하게 동작이 가능한 API Controller를 작성 가능하다.


API Controller와 동일하게 동작하기 위해서는 Json형태로만 return을 시켜주면 되기 때문에, 굳이 기존의 APIController를 사용할 필요성은 없어보이기도 한다. 다만 XmlRpc와 같은 다른 Protocol을 충족시키기위해서는 필요한 사항이 있더라도 말이다. 


또한, API서버를 구축하고, 구축된 서버를 이용한 Cross Domain 문제를 해결하기 위해서는 Response의 Header에 AcessControlAllowOrgin 항목을 을 추가시켜줘야지 된다. 이는 이 API 서버에서 사용이 허용된 사이트가 어디인지를 확인하는 것으로 반드시 들어가줘야지 된다. 이 항목을 넣어주는 방법으로는 다음 3가지 방법이 존재한다. 



1. IIS에 기본 설정을 넣어주는 방법

> Response Header 설정을 이용. 모든 response에 Access-Control-Allow-Orgin을 허용으로 넣어준다. 



2. Global의 Application_BeginRequest을 이용하는 방법

> Global.asax.cs파일에 Applicaiton_BeginRequest를 구현한다.


        protected void Application_BeginRequest(object sender, EventArgs e)
        {
            HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            HttpContext.Current.Response.Cache.SetNoStore();
            SetEnabledCrossDmainAjaxCall();
        }

        private void SetEnabledCrossDmainAjaxCall()
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
            if(HttpContext.Current.Request.HttpMethod == "OPTIONS")
            {
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
                HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
                HttpContext.Current.Response.End();
            }
        }


3. Action Filter의 OnResultExcuted를 구현, ActionFilter를 적용하는 방법

> ActionFilter를 구현한다.


    public class CrossDomainAjaxCallAttribute : ActionFilterAttribute
    {
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            filterContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
            base.OnResultExecuted(filterContext);
        }
    }


Posted by Y2K
,

Chapter 1. MongoDB 소개

  • 기본적인 RDBMS의 데이터인 row라는 개념을 document로 변경
  • 문서의 키가 미리 정의되거나 고정적인 형태의 스키마가 존재하지 않는다. 
  • 다양한 확장 기능 : 복제, 레플리카, auto sharded 지원
  • javascript 문법에 기초한 명령어 Set 지원
  • json format의 데이터 지원


Chapter 2. 시작하기

  • 데이터의 기본단위는 문서이다. (document, json format)
  • "_"로 시작되는 키는 예약어로 사용하는 것이 좋다. (암묵적)
  • Collection
    • system 으로 시작되는 collection은 시스템에서 사용하는 예약어이기 때문에 사용할 수 없다.
  • 기본 database
    • admin : 인증관념에서의 'root' database. 모든 데이터베이스 목록을 조회하거나 서버를 중지하는 등 서버 전역에 걸쳐 실행하는 명령어들이 실행되는 영역
    • local : 특정 서버에서만 저장되는 collection에 사용된다.
  • Command
    • mongod : mongoDB 실행 command
    • mongo : mongoDB Shell
    • 기본 명령어 :  insert, find, findOne, update, remove
  • 데이터형
    • null : 존재하지 않는 필드 및 null값을 표현
    • boolean : true / false
    • number : mongoDB에서는 모든 숫자들은 64bit 부동 소수점으로 표현이 된다. 
    • datetime : new Date() 를 이용.
    • 정규표현식형
    • javascript code
    • undifined : javascript의 undifined를 문서내에서 사용할 수 있다.
    • array 
  • _id
    • mongoDB에 저장되는 모든 문서들은 "_id"를 가지고 있다.
    • Timestamp | MachineId | PID | Increment 값을 이용해서 12byte의 데이터를 만들어준다.
    • document가 insert 될 때, 자동으로 추가된다.


Posted by Y2K
,