DBCP 설정 방법 원문은 다음을 참고 하자. 
http://commons.apache.org/dbcp/configuration.html


예시>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc url"
p:username="user"
p:password="password"
p:initialSize="5" 
p:maxActive="200" 
p:minIdle="100" 
p:testOnBorrow="true"
p:testWhileIdle="true" 
p:testOnReturn="true" 
p:validationQuery="select 1" />

p:testWhileIdle="true" 는 장시간 DB 작업이 없을 경우에도 지속적으로 validationQuery를 전송하여 연결이끊기는 것을 방지한다. 

p:testOnBorrow="true" 는 커넥션 풀에서 커넥션을 가져올때 커넥션이 유효한지 검사한다.

p:testOnReturn="true" 는 커넥션 풀에 커넥션을 반환할때 커넥션이 유효한지 검사한다.


자꾸만 DB 관련 에러가 나길래 보았더니 아무래도 데이터 소스 관련 설정 문제 인거 같아 위와같이 수정하니, 아직까지 에러가 나진 않는다. 에러가 다음과 같다면 한번쯤 생각해 보시길. 

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataAccessResourceFailureException: PreparedStatementCallback; SQL [select * from table where field=?]; Communications link failure due to underlying exception:
java.net.SocketException: Broken pipe
	at java.net.SocketOutputStream.socketWrite0(Native Method)
	at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
	at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
	at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
	at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
	at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2637)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1554)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
	at com.mysql.jdbc.Connection.execSQL(Connection.java:3176)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1153)
	at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1266)
	at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93)
	at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:643)
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:586)
	at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:636)
	at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:665)
	at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:673)
	at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:716)
	at com.embian.dao.UserDao.getUser(UserDao.java:23)
	at com.embian.controller.AuthController.doAuth(AuthController.java:28)
	at sun.reflect.GeneratedMethodAccessor60.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:717)
	at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:165)
	at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:378)
	at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:366)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Thread.java:619)




블로그 이미지

하루하루

하루하루를 열심히 살아가는 그런 사람이 되고자 합니다. 오늘을 후회없이 말이지요.

,
맨날 구글링 하지말고. 좀 적어놓자구.~ -_-;

< Subversive SVN Team Provider >

이미 Work with 리스트에 다음주소가 추가 되어 있다.
Galileo - http://download.eclipse.org/releases/galileo 선택
아래 그림처럼 Subversive SVN Team Provider 설치.



< SVNConnector >
http://community.polarion.com/projects/subversive/download/eclipse/2.0/galileo-site/
아래 부분 선택.
(윈도우 라면 JavaHL 1.6.0 Win32 Binaries 선택해서 함께 설치)

끝.

블로그 이미지

하루하루

하루하루를 열심히 살아가는 그런 사람이 되고자 합니다. 오늘을 후회없이 말이지요.

,

예를 들어서 VS2008 에서 다이얼로그 프로젝트를 생성한후,
ListControll 을 다이얼로그에 추가 합니다.
그리고 리스트 컨트롤에 더블클릭 이벤트를 추가하게 되면 코드가 다음과 같이 자동으로 생성됩니다.

void CHTS_DEMO4Dlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
 LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<NMITEMACTIVATE>(pNMHDR);
 // TODO: Add your control notification handler code here
 *pResult = 0;
 MessageBox(L"TestDBClick@!");
}


그리고 컴파일을 하게 되면 황당하게 에러가 나지요.

error C2440: 'reinterpret_cast' : cannot convert from 'NMHDR *' to 'NMITEMACTIVATE'

어이 없습니다. ㅋ

이럴땐 그냥 소스에 포인터 하나 찍어주세요

void CHTS_DEMO4Dlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
 LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<NMITEMACTIVATE *>(pNMHDR);
 // TODO: Add your control notification handler code here
 *pResult = 0;
 MessageBox(L"TestDBClick@!");
}

그럼 컴파일 성공~! ㅋㅋ

참 어이없는 버그 리포팅 이었습니다. ㅋ
자동으로 생성해주는 코드에 이런 어이없는 버그가 있다니.. -_-;;;
SP1 나왔다는데 그걸 설치하면 고쳐졌을려나요..? ^^

