페이지

2014년 12월 29일 월요일

Rails 프로젝트의 Ruby 버전 변경방법

ruby-2.0.0 에서 ruby-2.1.1 로 바꾸는 과정


$rvm install ruby-2.1.1
$rvm use ruby-2.1.1

Gemfile edit
ruby '2.1.1'

$bundle

2014년 12월 19일 금요일

Heroku에 Ruby on Rails App 배포하기

이번 포스팅에서는 레일즈 앱을 Heroku에 배포하는 과정을 정리해보겠습니다.

https://www.heroku.com/

앞서 필요한것들

  • Heroku 계정
  • Ruby 설치
  • Bundler 설치 - gem install bundler

헤로쿠 툴벨트 다운로드 및 설치

사이트에서 운영체제에 맞는 헤로쿠 툴벨트를 다운로드하고 설치합니다.
Download Heroku Toolbelt for Mac OS X

터미널 혹은 커맨드창에서
$heroku --version
입력해서 버전이 출력되면 제대로 설치된 것입니다.

헤로쿠 로그인

$heroku login
이메일과 암호를 입력하여 로그인을 합니다.

Git 등록 및 Heroku 생성

헤로쿠로 배포하기위한 앱 디렉토리로 이동합니다.
앱은 git에 등록되어 있어야 합니다.
되어있지 않다면 아래와 같은 과정을 거쳐야합니다.
$git init
$git add -A
$git commit -m 'init'

이제 헤로쿠에 앱을 만들고 현재 로컬 디렉토리의  git에 원격저장소 heroku 정보를 추가합니다.
$heroku create
Git remote heroku added 와 같이 출력되면 정상입니다.
만약 출력되지 않는다면 git 등록을 빼먹지 않았는지 확인해보세요.

$git config -e 
하여 [remote "heroku"]와 같이 heroku 가 추가되어있는지 확인해봅니다.

Heroku로 배포

이제 git 을 이용하여 로컬저장소에 커밋된 내용을 원격저장소 heroku의 master로 push합니다.
$git push heroku master

heroku에서 처리되는 내용이 출력되는데요. 에러나 경고가 나타날 수 있습니다.
이에 관해 알아보겠습니다.

sqlite3 비활성화

헤로쿠에서는 sqlite3를 사용하지 못하는듯 합니다. 기본 데이터베이스로 postgresql을 사용하므로 이에 맞도록 Gemfile 을 수정해 주어야 합니다. ( 데이터베이스 적용은 하단에서 )

group :development do
gem 'sqlite3'
end
group :production do
gem 'pg'
gem 'rails_12factor' 
end

Include 'rails_12factor' gem to enable all platform features
=> gem 'rails_12factor'
ruby 버전을 명시하지 않았다는 경고
=> ruby '2.0.0' # 사용중인 버전

이 외에도 다른 경고가 나올때는 참고 URL이 나오므로 확인해봅니다.

이와같이 로컬에서 수정한 내용은 반드시 git commit 해야 git push heroku master시 반영됩니다.
Gemfile 을 수정한 경우에는 bundle install 을 먼저 실행한 후에 git add, commit, push 순서로 하여야 합니다.

별문제없이 배포가 완료되면 메시지 끝부분에
https://앱이름.herokuapp.com/
와 같은 주소가 출력됩니다. 이 주소를 브라우저에서 확인해봅니다.
$heroku open 
명령을 실행하면 기본 브라우저로 사이트를 확인할 수 있습니다.

$heroku logs --tail
명령을 실행하면 실시간으로 로그를 확인할 수 있습니다.

$heroku run rails console
명령을 실행하면 콘솔을 실행할 수 있습니다.

데이터베이스에 관하여

$heroku config
$heroku pg
명령으로 데이터베이스 정보를 확인할 수 있습니다.

config/database.yml 을 열어서 production: 파트를 다음과 같이 수정합니다.
production:
  adapter: postgresql
  encoding: unicode
  pool: 5

커밋, heroku 로 push 합니다.
디비를 반영하고 결과를 확인합니다.
$heroku run rake db:migrate
$heroku pg

그 외에 확인해 볼것들

  • Procfile 정의
  • 스케일 변경
  • Provision add-ons




2014년 12월 18일 목요일

VB.NET JSON 처리 ( Newtonsoft.json 이용 )


