install ruby on rails and redmine on ubuntu

1. used source files

ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p174.tar.gz
http://rubyforge.org/frs/download.php/69365/rubygems-1.3.6.tgz
( 최신버전으로 1.6.x를 설치해보았으니 rubygem 1.6과 redmine 1.1.2와 호환되지 않는듯
http://rubyforge.org/frs/download.php/74419/redmine-1.1.2.tar.gz

2. ruby

ruby 압축을 풀고
>./configure
>make
>make install

3. rubygems 설치

압축을 풀고
>ruby setup.rb ( 필요한 경우 sudo )

4. Rails 설치

>gem install rake
>gem install rails -v=2.3.5
<code>&gt;gem install rack -v=1.0.1</code>
<code>
</code>

5. Mysql 구성

>mysql -u root mysql -p
mysql&gt; create database redmine character set utf8;
mysql&gt; create user 'redmine'@'localhost' identified by '암호;
mysql&gt; grant all privileges on redmine.* to 'redmine'@'localhost';

<strong>6.Redmine 구성</strong>
>cd /usr/local/
>tar xvfz /usr/local/src/redmine-1.1.2.tar.gz
>cd redmine-1.1.2/
>config/database.yml.example config/database.yml
>nano config/database.yml
   production:
   adapter: mysql
   database: redmine
   host: localhost
   username: redmine
   password:암호
   encoding: utf8
<pre id="aeaoofnhgocdbnbeljkmbjdmhbcokfdb-mousedown">&gt;gem install -v=0.4.2 i18n

>RAILS_ENV=production rake config/initializers/session_store.rb

&gt;apt-get install libmysqlclient15-dev (MySql 4.x 인 경우 libmysqlclient12-dev)
<pre id="aeaoofnhgocdbnbeljkmbjdmhbcokfdb-mousedown">&gt;gem install mysql

>RAILS_ENV=production rake db:migrate

>RAILS_ENV=production rake redmine:load_default_data

>ruby script/server webrick -e production

http://IP:3000/으로 확인

서버 종료시 Ctrl+C 사용

<strong>7. Passenger 사용하여 Rails 프로젝트 Apache에 연결</strong>
 * 참고사이트 : http://srue.net/91
> gem install passenger
  잘 안되는 경우에는 rm -r ~/.gem
> passenger-install-apache2-module
  시키는대로 설치한다.
  apache가 다른 경로에 있는 경우에는 path에 추가 후 실행한다.
> export PATH=/usr/local/apache2/bin:$PATH
  PATH를 지정해도 안되는 경우에 sudo 명령을 사용하지 말고 디렉토리 권한을 변경 후 다시 시도해본다.
  설치가 완료되면 Apache를 어떻게 수정하라고 알려준다. 알려준대로 수정 후 아파치 리스타트
* 가상호스트 없이 접속하는 방법으로
<a href="http://mattconnolly.wordpress.com/2010/09/19/redmine-ruby-on-rails-without-virtual-hosts/">http://mattconnolly.wordpress.com/2010/09/19/redmine-ruby-on-rails-without-virtual-hosts/</a>
를 참조하였으나 뭔가 오류 발생
<div id="_mcePaste">*** Exception SecurityError in spawn manager (Insecure operation - exist?) (process 27151, thread #&lt;Thread:0xb781a1ac&gt;):</div>
<div id="_mcePaste">from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.5/lib/phusion_passenger/utils/tmpdir.rb:51:in `exist?'</div>
<div id="_mcePaste">from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.5/lib/phusion_passenger/utils/tmpdir.rb:51:in `passenger_tmpdir'</div>
<div id="_mcePaste">from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.5/lib/phusion_passenger/utils/tmpdir.rb:31:in `passenger_tmpdir'</div>
<div id="_mcePaste">from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.5/lib/phusion_passenger/abstract_server.rb:119:in `initialize'</div>
<div id="_mcePaste">from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.5/lib/phusion_passenger/classic_rails/application_spawner.rb:117:in `initialize'</div>
<div id="_mcePaste">from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.5/lib/phusion_passenger/spawn_manager.rb:201:in `new'</div>
<div id="_mcePaste">from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.5/lib/phusion_passenger/spawn_manager.rb:201:in `spawn_rails_application'</div>
<div id="_mcePaste">from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.5/lib/phusion_passenger/spawn_manager.rb:215:in `call'</div>
<div id="_mcePaste">from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.5/lib/phusion_passenger/spawn_manager.rb:215:in `spawn_rails_application'</div>
<div id="_mcePaste">from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.5/lib/phusion_passenger/abstract_server_collection.rb:132:in `lookup_or_add'</div>
<div id="_mcePaste">from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.5/lib/phusion_passenger/spawn_manager.rb:214:in `spawn_rails_application'</div>
<div id="_mcePaste">from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.5/lib/phusion_passenger/abstract_server_collection.rb:82:in `synchronize'</div>
<div id="_mcePaste">from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.5/lib/phusion_passenger/abstract_server_collection.rb:79:in `synchronize'</div>
<div id="_mcePaste">from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.5/lib/phusion_passenger/spawn_manager.rb:213:in `spawn_rails_application'</div>
<div id="_mcePaste">from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.5/lib/phusion_passenger/spawn_manager.rb:132:in `spawn_application'</div>
<div id="_mcePaste">from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.5/lib/phusion_passenger/spawn_manager.rb:275:in `handle_spawn_application'</div>
<div id="_mcePaste">from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.5/lib/phusion_passenger/abstract_server.rb:357:in `__send__'</div>
<div id="_mcePaste">from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.5/lib/phusion_passenger/abstract_server.rb:357:in `server_main_loop'</div>
<div id="_mcePaste">from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.5/lib/phusion_passenger/abstract_server.rb:206:in `start_synchronously'</div>
<div id="_mcePaste">from /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.5/helper-scripts/passenger-spawn-server:99</div>
아직 원인 해결 못함.. ㅠㅗㅜ

DismissingAlertView

Automatically dismissing UIAlertView.

DismissingAlertView.h

//
//  DismissingAlertView.h
//
//  Created by hytgbn on 10. 4. 29..
//  Copyright 2010 hytgbn. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol DismissingAlertViewDelegate 

-(void)onDismissingAlertView:(id)control;

@end

@interface DismissingAlertView : UIAlertView <UIAlertViewDelegate> {
	id<DismissingAlertViewDelegate> dismissingDelegate;
}

@property(nonatomic, assign) id<DismissingAlertViewDelegate> dismissingDelegate;

+ (id)alertWithTitle:(NSString *)title message:(NSString*)msg interval:(NSTimeInterval)ti delegate:(id<DismissingAlertViewDelegate>)obj;
+ (id)alertWithTitle:(NSString *)title message:(NSString*)msg interval:(NSTimeInterval)ti;

@end

DismissingAlertView.m

//
//  DismissingAlertView.m
//
//  Created by hytgbn on 10. 4. 29..
//  Copyright 2010 hytgbn. All rights reserved.
//

#import "DismissingAlertView.h"


@implementation DismissingAlertView

@synthesize dismissingDelegate;

+ (id)alertWithTitle:(NSString *)title message:(NSString*)msg interval:(NSTimeInterval)ti delegate:(id<DismissingAlertViewDelegate>)obj {
	DismissingAlertView *alertView = nil;
	if( alertView = [[super alloc] initWithTitle:title message:msg delegate:self cancelButtonTitle:nil otherButtonTitles:nil] ) {
		
		[NSTimer scheduledTimerWithTimeInterval:2 target:alertView selector:@selector(hideUI:) userInfo:nil repeats:NO];
		[alertView setDismissingDelegate:obj];
		[alertView show];
		
	}
	return [alertView autorelease];
}

+ (id)alertWithTitle:(NSString *)title message:(NSString*)msg interval:(NSTimeInterval)ti {
	return [DismissingAlertView alertWithTitle:title message:msg interval:ti delegate:nil];
}

- (void)hideUI:(NSTimer *)timer {
	[self dismissWithClickedButtonIndex:0 animated:NO];	 
	
	if( dismissingDelegate != nil ) {
		[dismissingDelegate onDismissingAlertView:self];
	}
}

@end

Usage :

    [DismissingAlertView alertWithTitle:@"Error" message:@"You got the error!" interval:3.0];

Also you can get dismissing event.
self implements DismissingAlertViewDelegate

    [DismissingAlertView alertWithTitle:@"Error" message:@"You got the error!" interval:3.0 delegate:self];

wget으로 cookie가 필요한 다운로드 콘솔에서 하기

쿠키가 필요한 다운로드 콘솔에서 하기

xcode 3.2.5를 다운로드 하려다가

거대한 용량 3.5G와… 지긋지긋한 속도때문에;; 당췌 다운로드가 되질 않았다.

속도가 나올때는 괜찮았는데 느려서 그런지 몇시간씩 다운로드 걸고 있으면 에러가 나있기도 하고

wget 을 쓸 순 없을까.. 하는 생각에 찾아보니

cookie를 이용한 방법을 찾았다. ( http://omegadelta.net/2010/11/24/downloading-ios-iphone-sdks-on-bad-connections/ )

firefox에서 Cookie Exporter라는 add-on을 설치하면 현재 브라우저의 쿠키를 파일로 저장해준다.

아래와 같이 하면 쿠키파일을 이용해서 로그인 상태로 받을 수 있다.

 wget --server-response --continue --no-check-certificate --load-cookies=cookies.txt [다운로드경로]

nohup등을 이용하면 더욱 편리하게 받을 수 있다.

이렇게 하면

[OAuthConsumer] OADataFetcher memory leak

OADataFetcher has memory leak.

it’s Issue 159 of OAuthConsumer project.

That, however, is not modified yet.

change code

- (void)fetchDataWithRequest:(OAMutableURLRequest *)aRequest 
					delegate:(id)aDelegate 
		   didFinishSelector:(SEL)finishSelector 
			 didFailSelector:(SEL)failSelector 
{
    request = aRequest;
    delegate = aDelegate;
    didFinishSelector = finishSelector;
    didFailSelector = failSelector;
    
    [request prepare];
    
    responseData = [NSURLConnection sendSynchronousRequest:request
                                         returningResponse:&response
                                                     error:&error];
	
    if (response == nil || responseData == nil || error != nil) {
        OAServiceTicket *ticket= [[[OAServiceTicket alloc] initWithRequest:request
                                                                 response:response
                                                               didSucceed:NO] autorelease]; // * add autorelease 
        [delegate performSelector:didFailSelector
                       withObject:ticket
                       withObject:error];
    } else {
        OAServiceTicket *ticket = [[[OAServiceTicket alloc] initWithRequest:request
                                                                  response:response
                                                                didSucceed:[(NSHTTPURLResponse *)response statusCode] < 400] autorelease]; // * add autorelease
        [delegate performSelector:didFinishSelector
                       withObject:ticket
                       withObject:responseData];
    }   
}

[UIImage+Rotation] Rotation UIImage with custom angle

어젯밤 UIImage Rotation 을 구글링하다
마땅히 찾지 못해서;;

일단 급하게 만들어봄..

Rotation하면 크기가 커지기 마련인데;;

그냥 UIImageView transform하듯이 하려면

중간에 주석을 제거하면 된다.

/**
 * UIImage + Rotation
 * angle in radian
 * @hytgbn
 */
- (UIImage *)rotateImage:(UIImage *)image angle:(CGFloat)rad{
	
	CGImageRef imageRef = [image CGImage];
	CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(imageRef);
	CGColorSpaceRef colorSpaceInfo = CGColorSpaceCreateDeviceRGB();
	
	if (alphaInfo == kCGImageAlphaNone)
		alphaInfo = kCGImageAlphaNoneSkipLast;
	
// original image size
	CGFloat width, height;
	
	width = [image size].width;
	height = [image size].height;
	
// this kind of a dull stuff, looking for better looking-good code..

	CGFloat newWidthMax = max( 0.f*cos(rad)+0.f*sin(rad) ,
							  max( width*cos(rad)+height*sin(rad) ,
								  max( 0.f*cos(rad)+height*sin(rad) ,
									  width*cos(rad)+0.f*sin(rad) )));
	CGFloat newWidthMin = min( 0.f*cos(rad)+0.f*sin(rad) ,
							  min( width*cos(rad)+height*sin(rad) ,
								  min( 0.f*cos(rad)+height*sin(rad) ,
									  width*cos(rad)+0.f*sin(rad) )));
	CGFloat newHeightMax = max( -0.f*sin(rad)+0.f*cos(rad) ,
							   max( -width*sin(rad)+height*cos(rad) ,
								   max( -0.f*sin(rad)+height*cos(rad) ,
									   -width*sin(rad)+0.f*cos(rad) )));
	CGFloat newHeightMin = min( -0.f*sin(rad)+0.f*cos(rad) ,
							   min( -width*sin(rad)+height*cos(rad) ,
								   min( -0.f*sin(rad)+height*cos(rad) ,
									   -width*sin(rad)+0.f*cos(rad) )));
	
	CGFloat newWidth = newWidthMax - newWidthMin;
	CGFloat newHeight = newHeightMax - newHeightMin;
// and if you want to rotate into same size, uncomment 2 lines
//    newWidth = width;
//    newHeight = height;
	
	DLog(@"original : %f, %f", width, height);
	DLog(@"new : %f, %f", newWidth, newHeight);
	
	CGContextRef bitmap;
	
	bitmap = CGBitmapContextCreate(NULL, (int)newWidth, (int)newHeight, 
								   CGImageGetBitsPerComponent(imageRef),0, colorSpaceInfo, alphaInfo);
	
	CGContextTranslateCTM (bitmap, newWidth/2.f,newHeight/2.f);
	CGContextRotateCTM (bitmap, rad);		
	CGContextTranslateCTM (bitmap, -width/2.f,-height/2.f);
	
	CGContextDrawImage(bitmap, CGRectMake(0, 0, width, height), imageRef);
	CGImageRef ref = CGBitmapContextCreateImage(bitmap);
	UIImage *result = [UIImage imageWithCGImage:ref];
	
	CGContextRelease(bitmap);
	CGImageRelease(ref);
	
	return result;
	
}

블로그 이전

일단 이전에 사용중이던 000webhost에서 왠지 모를 밴을 당하고;;

블로그를 이전했습니다. 그간 뭔가 이것저것 하느라 바빠서.. 사실 글도 안썼지만..

그래서 백업한 데이터도 없었네요;; 1월정도부터 데이터가 날아갔네요;;

워드프레스 세팅도 상당부분 틀어졌고.. 조만간 한번 날잡고 정리를 다시 해야겠습니다.

블로그 이전

일단 이전에 사용중이던 000webhost에서 왠지 모를 밴을 당하고;;

블로그를 이전했습니다. 그간 뭔가 이것저것 하느라 바빠서.. 사실 글도 안썼지만..

그래서 백업한 데이터도 없었네요;; 1월정도부터 데이터가 날아갔네요;;

워드프레스 세팅도 상당부분 틀어졌고.. 조만간 한번 날잡고 정리를 다시 해야겠습니다.

[iphone] 아이폰 어플 주유정보

appstore 에 두번째로 올라간 어플.

인근지역의 주유소 위치와 가격정보를 보여주는 앱이다.

주유소별, 휘발유,경유,LPG 가격별로 정렬이 가능하며

자주가는 지역 (회사, 집, 시집, 친정 등)을 등록해서 출발하기 전에 해당 지역의 주유소 가격을
미리 판단하고 다닐 수 있다.
결국 원하는 주유소에서 조금 저렴한 가격으로 주유가 가능하다.

 iphone frame으로 만든 첫 어플이어서 삽질도 많이 했다.
(첫 어플은 3d engine만들어서 작업한 것이라…)

주유소 정보와 구글맵과의 좌표계가 달라서 맞추는데 삽질..

역시 회사 다니면서 뭔가 만드는건 엄청난 시간과 정신의 피로가..!!

문의사항 및 요구사항
트위터의 @hytgbn 으로 연락해주세요

History

[Ver 1.01] – 2010.01.08
  – 등록시 reverse-geocoding 에 실패할 경우 발생하던 오류 수정 (@seaminds 님 제보)
  – bounce 기능 추가 (@8CK 요구)

[Ver 1.1] – 2010.01.09
  – TM128 좌표계에서 WGS84로 옮기는 과정에 좌표 오차 수정
  ( 릴리즈가 8시간도 안되서 통과.. 앱스토어의 직원이 대폭 늘었나? -_-)

[iphone] 아이폰 어플 주유정보

appstore 에 두번째로 올라간 어플.

인근지역의 주유소 위치와 가격정보를 보여주는 앱이다.

주유소별, 휘발유,경유,LPG 가격별로 정렬이 가능하며

자주가는 지역 (회사, 집, 시집, 친정 등)을 등록해서 출발하기 전에 해당 지역의 주유소 가격을
미리 판단하고 다닐 수 있다.
결국 원하는 주유소에서 조금 저렴한 가격으로 주유가 가능하다.

 iphone frame으로 만든 첫 어플이어서 삽질도 많이 했다.
(첫 어플은 3d engine만들어서 작업한 것이라…)

주유소 정보와 구글맵과의 좌표계가 달라서 맞추는데 삽질..

역시 회사 다니면서 뭔가 만드는건 엄청난 시간과 정신의 피로가..!!

문의사항 및 요구사항
트위터의 @hytgbn 으로 연락해주세요

History

[Ver 1.01] – 2010.01.08
  – 등록시 reverse-geocoding 에 실패할 경우 발생하던 오류 수정 (@seaminds 님 제보)
  – bounce 기능 추가 (@8CK 요구)

[Ver 1.1] – 2010.01.09
  – TM128 좌표계에서 WGS84로 옮기는 과정에 좌표 오차 수정
  ( 릴리즈가 8시간도 안되서 통과.. 앱스토어의 직원이 대폭 늘었나? -_-)