블로그 이미지

하루하루

하루하루를 열심히 살아가는 그런 사람이 되고자 합니다. 오늘을 후회없이 말이지요.

,

아이폰 개발에 발을 들여 놓고, 첫번째 어플이 등록되기까지의 과정을 정리해 보려 합니다. 이미 많은 분들이 기록을 남겨두어서 그리 어렵지 않게 따라올 수 있었습니다만, 그 와중에도 궁금했던 것들과, 잘 모르겠는것들이 나오더군요. 어찌어찌 해서 해결을 하긴 했는데, 아직 앱스토어에 등록을 기다리는 입장이라, 애플쪽에서 또 무슨 메일이 날라올지 두근두근하네요 ^^>

일단은, 아이폰 개발자 프로그램에 가입하는 과정부터 정리해 보도록 하겠습니다.


1.http://developer.apple.com 에 아이디를 만듭니다.

이 아이디는 중요합니다. 앞으로 등록하는 과정에서 필요한 모든 아이디는 이 아이디를 적습니다.


2. 개발자 프로그램에 가입을 합니다. 개인 사용자 또는 기업 사용자로 등록 할 수 있습니다.

저는 개인사용자로 해서 기업 사용자로 했을경우 어떤 혜택이 있는지는 자세히 모르겠습니다. 아마도 나중에 서류작업 할때 개인사용자 보다는 조금더 불편하겠죠? 그리고, 지역은 한국을 선택합니다.


3. 신기하게도, 등록을 다 마치고 나면, 한국 애플 스토어의 상품 형태로 개발자 프로그램을 구매할 수 있도록 장바구니에 개발자 프로그램이 들어 있습니다. 제가 1월달에 구매를 할때까지 10만 4천원 이었습니다. 환율때문에 가격이 더 오를지도 모르겠습니다.


4. 구매하고, 하루정도가 지나면 액티베이션 메일이 옵니다. (1 번에서 만들었던 아이디로 메일이 옵니다.)

메일에는 액티베이션 코드가 있는데, 메일에 있는 링크를 타고 들어와 코드를 넣으면 비로서 계정이 액티베이션이 됩니다. 하지만, 대부분(?)의 분들이 여기서 일단 거부를 당하더군요. 대부분의 이유는 결제한 사람과, 프로그램가입한 사람의 정보가 불일치(?)해서 신원 확인을 못하겠다는게 많은거 같습니다.

저도 이부분에서 위와같은 이유로 거부 당했는데요, 저 이전의 선배들의 경우를 찾아보니 애플 코리아 직원의 도움을 받아서 해결했다는 분들도 있고, 직접 전화를 걸어서 해결했다는 분들도 있었고, 메일 한통으로 해결하셨다는 분들도 계셨다길래, 가장 쉬운 메일쓰기를 시도해 보았습니다.

메일 내용은 대충, 결재하고 코드 넣었는데, 인증이 안되더라, 어떻게 된거니? 내가 이제 뭘하면 액티베이션 시켜 줄꺼니? 이런식의 내용이었습니다.

메일을 보내고 여권 스캔해서 메일또는 팩스로 보내야 하는것까지 각오하고 기다리고 있었는데, 의외로 미안하다고 잠시 홀딩 되어있었다고 하는 내용과 함께 액티베이션 시켜놨으니 확인해 보라는 메일이 오더군요.


5. 이제 계정을 액티베이션 하고 로그인을 하니 오른쪽 상단에 Program Portal 이 보입니다.

6. Program Portal 에 들어가면 다음과 같은 화면이 나오고 왼쪽에 있는 메뉴가 가장 많이 쓰는 메뉴 입니다.

7. Team 메뉴를 보면 자기 자신이 Agent 로 등록이 되어 있는걸 확인 할 수 있습니다.

이제 기기에 만들 프로그램을 직접 올려서 테스트 하기 위해서 인증서 등록과, 디바이스 등록 등의 작업이 남았습니다.