패키지 관리자 콘솔에서 Newtonsoft.json을 설치해줍니다.
install-package Newtonsoft.json
(참고:visual studio 에서 package manager console ( install-package ) 사용하는 방법)

필요한 패키지를 임포트합니다.
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq

json 문자열을 준비합니다. (vb 에서는 문자열 안에 큰따옴표 넣기위해 큰따옴표를 두번입력합니다.) json 문자열을 파싱하여 개별 항목값을 읽어봅니다.
Dim jsonString As String = "{""id"":1,""name"":""홍길동""}"
Dim jsonObject As JObject = JObject.Parse(jsonString) 'Object 만 파싱 한다.
Console.WriteLine("id:" & jsonObject.SelectToken("id").ToString)
Console.WriteLine("name:" & jsonObject.SelectToken("name").ToString)
직렬화 기능을 이용해 봅니다.
json 구조에 대응되는 클래스를 준비합니다.
Public Class Name
    Public Property id
    Public Property name
End Class

변환합니다.
Dim jsonString As String = "{""id"":1,""name"":""홍길동""}"
Dim onename As Name = JsonConvert.DeserializeObject(Of Name)(jsonString)
Console.WriteLine("id:" & onename.id)
Console.WriteLine("name:" & onename.name)

json 배열로 되어있는 데이터를 변환합니다.
Dim jsonString As String = "[{""id"":1,""name"":""홍길동""},{""id"":2,""name"":""임꺽정""}]"
Dim nameList As List(Of Name) = JsonConvert.DeserializeObject(Of List(Of Name))(jsonString)
For Each onename As Name In nameList
    Console.WriteLine("id:" & onename.id)
    Console.WriteLine("name:" & onename.name)
Next
객체를 문자열로 변환합니다.
Console.WriteLine(JsonConvert.SerializeObject(nameList(0)))

참고링크


visual studio 에서 package manager console ( install-package ) 사용하는 방법

visual studio 에서 package manager console ( install-package ) 사용하는 방법



아래와 같이 install-package 원하는패키지명 을 입력합니다.

아래와 같이 설치 진행을 확인할 수 있습니다.



참고링크

http://docs.nuget.org/docs/start-here/using-the-package-manager-console

VB.NET 날짜 시간 관련 코드 조각 ( DateTime )

1.
TextBox1.Text = DateTime.Now.ToShortTimeString '오후 12:54
TextBox1.Text = DateTime.Now.ToLongTimeString '오후 12:54:30

2.
Dim oldTime As DateTime
oldTime = DateTime.Now

While True
    Dim millis = (DateTime.Now - oldTime).TotalMilliseconds
    Console.WriteLine("millis:" & millis)

    If millis > 1000 * 5 Then '5초가 지나면
        Exit While
    End If
    Thread.Sleep(TimeSpan.FromMilliseconds(100))
End While
TextBox1.Text = "end."

VB.NET Process 사용예제 ( PDF 열기 )

Dim process As New Process
Dim startInfo As New ProcessStartInfo

startInfo.RedirectStandardOutput = False
startInfo.FileName = "C:\sample.pdf"
startInfo.UseShellExecute = True

process.StartInfo = startInfo
process.Start() ' 여기서 프로그램이 실행됩니다.

' 실행된 서브프로세스가 종료되어야 메인프로그램을 쓰게 하고 싶다면 아래 내용을 진행합니다.

process.WaitForExit() ' 프로세스가 종료될때까지 기다립니다.
process.Close()

2014년 10월 22일 수요일

mysql 쿼리 결과 파일로 저장하기

mysql dbname -e "select * from tablename" -t > outfile.txt


  • -e : Execute command and quit.
  • -t : Output in table format.

2014년 2월 28일 금요일

메이븐을 이용하여 톰캣에 배포하기

메이븐을 이용하여 톰캣에 자동배포하는 방법을 정리해 봅니다.


1.
우선 톰캣의 tomcat-users.xml 파일에 다음 내용을 추가합니다.
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="user1" password="pass1" roles="manager-gui,manager-script"/>

1-1.
<role rolename="manager-gui"/> 
Tomcat Web Application Manager 사용권한을 활성화 합니다.
http://localhost:8080/manager/

1-2.
<role rolename="manager-script"/>
스크립트로 관리하는 인터페이스를 활성화 합니다.
http://localhost:8080/manager/text