8. Certificates 메뉴에 가보면 Development 탭과 Distribution 탭이 보입니다.

Development 탭은 테스트로 기기에 프로그램을 올리기위한 인증서정보가 있는 탭이고, Distribution 탭은 개발을 완료하고 AppStore 나 AdHoc 으로 다른 기기에 테스트 배포를 해볼때 쓰는 인증서 정보가 있는 탭입니다.

현재는 기기에 테스트를 올릴것이기 때문에 본인의 맥에서 인증서를 생성한후 Development 탭에서 등록해 줘야 합니다.


9. Applications > Utilities > Keychain Access.app 을 실행 시킵니다.

Preferences 메뉴에서 2번째 탭 에서 모든 항복을 체크 하시고,   3번째 탭 Certificates 에서 다음과 같이 설정합니다.

10. 다음의 메뉴를 실행합니다.

11. 실행하면 Certificate Assistant 가 뜨면서 몇가지 정보를 입력하라고 나옵니다.

email 에 애플 아이디 를 입력하고, Common Name 에는 아이디 만들때 입력했던 이름이랑 똑같이 입력합니다. 아마도 이름 + 성 이 되겠죠? Save to disk 를 선택하고, Let me specify key pair infomation 을 체크한뒤 다음으로 넘어갑니다.

12. 2048, RSA 를 선택하고 저장합니다.

13. Program Portal 의 Certificate 메뉴의 Development 탭에서 add certificate 버튼을 눌러 12에서 저장했던 인증서를 submit 합니다.

14. 이제 사용자가 등록된걸 볼 수 있습니다. 조금 기다렸다가 새로고침을 한번 해주면, Action 메뉴에 Approve ,reject 가 나타나고, Approve 를 클릭해 줍니다.

15. Development 탭에서 'WWDR Intermediate Certificate' 를 다운로드 하여 실행시켜 수락합니다.

이제 Kechain Access 를 실행시켜 보면 다음과 같이 iPhone Developer 인증서가 등록되어 있습니다.

16. 이제 내 아이팟 터치를 개발용으로 Xcode 등록 시킵니다.

먼저 Xcode 를 실행시킨후에,터치를 연결하면 알림창이 하나 뜨는데, 그 알림창에서 Use For Development 버튼을 선택하면 개발용으로 등록 됩니다.

17. Apple Program Portal 에서 좀전에 등록한 터치를 Devices 에 등록합니다.

기기를 등록하기 위해선 아이팟 터치가 가지고 있는 identifier 번호가 필요 합니다. Xcode 의 Windows > Organizer 를 실행하면 등록된 아이팟이 보입니다.

18. 이제 App IDs 를 만들 차례 입니다.

App ID 는 자신이 만든 어플리케이션 마다 하나씩 부여해야되는 ID 인거 같습니다. ( 사실 저도 아직 한개 밖에 만들지 않아 잘 모르겠습니다. ) App ID 가 틀리면 기기에 올리는데 실패 합니다. 나중에 App 을 하나 더 추가해도 만들어 두었던 ID 로 계속 쓸 수 있는지는 잘 모르겠습니다. 테스트 해 본 바로는 하나의 App ID 와 밑에서 만들 Provisioning 파일을 가지고 여러개의 App 을 기기에 올려 볼 수 있더군요.

AppStore 에 올릴때는 어떨런지 잘 모르겠습니다. 경험 있으신분들은 댓글좀 부탁해요. ^^

App ID 를 만들려면, Manage 탭에서 Add ID 를 클릭하여 만들 수 있습니다.

App ID Name 에 마음에 드는 이름으로 넣고, App ID 란에도 마음에 드는 문자를 넣습니다. 설명에 보내 와일드 캐릭터(*) 도 가능하다고 하네요. submit 을 하면 id 가 생성 됩니다.

19. 이제 Provisioning 을 만듭니다.

Provisioning 파일은 테스트 기기에 어플리케이션을 올릴때 꼭 필요 합니다. 이 파일을 Xcode 내의 Organizer 에서해당 기기에 등록을 해줘야 개발버전의 테스트 코드를 직접 기기에 올려 테스트 해 볼수 있습니다.

Provisioning 메뉴의 Development 탭에서 'Add Profile' 버튼을 클릭 합니다.

프로파일 이름을 마음에 드는걸로 입력 하시고, 좀전에 생성했던 AppID 를 선택 하고 submit 합니다.

자시 시간이 지난후에 Provisioning 메뉴의 Development 탭을 보면, 방금 등록한 profile 이 있고, Actions 에 download 할 수 있는 버튼이 생겨 있습니다. 그 버튼을 눌러 다운로드 합니다.

20. 이제 로컬 컴퓨터에 provisioning 파일이 생겼습니다.

Xcode 에서 등록한 기기에 provisioning 파일을 등록해 줍니다. Xcode 메뉴중에 Window > Organizer 에서 등록된 기기를 선택하고, Provisioning 란에 드래그 해서 넣어주거나 + 버튼을 눌러 선택해 주면 됩니다.

21. 이제 소스 코드를 빌드해서 기기에서 테스트 할 수 있도록 설정을 바꿔줍니다.

개발하고 있는 프로젝트를 열어서 프로젝트 info 창을 엽니다. Info 창의 build 탭에서 code signing 부분에서 등록한 provisioning profile 을 선택 하도록 합니다.

22. 이제 프로젝트 overview 에서 device 로 설정하고 빌드해 봅니다.

이상으로 기기에 연결하는것 까지 해 보았습니다.

** 이글은 http://www.iphoneos.co.kr/zbxe/3801 Korea iphone dev group http://www.iphoneos.co.kr/ 의 웅이님이 작성한글을 토대로 제가 실행해 본것을 정리한 것입니다.

블로그 이미지

하루하루

하루하루를 열심히 살아가는 그런 사람이 되고자 합니다. 오늘을 후회없이 말이지요.

,
< mysql 사용자 권한 설정. >

mysql> grant all privileges on *.* to 'user'@'host' identified by 'new_password';

mysql> flush privileges;

참고 페이지

< root 암호 설정 >

mysqladmin -u root -p password new-password



맨날 잊어 먹고, 맨날 구글링 해서 쓴다.
잊어먹지 말자. -_-;;;
블로그 이미지

하루하루

하루하루를 열심히 살아가는 그런 사람이 되고자 합니다. 오늘을 후회없이 말이지요.

,
이번에 프로젝트에서 사용한 것을 정리하는 의미에서..(사실은 안까먹을려고.. ^^;; ) 포스팅 합니다.

먼저 config/database.yml 파일에 사용할 DB 정보를 적어줍니다.

mydb_development:
  adapter: mysql
  database: mydb
  username: root
  password:
  host: localhost
  socket: /var/run/mysqld/mysqld.sock
  encoding: utf8


그리고 Model 을 생성하고..

./script/generate model Receiver --skip-migration

만들어진 모델에서 DB 와 연결해 줍니다.

class Receiver < ActiveRecord::Base
  establish_connection :mydb_development
  set_primary_key "idx"
end

이렇게 하고 ./script/console 에서 확인해 보면 잘 동작하는것을 알 수 있습니다~ ^^

블로그 이미지

하루하루

하루하루를 열심히 살아가는 그런 사람이 되고자 합니다. 오늘을 후회없이 말이지요.

,

회사에서 하는 간단한 웹 서비스를 위해서, ROR 을 도입하여 , 프로토 타입을 만들어 보기로 하였다 .

일단, 개발에 걸린 시간은 3시간, 오호라.. 역시 빠르군. 코딩도 별로 하지 않았어. 좋아좋아.
그런데 삽질은 이제부터...
사실 프로토 타입이라 아파치 연동이라던가 밸런서 세팅같은 것은 별로 고려하지 않았었지만,
일단 시작하니, 멈출수가 없었다.

구글링을 통해서 알아보고 세팅 하기로한 조합은 다음과 같다.

RoR + apache2 + mongrel + mongrel_cluster + proxy_balancer

한국 웹페이지 중 가장 많은 참조를 받은 문서는 이것. => http://iadle.tistory.com/36