1-3.
<user username="user1" password="pass1" roles="manager-gui,manager-script"/>
user1 의 암호를 pass1으로 하고 위의 두가지 권한을 부여합니다.

2.
메이븐 pom.xml에 플러그인을 등록합니다.
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/</path>
<url>http://localhost:8080/manager/text</url>
<username>user1</username>
<password>pass1</password>
</configuration>
</plugin>

2-1.
<path>/</path> 
배포될 경로를 설정합니다. 현재는 루트 경로를 지정하였습니다.  http://localhost:8080/
http://localhost:8080/abc/ 로 배포하고 싶다면 <path>/abc</path> 로 설정하면됩니다.

2-2.
<url>http://localhost:8080/manager/text</url>
톰캣관리자의 스크립트 모드 경로를 지정합니다.

2-3.
<username>user1</username>
<password>pass1</password>
위의 톰캣에서 설정한 유저를 적어줍니다.

3.
이제 웹어플리케이션을 빌드하고 톰캣에 배포하는 명령입니다.
mvn tomcat7:redeploy

4.
아래의 명령으로 톰캣에서 제거할 수도 있습니다.
mvn tomcat7:undeploy
5.
참고


2014년 2월 26일 수요일

Spring Guide - Securing a Web Application 학습정리

https://spring.io/guides/gs/gradle/ Building Java Projects with Gradle
https://spring.io/guides/gs/securing-web/ Securing a Web Application
https://spring.io/guides/gs/convert-jar-to-war/ Converting a Spring Boot JAR Application to a WAR

학습내용 정리

1.
gradle 설치 혹은 업그레이드
http://www.gradle.org/downloads
파일 다운로드 받고 압축해제 후 원하는 위치로 이동 해줍니다.
예: D:\gradle-1.11
기존 gradle 폴더는 지워버리고
환경변수에서 GRADLE_HOME=D:\gradle-1.11 로 설정합니다.
PATH 에 %GRADLE_HOME%\bin 를 추가합니다.

gradle -version
: 버전 출력
gradle
: welcome message 출력
gradle tasks
: 사용가능한 태스크 목록 출력. gradle taskname 형태로 실행
gradle wrapper
: gradlew.bat 파일을 생성 시켜줍니다. 이 파일은 시스템내에 gradle이 설치되어있지 않아도 알아서 다운로드하고 빌드해줍니다. 이렇게 wrapper를 생성하고 프로젝트를 공유하면 그래들이 설치되어있지 않은 유저도 바로 빌드 할 수 있게됩니다.


2.
가이드에서
build.gradle
MvcConfig.java
home.html
hello.html
까지만 작성하고 실행해보면 ( gradlew clean build )

다음과 같은 에러가 발생하는데
Execution failed for task ':bootRepackage'.

public static void main(String[] args)
메소드를 가진 설정 클래스가 없어서 그런것입니다.

가이드에선 Application.java 파일을 만들어 주면 제대로 컴파일됩니다.

3.
java -jar build/libs/gs-securing-web-0.1.0.jar
앱을 실행해보면 로그인 창이 나타나는데

build.gradle 에서

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    // compile("org.springframework.boot:spring-boot-starter-security")
    compile("org.thymeleaf:thymeleaf-spring4")
    testCompile("junit:junit")
}

compile("org.springframework.boot:spring-boot-starter-security")
를 주석처리하고 다시 빌드하고 실행해보면 로그인 창이 나타나지 않습니다.

4.
WebSecurityConfig.java : security 설정 클래스

5.
로그아웃 처리
http://localhost:8080/login?logout

6.
war 파일 만들기
build.gradle 파일에 아래 내용 추가
apply plugin: 'war'
war {
    baseName = 'gs-securing-web'
    version =  '0.1.0'
src/main/java/hello/HelloWebXml.java 파일 생성

톰캣에 넣고 돌려보면
java.lang.ClassNotFoundException: org.apache.tomcat.websocket.server.WsSci
와 같은 에러가 발생하는 경우가 있는데
이경우 가장 편한방법은 에러메시지에 나오는 톰캣버전과 같은 버전의 톰캣에서 돌리면 에러가 발생하지 않습니다.

참고
http://stackoverflow.com/questions/20922958/crash-deploying-spring-boot-war-in-tomcat