하지만, 이대로 했다가 실패하였다. 원인은, 나같은 서버세팅 초심자들이 해줘야 할 것들이 문서에는
빠져 있었던것.

주변 분들의 도움을 받아 해결한 삽질기를 공개한다 . 실질적인 세팅은 구글링 해보시길. ^^;
여기엔 내가했던 실수만 공개함.

  1. Virtual Host Setting 만 먼저 해본다.
    - 이 단계 에서는 레일스와 전혀 상관이 없다. 일단 Virtual Host 가 동작해야 Proxy 도 동작한다.
  2. proxy 세팅
    - proxy module 의 설정파일에서 ProxyRequests 를 On 으로 설정!!
    - proxy module 의 설정파일에서 Allow from all 로 세팅!!
  3. Virtual Host 세팅 파일에서 proxy 설정
    - KAE 님의 문서에서는 proxy_balancer 를 사용하는데, 결국에는 실패하고, 그냥 Proxy 서버로써
    내부적으로 돌아가고 있는 mongrel 서버에 연결해주는 데서 그쳐야 했다.

흠. 정리하니 간단하네 -_-;

'개발&팁' 카테고리의 다른 글

mysql 사용자 설정하기!  (0) 2009.01.11
Rails 에서 다중 DB 사용하기  (0) 2008.04.09
x-code 를 이용한 XPCOM Component universal binary build 하기  (0) 2008.03.10
rails api 문서 추출하기  (0) 2008.03.01
Unicode 와 BOM  (0) 2008.02.28
블로그 이미지

하루하루

하루하루를 열심히 살아가는 그런 사람이 되고자 합니다. 오늘을 후회없이 말이지요.

,

회사에서 하는 일을 기준으로 잊어먹지 않기위해 정리해 둡니다. ^^

기본적인 과정은 다음과 같다.


동일한 소스코드를 가지고, target 을 세개를 만든다.


1. i386 빌드를 위한 타켓 -> BSD Dynamic Library

2. PPC 빌드를 위한 타켓 -> BSD Dynamic Library

3. 두개 타겟을 가지고 lipo 이용한 스크립트를 실행시켜 universal binary 만들 타겟 -> Special Targets Aggregate


일단, MakeFile 있는 빌드 옵션들을 x-code 환경에 적어줘야 한다.


여기서 설명하는 x-code 버전은 3.0 기준으로 한다.


1. i386 타겟을 더블클릭한다.

2. Build -> Architectures -> Valid Architectures 항목을 i386으로 정해준다.

3. Build -> Build Locations -> Base SDK Path 값을 $(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk 으로 변경

4. Build -> Linking -> Other Linker Flags 값을


-Wl,-executable_path,/Users/jslee/Documents/DEV/FF-Extension/mozilla-u/build/ppc/dist/universal/xulrunner/XUL.framework/Versions/Current -lxpcomglue_s -lxpcom -lnspr4 -lplds4 -lplc4 -liconv


5. Build -> Search Paths -> Header Search Paths 값을 미리 컴파일한 "gecko sdk path"/include 경로를 적어준다. 이때 주의사항은 i386 이면 i386 gecko sdk path 적어주고, PPC 타겟이면 ppc gecko sdk path 적어준다.


6. Build -> Search Paths -> Library Search Paths 값을 미리 컴파일한 "gecko sdk path"/lib 경로와, 미리 universal binary 컴파일한 XUL.Framework 링크 시켜준다.

7. Build -> GCC 4.0 - Language -> Other C++ Flags 값에 -fshort-wchar 적어준다.

8. Build -> GCC 4.0 - Preprocessing -> Preprocessor Macros 값에 XP_UNIX=1 XP_MACOSX=1 값을 차례로 넣어준다.


이렇게 한후 하나씩 빌드해서 무리없이 빌드 되는것을 확인한다.


9. universal binary 만들 타겟 선택하여 new -> New Build Phase -> New Run Script Build Phase 실행

10. 9 에서 나오는 창에 script 란에 다음을 입력


lipo -create $TARGET_BUILD_DIR/libfpweblink-i386.dylib $TARGET_BUILD_DIR/libfpweblink-ppc.dylib -output $TARGET_BUILD_DIR/fpweblink.dylib


11. universal binary 로 만들 타겟 을 더블클릭하여 정보 창을 띄운다. 정보창에서 Direct Dependencies 에


- PPC Target

- i386 Target

두가지를 등록한다.


12. universal binary 타겟을 clean target 후 build 하면 의존성 걸려 있는 타겟들 부터 새로 빌드한후, universal binary 까지 만드는 것을 볼 수 있다.





'개발&팁' 카테고리의 다른 글

Rails 에서 다중 DB 사용하기  (0) 2008.04.09
Ruby On Rails + Apache2 + mongrel + proxy 설정  (1) 2008.03.18
rails api 문서 추출하기  (0) 2008.03.01
Unicode 와 BOM  (0) 2008.02.28
MAC 의 iTerm 의 vim 실행시 방향키 문제  (2) 2008.01.05
블로그 이미지

하루하루

하루하루를 열심히 살아가는 그런 사람이 되고자 합니다. 오늘을 후회없이 말이지요.

,

offline 에서도 ruby on rails 의 api document 가 보고 싶다면 다음과 같이 하면 된다.

$ rails rails_2.0.2
$ cd rails_2.0.2
$ rake rails:freeze:gems
$ rake doc:rails

위와 같이 하면 HTML 문서가 쫘르륵 생성 된다. 생성된 후에 doc/api/index.html 을 브라우저에 북마크 시켜 놓고 필요할때 마다 열어보면 된다. ^^

블로그 이미지

하루하루

하루하루를 열심히 살아가는 그런 사람이 되고자 합니다. 오늘을 후회없이 말이지요.

,

Unicode 와 BOM

개발&팁 2008. 2. 28. 10:39

BOM 은 Byte Order Mark 의 약자로서 인코딩된 문서의 첫머리에 삽입되어 문서를 읽을때 문서의 인코딩 방식을 알수 있게 하는 일종의 코드 같은 역할을 하게 됩니다. 이들 BOM 의 종류는 인코딩 방식에 따라서 다음표와 같네요.

인코딩 방식 Byte Order Mark(BOM)
UTF-8 EF BB BF
UTF-16 Big Endian FE FF
UTF-16 Little Endian FF FE
UTF-32 Big Endian 00 00 FE FF
UTF-32 Little Endian FF FE 00 00

어떤 유니코드 문서를 헥사 에디터로 열어보면 위 표에 나와있는 BOM 을 확인 할 수 있습니다.
하지만, 흔히들 겪는 문제인, UTF-8 환경에서의 BOM 은 조금 특별한데, UTF-8 에서는 Byte Order 가 없기 때문에, 단지 UTF-8 이라는 문서를 나타내는 표식으로 사용될 뿐이라 있어도 그만 없어도 그만 이라는거지요. 그래서 그런지 유닉스나, 리눅스 환경에서는 UTF-8 에서 BOM 을 사용하지 않는다고 합니다. 그래서 흔히들 문제가 발생하지요.

특히나, 요즘에는 웹개발시 UTF-8 이 대세로 자리잡아 감에 따라서 종종 이런 문제가 발생하는데요. IE 에서 UTF-8 BOM 을 해석 못한다거나, MSXML Parser 에서 (버전마다 다르답니다.) UTF-8 BOM 을 해석하지 못하는 문제 때문에 프로그램이 제대로 동작을 안한다거나 하는 문제가 발생합니다.

이런 문제는 단순히 BOM 을 제거하면 됩니다만, BOM 을 확인해서 모두 없애주는 툴이 존재하는지는 저도 아직 잘 모르겠고요.. UTF-8 문서를 저장할때, BOM 을 저장하거나 저장안하는 옵션을 제공하는 에디터를 사용하면 되겠습니다.

블로그 이미지

하루하루

하루하루를 열심히 살아가는 그런 사람이 되고자 합니다. 오늘을 후회없이 말이지요.

,