Ruby On Rails/agile note2012/05/04 17:32

내 주변에 나이는 어리지만 코딩을 잘하는 친구들이 몇몇 있다.

그 나이 또래 아이들과 비교하면 잘한다. 인정한다.

하지만 결과물만 만들어 낼뿐 그 과정이나 코드를 보면.. 막막하다.

그리고 이 결과물도 사실은 굉장히 내구성이 약하다.

그 이유야 여러가지가 있겠지만, 딱 하나를 꼽으라면

생각없이 그냥 막 코딩을 하기 때문이다.



생각없다는 표현이 좀 심했나? 그래 인정한다. 표현이 심했다. 사실 나도...

좀 더 순화시키고 디테일하게 말을 하자면 설계하는 과정이 없다는 것이다.

설계라고 하니 거창해 보이지만 내가 말하는것은 전체적인 구조를 짜는거 말고 어떻게 코딩할것인지 생각하는 과정이 없다는 것이다.


설계하는 과정이 없으니, 코드는 당연히 스파게티가 되고


음식 스파게티 사진맛있어보이는가? 저거 한가닥 한가닥 풀어볼 생각해봐라 ㅋㅋ


스파게티가 되니 버그가 많아지고

스파게티가 되니 디버깅도 힘들어지고

스파게티가 되니 협업하는 다른 개발자가 코드를 보기 힘들어지고

그렇다보니 다른 개발자도 "이미 버린 코드구나"하고 스파게티로 짜게 될 확률이 높아진다.

결국 코드는 산으로 가고

간단한 기능 수정하거나, 디버깅하는데 하루를 다 허비하게 되고

일정은 다가오고

일정을 맞추기 위해 맨날 밤새고


월화수목금금금 코딩하는 개발자


그러다 답이 없어서, 다른 프로젝트를 진행중이던 다른 개발자도 참여하게 되고

땜빵으로 들어간 다른 개발자는 코드를 보고 한숨을 쉬고 멘붕

땜빵 개발자는 억울하지만 어쩔 수 없이 같이 계속 밤새며 타이핑 한번, 한숨 한번, 타이핑 한번, 한숨을 반복하며 "내가 왜 여기있지?"라는 의문과 함께 코딩을 하고 (내 경험담이라 감정 이입해서 쓴거다.. ㅋ)

어찌어찌 오픈을 해도, 유리같은 결과물이라 툭 하면 에러나고, 컴플레인 들어오고



또 다시 디버깅을 위해 밤을 새고..

다음 릴리즈 일정은 다가오고

또 다시 밤을 새고

결국 회사는 망하게 되고


출근 안해도 된닼ㅋㅋㅋ


뭐 이런 악순환의 반복이 된다.


단순히 어떻게 코딩할 것 인지 고민을 안한것 만으로 도미너 처럼 하나하나 넘어져 결국 회사를 망하게 하거나 동료 개발자를 멘붕시킬 수 있다.

"문 헛소리냐? 님 쪼랩임? 애자일 모름? ㅋㅋ 난 애자일하게 하는거거든?" 이라고 카우방에서 젖소가 블리쟈드쓰는 소리를 한다면. 이런말 하는 사람은 디아2 해보지도 못한놈이 카우방 얘기하는거나 마찬가이다.

애자일을 이런 상황에 가따붙이라고 만든거 아니거든요? ㅋㅋㅋ

암튼, 여기서 교훈은 동료 개발자가 싫거나, 회사가 맘에 안들면 생각 따윈 집어치고 그냥 막 코딩을 하면 된다는 귀중한 가르침이다.

끝.










이라고 한다면 안그래도 방문자 없는 블로그인데

응? 방문자 없는 블로그니깐 이렇게 끝내도 아무도 모르겠구나.ㅋㅋㅋ

나 천재인가봐? ㅋㅋㅋ

불평만 하는 글이 됨으로, 부족한 사람이지만 몇가지 가이드를 책임없이 던져본다.

다시 말하지만 책임없이 던진다. 나한테 뭐라하기 없기다? ㅋㅋ


내용이 아주 오래전부터 할아버지 선배님들때부터 해오던 얘기들인것 같아 고리타분해지는것 같은데..


사실 코딩을 잘못해도 상관없다.

코딩은 그냥 하면 된다. 중요한것은 어떻게 코딩할것인가다.

설계를 어떻게 할 것인가? 이런거 얘기안할거다. 이건 책 봐라. 책 많다.

난 코딩하기전 이런 습관을 가져라 라고 얘기하고 싶다.



전체적인 그림을 그려라.



혼자하는 프로젝트일 경우, 생략할 수 도 있지만.. 이것도 짬이 없으면 해야 한다.

암튼 하면 좋다. ㅋㅋㅋ

정확할 필요는 없다. 많은 시간을 할당하지 않아도 된다.

빼먹는 부분(구멍)만 없으면 된다. 열심히 그렸는데 화장실 빼먹으면 망하는거다 ㅋㅋ


전체적인 그림을 그리는것은 설계의 기본이다.

그리고 일정을 산출해 내는데 유리하다. 

일정 다되서 막판에 회사에서 먹고자고 할텐가?



당신이 말단(신입)이라면 "내가 해봤자 어차피 팀장 따라 가야하는데 무슨 소용이냐?"라고 생각할 수 있다. 

이런 생각을 한 당신.. 평생 말단(신입)으로 있을것 같나? 언젠가 당신도 팀장이 된다.

그 때를 위해 미리 경험치를 쌓아둔다고 생각해라. 팀장이라는 훌륭한? 교본도 있지 않은가? (팀장님들 긴장트리좀 타삼 ㅋㅋ.. 근데 나부터 타야하네;; ㅋㅋ)



차분히 내가 해야 할 일이 무엇인지 파악하라.



전체적인 그림을 그렸는가? 잘했다. 쓰다듬어 드림. 쓰듬쓰듬..?

그럼 이제 내가 해야할 일이 무엇인지 테스크를 파악해야 한다.

매일매일 출근해서 가장 먼저 할 일은 오늘의 할일을 선정하는것이고

퇴근할때 얼마나 했는지, 내일은 무슨 일을 할 것인지 선정하는 것이다.

다음날 출근시 오늘의 할일을 다시 선정할 필요는 없고.. 어제 퇴근하면서 선정한 테스크들을 보며 체크만 하면 된다.

테스크 추출하는것.. 처음엔 귀찮을 수 있다. 그리고 쉽지 않다.

하지만 꾸준히 반복적으로 해라. 아주 중요한 것이다. 그냥 습관으로 만들어라.


단순히 오늘의 테스크만 뽑았다고 끝나는 것이 아니다.

다음 단계가 있다. 바로 뽑아낸 테스크 하나하나를 어떻게 코딩할 것 인지 고민하는 것이다.

네임스페이스를 정하는것만 해도 상관없다.


처음에 큰 그림을 그리면, 추상적인 설계가 어느정도 머리속에 있게 된다.

하지만 테스크를 발라내게 되면.. 이 설계가 조금은 실제화가 되는데

이때 네임스페이스를 정해주는게 훨씬 쉽고, 

구조를 수정하는 일이 상대적으로 적어진다.



네이밍에 허비하는 시간을 아깝게 생각치 마라



메소드를 만들든, 프로퍼티를 만들든, 펑션을 만들든, 변수를 만들든.

제발좀 네이밍에 신경을 써라.

상황에 따라선 코딩하는 시간보다 네이밍하는데 시간을 더 써야 될 때도 있다. 물런 항상 그러면 안된다. ㅋㅋ

제발 좀!!

의미에 맞는 네이밍해라. 영어사전 항상 열어놓아라. 아님 구글번역기라도 돌려봐라.



스스로 먼저 리뷰를 요청해라



리뷰를 꼭 해라. 혼자 하지 말고 최소한 같이 프로젝트한 팀원들과 해라.

이 프로젝트에 참여하지 않은 사람들은.. 첨부터 끝까지 설명해야 해서 귀찮긴 하지만.. 

서로에게 자극을 주고 배움을 주는거니 거절하지는 마라.

가능하다면 고수도 껴넣어라. 없어도 상관은 없다.

혹 코드리뷰하는 분위기가 아닌가? 그럼 당신이 만들어라.

용기 있는자가 미인을 쟁취한다는 말도 있지 않은가?

...........? ㅋㅋㅋㅋ

도저히 용기가 안난다면, 맘 맞는 몇명만 불러서 해라.

맘 맞는 사람이 없나?

그럼 친하고 신뢰할 수 있는 사람을 불러서 해라.

커피 한잔 사준다고 꼬득여서 해라.

어쨋든 해라.

그리고 가능하면 사수는 꼭 넣어라.

아에 신입이면 페어프로그래밍 하면서 이런것 하나하나 일일이 지적할 수 있지만.

겅력 2년정도 된 사람들은, 페어프로그래밍하면서 하나하나 지적하기가 힘들다.

왜냐면.. 이미 나쁜 습관이 들어있고.. 경력이 있다보니 쫀심이 있어서.. 되려 카운터 얻어맞을 수 있기 때문이다.

물런. 착한 사수는 그런거 신경안쓰고 열심히 가르켜주겠지만.. 난 한번 당한 경험이 있어서 말이지..

요즘 아이들 무섭다 ㅠ,.ㅠ 어른을 존경하는 마음을 떠나.. 이타심 자체가 부족하다.

암튼. 아무래도 경력이 있다보니 기본적인 구조, 네이밍을 지적하기가 여간 조심스러운게 아니다. 그래 나 소심하다 ㅋㅋ

리뷰타임에서는 페어프로그래밍할때 못했던 말들, 페어프로그래밍하면서 놓쳤던 부분, 혹은 페어프로그래밍할때 잘못 작성한것들 등등을 발견하고 서슴없이 깔 수 있기 때문이다.



하지만 사장님에겐 따뜻하겠지..

여기서 중요한것은 코드리뷰할때 내가 작성한 코드는 없다. 우리가 작성한 코드만 있을뿐이다.

그러니 발끈하거나 감정 상하지 마라.


쓰다보니 해주고 싶은 말이 너무 많지만.. 그런거 다 쓰자니 내가 귀찮아서 ggㅋㅋㅋ

쓰고보니 결국은.. 수백번은 봤을 수 도 있는 이야기들이다. 봤으면 뭐하나.. 실행을 안하는데..

제발 좀 행동으로 옮겨라!!!




간만에 포스팅이라 제가 감(글쓰는 법, 개그감)을 잃었나봅니다.

죄송합니다. ㅠ,.ㅠ


도망가자. ㅋㅋ

하지만 읽어준 당신에겐 감사. 

크리에이티브 커먼즈 라이선스
Creative Commons License

'Ruby On Rails > agile note' 카테고리의 다른 글

코딩하기전 생각하는 습관을 가져라.  (0) 2012/05/04
Code Review  (0) 2008/05/26
Getting Real~!  (0) 2008/02/25
start agile!  (0) 2007/11/26
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/201 관련글 쓰기

댓글을 달아 주세요

Ruby On Rails/작은 팁2012/03/16 20:44
제목이 이상한것 같지만, 아래 코드를 보자

brew를 실행하면, 되긴 하는데..
정작 설치를 하거나 업그레이드를 할려고 하면 권한 문제로 실행이 안된다.

나의 경우에는 맥북에서 아이맥으로 마이그레이션을 했는데, 그래서 생긴 문제인 듯 하다.

/usr/local에서 파일 오너가 root로 되어있다.

이걸 전부 내 계정으로 변경해주었다.


sudo chown -R hiphapis:wheel /usr/local



그리고 나서 업그레이드를 하니 잘 된다.


 


크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/200 관련글 쓰기

댓글을 달아 주세요

Ruby On Rails/작은 팁2011/07/12 11:37
RoR에서 Terminal을 사용하기 때문에 이 카테고리에 넣습니다.
양해를 쿨럭~;

Mac Terminal의 Home, End키의 기본 세팅이 스크롤 최상단/최하단 (좀 더 정확하게 말하면 버퍼의 최상단/최하단)으로 이동이 됩니다.
하지만 일반적인 상황에선 현재 줄의 처음과 끝으로 가는 용도로 많이 사용하죠. 
(여기서 OSX에 불만 하나.. 왜 프로그램마다 Home, End 동작이 틀리냐고.. Home, End만 틀린게 아님. 틀린키 무지 많음.)

평상시에는 그냥 그러려니 하고 별 문제 없이 쓰지만, 막상 필요한 순간이 오면 참 짜증이 나는.. 뭐 그런 기능입니다.

아래 Terminal에서 Home, End키 적용하는 법입니다. 

1. Preferences를 엽니다.


2. 그런후 사용하시는 스킨의 Keyboard로 이동 합니다. 
3. Home을 선택, Edit을 누릅니다.


4. Action을 "Send string to shell"로 선택하시고, \033[1~를 입력후 OK
\033[1~는 복사해서 붙여넣으세요.


5. 마찬가지로 end를 선택 하신 후 Edit


6. 이번에는 \033[4~를 입력


끝입니다.

혹시 PageUp/Down을 원하신다면, 마찬가지 방법으로
PageUp: \033[5~
PageDown: \033[6~ 

를 입력하시면 됩니다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/196 관련글 쓰기

  1. [RoR] 맥 OS X에 rvm을 이용해 ruby on rails 개발 환경 구축하기  삭제

    2011/10/30 18:39TRACKBACK FROM 월풍도원(月風道院) - Delight on the Simple Life

    맥에서 rvm(Ruby Version Manager)를 이용한 ruby on rails 개발 환경 구축 방법입니다.맥 OS X에 rvm을 이용해 ruby on rails 개발 환경 구축하기맥 OS X에서 루비 설치하기우선 터미널에서 아래의 커멘드를 이용해 RVM(Ruby Version Manager)을 설치합니다.$ bash < <(curl -s...

댓글을 달아 주세요

  1. 지나가다

    저는 이게 전혀 먹질 않네요. ㅠ ㅠ 라이언이라서 그런가

    2011/10/27 16:05 [ ADDR : EDIT/ DEL : REPLY ]
  2. 이거 검색하다가 이리 흘러들어왔네요. ㅋㅋ

    저도 라이언이어서 적어주신 대로 할 때 안되더라구요. 그런데 다른 키들 보다보니 원래 shift home, shift end가 원하는 기능이어서 해당 단축키 참고하여 수정했더니 잘 되네요.
    home: \\033[H
    end: \\033[F

    2011/12/30 11:10 [ ADDR : EDIT/ DEL : REPLY ]
    • 헐퀴~ 그렇군요.
      이거 쓸때가 스노우때였으니..

      라이온 설치하고 부터 저도 안되긴 했는데..
      귀찮아서 그냥 썼었거든요.

      덕분에 거저 했네요 ㅋㅋ

      2012/01/02 15:34 [ ADDR : EDIT/ DEL ]
  3. 본 세팅이 스크롤 최상, End키의 기본 세팅이 스크롤 최경 구축하기맥 OS X에서 루비 설치하기우선 상단/최하단 (좀 더 정확하게 말하면 버퍼의

    2012/05/05 19:11 [ ADDR : EDIT/ DEL : REPLY ]

Ruby On Rails/작은 팁2011/06/15 13:20
내용추가.
이리저리 좀 더 상황을 지켜보니.. 
Devise의 문제가 아니라 Ruby 1.9.2 or Rails 3.1 의 버그인것 같다.
path를 못찾는 경우 에러를 내지 않고, 끝까지 찾는다. 끝까지!

------------
 
Devise를 붙이고 sign_out을 했는데 반응이 없다.
그러다가 몇초 후 내 맥도 반응이 없다.
Activity Monitor를 띄워보니, ruby 메모리 사용이 1.8G
응? 
1.8G?

내눈을 의심하고 다시 봤는데 1.8G
가운데 .(점)만 빼면 욕이 되는 1.8G.. 
ㅡ.,ㅡ;


처음에는 84MB


sign_out누르니깐 몇초만에 1GB 돌파!!!

그대로 내비두면 4GB 메모리를 다 잡수실 기세라서 1GB넘는 시점에서 강제종료 해버렸다.


뭐가 문제인지 이리저리 추적을 해보니..
destroy 액션(sign_out)에서 

sign_out_and_redirect

요 녀석이 의심스러워 이리저리 해보니, 역시나 이 녀석이 범인이었다.

문제는 redirect시 :root_path로 redirect하게 될 때가 있는데, 이때 :root_path를 찾지 못해 생기는 버그였다.
해결책은 크게 2가지가 있다.

1. :root_path를 만들어 주는 방법.
:root_path가 없어서 생기는 버그임으로, :root_path를 만들어 주면 된다.
routes.rb에 가서 주석처리된 

# root :to => 'welcome#index'

을 주석을 풀어주고, :to는 각자의 상황에 맞게 수정을 해주면 된다.

root :to => 'getAway#Hi'



2. sign_out과 redirect를 따로따로.

sign_out_and_redirect

이 녀석이 하자다보니, 이 녀석을 안써버리면 그만이다.
직접 sign_out 시키고 상황에 맞게 redirect 하면 된다.

sign_out
redirect_to "넌 이미 아웃되었다."



크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/195 관련글 쓰기

댓글을 달아 주세요

  1. 안녕하세요.
    저는 root :to => "home#index"가 기본으로 풀려있어서 그런지,
    아직 루비 devise 때문에 컴퓨터가 기절한적은 없습니다.
    트랙백 걸려고 검색 하다 들어와서, 루비온 레일즈 관련 포스트 잘 읽고 가네요..:D
    행복한 하루 되세요!

    2011/10/30 18:51 [ ADDR : EDIT/ DEL : REPLY ]
  2. 공부를 시작한지 얼마안된 초보인데,이렇게 많고 좋은 자료를
    공유할수 있게 해주셔서 정말 감사드립니다..^^

    2012/04/26 23:26 [ ADDR : EDIT/ DEL : REPLY ]

Ruby On Rails/작은 팁2011/06/13 15:00


작업을 하다보면 종종 불필요한 prefix가 붙는 경우가 생긴다.

resources :article do
  resources :article_log
end

resources :log


사실 큰 문제는 없지만, article_log path을 적어줘야 할때

article_article_log_path

이런 요상한(?) naming을 가진 path가 되어버린다.

나 같이 깔끔한 사람(응?)은 이런거 눈뜨고 못본다.
난 무슨 일이 있어도

article_log_path

이렇게 쓰고 싶어 근질할테니 말이다.
당신도 그런가? 
동지! 함께 원피스를 찾자!(응?)

이런 경우

:as 

를 써주면 우리가 원하는(설마 나만 원하는건 아니겠지?) 형태로 사용할 수 있게 된다.

resources :article do
  resources :article_log, :as => :log
end

resources :log


이렇게 :as를 추가해주게 되면

article_article_log_path

가 아닌

article_log_path

로 path가 잡히게 된다.
못믿겠으면 

rake routes

해보라!


크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/194 관련글 쓰기

댓글을 달아 주세요

Ruby On Rails/작은 팁2011/05/19 11:11


아시다시피 5월 5일 Rails 3.1 Beta 1 이 Release되었다.
많은것들이 바뀌었는데 그것들중 알고 넘어가면 좋을법한것 몇가지만 추려 간략하게 Overview해보았다.

설치

rvm 1.9.2@railspre --create
gem install rails --pre

Javascript

Rails 3.1부터 prototype.js가 아닌 jQueryCoffeeScript가  Default로 탑재되어 있다.
만약 jQuery가 아닌 prototype.js를 계속 사용하고자 할 경우,
rails new [APP_NAME] -j prototype
해주면 된다.

새로 추가된 Gems

  • sass: haml에 포함되어 있던 sass가 독립되어 나왔다.
  • coffee-script
  • uglifier: JS를 하나의 파일로 합쳐준다.
  • jquery-rails 

디렉토리 구조 변경

Public아래에 있던 Javascript, Stylesheets, Images가
/app/assets/ 로 이동되었다.
그러므로 웹엔진(Nginx등)에서 Js, Css, Image를 Rails한테 안넘기고 직접 처리하도록 세팅이 되어 있었다면, 관련 부분은 수정이 있어야 한다

Sprockets

application.css, application.js에 보면
 //= require jquery
처럼 주석처리된 require들이 있는데, 이건 주석이 아니라 sprockets의 require(include)하는 문법이므로 해당 구문을 삭제하면 include가 안된다.
 

Migration 

migration file의 change 메소드가 추가되었다. 
과거에는 up, down으로 메소드가 분리되어 있었지만, change로 통합되었다.
하지만 종종 제대로 동작하지 않을때도 있는데 그럴땐 up, down을 만들어서 사용하면 된다. 

그리고 :belongs_to가 추가되었는데, 과거 relationship을 같게 될 경우 직접 index key(article_id:integer)를 만들어 줬었다.
3.1 에서는 belongs_to를 이용하면 되는데.
rails g scaffold comment article:belongs_to body:text

이렇게 써주면되며, belongs_to로 만들면 add_index도 시켜준다.

Console

콘솔에서 DB Query가 노출이 되었는데.. 상황에 따라선 이게 과잉친절이 될 수 도 있을 듯 하다. 

Active Record

  • :has_many에서 :through를 다중깊이까지 사용할 수 있게 되었다. 
  • 그리고 :through에서 :dependent 도 지원을 한다.
  • :as 가 추가되었다.  
  • default_scope가 block으로 처리할 수 잇게 되었으며 lambda, method를 사용할 수 있다.

    default_scope { ... }
    default_scope lambda { ... }
    default_scope method(:foo)

  • update_column이 추가되었는데, update_attribute와 동작은 유사하지만 validation과 callback을 무시하고 update한다.

    User.first.update_column(:name, "sebastian") 

  • inverse_of가 추가되어서 예제 코드처럼 post.tags.build가 가능하다.

    class Post < ActiveRecord::Base
      has_many :taggings
      has_many :tags, :through => :taggings
    end

    class Tagging < ActiveRecord::Base
      belongs_to :post
      belongs_to :tag, :inverse_of => :tagging # :inverse_of must be set!
    end

    class Tag < ActiveRecord::Base
      has_many :taggings
      has_many :posts, :through => :taggings
    end

    post = Post.first
    tag = post.tags.build :name => "ruby"
    tag.save # will save a Taggable linking to the post

  • has_many의 :conditions에서 sql을 직접 쓰는것의 사용법이 바뀌었다.
    // Before
    has_many :things, :conditions => 'foo = #{bar}'

    // After
    has_many :things, :conditions => proc { "foo = #{bar}" }
  • has_secure_password라는 메소드가 추가가 되었는데, Authentication을 직접 만들어서 쓸 경우 아주 유용하게 사용할 수 있다.
    새삼스럽지만, 3.1되면서 부터 Authentication Tool은 안써도 될 듯 하다.


Action Pack 

  • auto_link가 제거되었다. 만약 계속 사용할것이라면 rails_autolink gem을 이용하면 된다.
  • :authenticity_token 을 form_tag에서 option으로 바뀌었다. 생략하거나 수정이 가능하다.
  • rhtml, rxml이 제거되었다.
  • csft_meta_tag가 복수로 rename되었다. csft_meta_tags
  • HTML5의 "data" attribute를 hash로 제공한다
    tag("div", :data => {:name => 'Johan Kim', :city_state => %w(Seoul)})


Active Support

  • Object#in?
  • weeks_ago
  • pre_week


간략하게 이 정도 인 것 같다.
관심이 있다면 https://gist.github.com/958283 를 확인하면 자세한 내역이 나온다.

http://menonrails.com/articles/14 에 기고된 포스팅 입니다.


참고링크



 

 
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/192 관련글 쓰기

댓글을 달아 주세요

  1. 카테고리의 다른 글

    2012/05/04 20:28 [ ADDR : EDIT/ DEL : REPLY ]
  2. 구문 게시물에 그런 것들을 제공하는 아주 좋아요 방법입니다. 클리어 컷 의미.

    2012/05/20 18:58 [ ADDR : EDIT/ DEL : REPLY ]

Ruby On Rails/작은 팁2011/05/02 20:00

Edit+ 짱!

Windows에서 개발을 할때는 무조건 Edit+만 사용했었다. (PHP뿐만 아니라 RoR할때 조차도!)

그 이유는
  • 10년 넘게 사용해왔다는 점.
  • 정식 라이센스를 보유하고 있다는 점.
  • 베타 테스터라는 이유. (개발자와 100통이 넘는 메일을 주고 받았다.)
도 있었지만,

  • 10년 가까이 사용해오다보니 왠만한 단축키는 거의 다 외우고 있었고
  • 직접 단축키를 할당하는 등의 커스터마이징도 많이 되어 있었고
  • 무엇보다 막강한 편집기능 때문이었다.

막강한 편집기능의 간략한 예를들면..
  • 주석 추가/제거
  • 현재 케럿에서 앞/뒤로 줄 삭제
  • 현재 줄 복사/삭제
  • 현재 줄을 위/아래로 이동
  • 현재 단어 삭제
  • 캐럿기준 앞뒤 문자 바꾸기
    이것 정말 쏠쏠한 기능이다. 고속으로 타이핑 하다보면 철자의 앞뒤를 바꾸는 경우가 있는데 이 기능을 실행하면 앞뒤 문자를 바꿔준다. 예를들어 form인데 from으로 쳤다고 하자. o와 r 사이에 캐럿을 놓고 Ctr+T(단축키는 정확히 기억이..) 누르면 form으로 짠!
등등등 Edit+ 편집메뉴에 있는 모든 기능을 능수능란하게 사용하다 보니 RoR을 할때도 Textmate보다 Edit+로 하는게 비교도 안되게 빨랐다.
(개발툴을 능숙하게 사용하는것도 개발자의 능력임을 잊지말자!)

그러다 몇년전 OSX로 넘어오면서 어쩔 수 없이 Textmate로 넘어왔는데, 이건 뭐 도저히 작업속도가 안나오는 것이다.

뭐 Textmate도 그럭저럭..


사람들이 Textmate에 훅~가는 멋진 기능중 하나가 바로 "코드 자동완성"인데.. 사실 이거 Edit+에도 있다.
사실 Textmate가 좀 더 미려하고, Smart한것은 인정! 하지만 개발속도에 영향을 줄 정도는 아니다.

어쩌다 보디 Edit+ 찬양글이 되어가고 있는데, 10년을 쓴 Edit+인데 Textmate가 성에 안차는걸 어떻하랴..

돌아와서, Textmate의 막강한 기능이 바로 커스터마이징이다. 내가 필요한 기능이 있으면 만들어서 추가해버리면 된다. 물런 Edit+도 가능하지만 한계가 명확하다.
Textmate가 제공하는 기본 편집기능도 Edit+만큼은 아니지만 나름 괜찮은 기능들을 제공한다.
다만 Text Bundle에 숨겨져 있다는게 문제.

그러므로 Textmate로 개발을 해야 하는 개발자라면 시간을 투자해서 Text Bundle과 자기가 사용하는 Language의 Bundle을 처음부터 끝까지 여러번 살펴보는것을 권장한다.
(다시한번 말하지만, 개발툴을 능숙하게 사용하는것도 개발자의 능력임을 잊지말자!)
 

Bundle의 단축키를 수정할 수 있으므로 자주 쓸법한 녀석은 단축키를 지정해 놓는것이 편하다. 
이런것중 유용한것 하나가 "줄 끝 공백 제거"같은 기능이 있는데.. 단축키가 할당되어 있지 않다.
필자의 경우 ⌃. 으로 단축키를 할당해서 쓰고 있다.

단축키가 이미 꽉 차 있거나, 단축키가 너무 많거나 혹은 휴먼 메모리가 딸려서 외우지 못할경우 Bundle Item ⌃⌘T (Bundles → Select Bundle Item)을 찾아서 실행하면 된다.



Textmate 편집 단축키

필자가 자주 애용하는 편집 기능은
  • ⌥⌘.(마침표): HTML 안닫힌 태그 있으면, 닫힌 태그 입력
  • ⌃⇧,(쉼표): HTML 태그 생성
  • ⌃⇧.(마침표): Language의 시작, 출력, 주석 등등 (Bundle에 따라 틀림)
  • ⌘/: 주석 추가,제거
  • ⌃W: 단어 선택
  • ⌃⇧K: 줄 삭제
  • ⌃⇧D: 줄 복사
  • ⌃⌘↑↓: 줄 이동
  • ⌘F: 검색
  • ⌘G: 다음 검색
  • ⇧⌘G: 이전 검색
  • ⌃⌘F: 모두 변환
  • ⌥⌘F: 변환하고 찾기

Bundle에 있는 기능도 있고, Edit 메뉴등에 있는 기능도 있다.
막상 써보니 그리 많지는 않은데 빼먹은것들이 꽤 있을듯한다. 누락된것은 생각이 나거나 새로 발견하는 것들은 계속 추가할 예정이다.

URL


ps. 여러분이 사용하시는것 있으면 우리 공유해요~
코멘트로 써 주시면 올리신 분 아이디와 함께 단축키 목록에 추가할게요! 
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/191 관련글 쓰기

댓글을 달아 주세요

Ruby On Rails/작은 팁2011/02/01 10:04
devise는 restful-authentication과 유사한 놈이라고 생각하면 된다.
readme에 약간의 레퍼런스가 제공되며 github의 wiki에 예제들이 제공되고 있다.
물런 rdoc도 있다.

1. devise Gem Download & Install
Gemfile
gem 'devise', '1.1.3'
Rails 2 사용자는 Rails 2용 최신 Version을 찾아서 넣어주면 되고, Rails 3유저라면 구지 버전을 적어줄 필요는 없다.
bundle install


2. devise Install
rails g devise:install
딸랑 2개의 파일만 만든다.
config/initializers/devise.rb
config/locales/devise.en.yml
devise:install를 해줘야 generator가 추가가 된다.

environment/development.rb
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
추가


3. devise Initialize
rails g devise User
User Model과 Migration을 생성하고 Routes.rb파일에 관련 route가 추가된다.


4. Ready
user.rb에 들어가보면 
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable
이 기본적으로 적혀져 있고
# :token_authenticatable, :confirmable, :lockable and :timeoutable
들은 제외되어 있다.
만약 제외되어 있는 이 옵션들을 사용하고 싶다면 migration파일(create_user)
의 해당 옵션들 주석도 제거를 해주어야 한다.

각 옵션들에 대한 설명은 README에 있다. 
해석은 알아서..
  • Database Authenticatable: encrypts and stores a password in the database to validate the authenticity of anuser while signing in. The authentication can be done both through POST requests or HTTP Basic Authentication.
  • Token Authenticatable: signs in a user based on an authentication token (also known as "single access token"). The token can be given both through query string or HTTP Basic Authentication.
  • Omniauthable: adds Omniauth (github.com/intridea/omniauth) support;
  • Confirmable: sends emails with confirmation instructions and verifies whether an account is already confirmed during sign in.
  • Recoverable: resets the user password and sends reset instructions.
  • Registerable: handles signing up users through a registration process, also allowing them to edit and destroy their account.
  • Rememberable: manages generating and clearing a token for remembering the user from a saved cookie.
  • Trackable: tracks sign in count, timestamps and IP address.
  • Timeoutable: expires sessions that have no activity in a specified period of time.
  • Validatable: provides validations of email and password. It’s optional and can be customized, so you’re able to define your own validations.
  • Lockable: locks an account after a specified number of failed sign-in attempts. Can unlock via email or after a specified time period.
  • Encryptable: adds support of other authentication mechanisms besides the built-in Bcrypt (the default).

모든 설정이 완료가 되면 상큼한 마음으로 rake
rake db:migrate


5. Setting
migration까지 했으니, 비로서 사용이 가능하다.
하지만 입맛에 맞게 사용할려면 수정 작업이 필요하다.
각종 url이 [:model_name]/sign_in 형식이라 초기 로그인 url이 users/sign_in임으로 관련된 views도 수정을 해주어야 한다.

5.1 Routes.rb
  devise_for :users do
    get 'signin' => 'devise/sessions#new'
    post 'signin' => 'devise/sessions#create'
    get 'signout' => 'devise/sessions#destroy'
    
    get 'signup' => 'devise/registrations#new'
    post 'signup' => 'devise/registrations#create'
  end
여기서 단점은 devise가 기본적으로 사용하는 path들을 overwrite할 수 없으므로, 모든 view파일에 가서 path를 수정해줘야 한다.
예를들어 로그인같으면
<%= link_to new_user_session_path%>
<%= link_to signin_path%>
로 일일이 하나하나 찾아서 수정을 해줘야 하는것이다.

물런 안해줘도 그만. 
하지만 난 url 하나하나에 의미를 부여하고 목숨같이(는 아니지만..) 여기기 때문에, url 구조는 절대 포기할 수 없다.
이것역시 중요한 사용자 경험이라 생각하기 때문에!!

암튼, 중요한 사용자 경험때문에 코드를 전부 수정하는 삽질을 할것이냐?
다행스럽게도 해결책이 존재한다.
  devise_for :users
  devise_scope :user do
    get 'signin' => 'devise/sessions#new', :as => :new_user_session
    post 'signin' => 'devise/sessions#create', :as => :user_session
    get 'signout' => 'devise/sessions#destroy', :as => :destroy_user_session
    
    get 'signup' => 'devise/registrations#new', :as => :new_user_registration
    post 'signup' => 'devise/registrations#create', :as => :user_registration
  end
이런식으로 overwrite를 하는것이다. 뭐 일종의 꽁수이다.

5.2 password length
devise의 자체적인 설정같은 경우는 /config/initializers/devise.rb 에 거의 다 있으며, password lenth또한 마찬가지로 이곳에 있다.
config.password_length = 6..20

5.3 Views
gem에서 View 파일을 불러오는 형태여서, 프로젝트 디렉토리에 파일이 존재하지 않는다.
rails g devise:views users
해주면 /app/views/users 에 각종 view 파일들이 생기게 되고,

/config/initializers/devise.rb
config.scoped_views = true
해주면 gem에서 views를 땡겨오는게 아니라, 프로젝트 디렉토리에 있는 views를 사용하게 되므로, 입맛에 맛게 수정하면 된다.

5.4 login id
로그인을 email이 아닌 id로 받을려면 몇가지 수정 작업을 해주어야 한다.
devise는 email 정보만 받고 있으므로, user에 login_id를 추가해줘야 한다.
여기서는 field명을 name으로 하겠다.
rails generate migration add_name_to_users name:string
rake db:migrate

추가해준 name을 model에 등록 한다.
user.rb
attr_accessible :name

그리고 devise에 로그인시 email이 아닌 name을 사용할것이라고 알려줘야 한다.
/config/initializers/devise.rb
config.authentication_keys = [ :name ]
authentication_keys를 :name으로 등록을 해준다.

마지막으로 login form(in views)에 email이 아닌 name으로 id입력을 받도록 수정해주면 된다.

5.5 controller customized (after signup)
얼마전 찾아보니, 1.2.rc에 이 기능이 추가되었다고 한다. https://github.com/plataformatec/devise/wiki/How-To:-Redirect-after-registration-(sign-up)
아래 쓴 내용은 이제 필요 없을듯. 

더보기


6. Usage
6.1 restful-authentication에서 login_reqired와 같은 역활을 하는 authenticate_user!
before_filter :authenticate_user!

6.2 로그인 여부
user_signed_in?

6.3 현재 유저
current_user

6.4 session route path_name
(#action_name)user_session

6.5 Sample
<% if user_signed_in? %>
  <%= link_to('Logout', destroy_user_session_path) %>        
<% else %>
  <%= link_to('Login', new_user_session_path)  %>  
<% end %>
<br />
  User: 
  <% if current_user %>
    <%= current_user.email %>
  <% else %>
    (not logged in)
  <% end %>
</li>
restful-authentication의 _user_bar 같은 녀석이 과거에는 menu라는 디렉토리에 제공이 되었었는데, 버전업이 되면서 사라졌나보다. 해당 코드는 아래 링크서 확인할 수 있으므로 Copy&Paste해서 쓸 사람은 쓰면 될듯.


7. Conclusion
7.1 장점
devise코드는 다 감추어져있어, 프로젝트에서 코드와 파일이 깔끔해진다.
필요한 부분만 customizing이 가능하다.

7.2 단점
controller를 customizing할때는 직접 파일을 만들어서 해야 한다.
customize할려면 restful-authentication보다 손이 많이 간다.

7.3 총평 
일반적인 유저 시스템이라면 아주 유익하지만,
로그인 및 회원가입 프로세스상 수정이 필요할 경우, 이를 customize하는게 좀 불편할 수 있음.


8. 참조 URL

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/181 관련글 쓰기

댓글을 달아 주세요

Ruby On Rails/작은 팁2011/01/28 14:49
한동안 IPhone, IPad, Android 개발하다가, 잠들어 있던 개인프로젝트를 다시 시작할려고 맘을 먹었다.
Rails2 기반이어서, 깔끔하게 새로 만들자는 마음으로 Rails3를 설치를 했다.

Rails3로 넘어가면서 어떤것들이 바뀌었나 찾아보고 Railscasts도 보면서 틈틈이 학습을 해놓았지만..
역시 난관은 있었다.
내가 부닥쳤던 난관들을 정리해서 올리면, 어떤분은(한분이라도..) 도움을 받으시지 않을까 하는 소박한 희망에 몇자 끄적여본다.

이상하다. 문명히 예전에는 plugin install하고 script/generator 로 initialize를 했었는데..
Could not find generator authentiaceted.
이리저리 찾아봐도 별다른 말은 없고 technoweenie의 restful-authentication이 아닌 satin의 restful-authentication만 딸랑 링크가 걸려있다.
Sation의 restful-authentication의 install 설명을 봐도, 내가 한것과 틀린것이 없다.
아 뭐지 -ㅅ-;;
그러던 찰라
"아. technoweenie가 아직 Rails3 버전을 안맞들었고, Sation은 작업을 해놓은건가?" 라는 의문이 생기고..
Sation걸로 install을 하고 initialize하니 잘 된다.

하지만 막상 사용할려고 하면
uninitialized constant ApplicationController::AuthenticatedSystem
라고 한다. 
include AuthenticatedSystem
require File.join(Rails.root, 'lib', 'authenticated_system.rb')
로 바꿔주니깐 되긴 하는데, lib아래 있는 모든 파일을 이렇게 불러올 수 는 없는 노릇.
뭔가 더 스마트한 방법이 있을것 같긴한데.. Railscasts에서 이 내용을 본것같아 이리저리 뒤져봐도 못찾고.
결국 구글링으로 알아냈다.

application.rb 에다가
config.autoload_paths << File.join(config.root, "lib")
해주면 된다.

2. haml
예전에는 gem으로 설치하고, 그 후에 plugin install을 해줬어야 했다.
난 당연히 plugin install을 했는데, 왠걸 initialize가 제대로 안된다.
vendor/plugin/haml보니 init.rb은 있는데 0 bytes고..
haml을 initialize하면 생기는 파일은 init.rb 딸랑 하나인데, 이 녀석이 하는 일은 haml gem을 불러오는것 뿐이다.

그런데.....
Rails3부터 bundler가 추가되면서 Gemfile이라는게 생겼다, init.rb가 존재해야 할 명분이 사라져 버린것이다.
init.rb가 하던일을 Gemfile에 gem 'haml' 적어주면 끝나니 말이다.

Gemfile에
gem 'haml'
을 적어주고,
$user> bundle install
하면 끝.

3. Routes => :path_prefix
내가 작업했던 수없이 많은 개인 프로젝트(오픈한것은 NA;;)들의 Routes에는 :path_prefix가 꼭 사용되었었다.
근데, Rails 3로 오면서 이녀석 Deprecated.....;;
혹시나 하는 마음에
scope ":user_login" do
해봤는데 안된다. 
혹시나 하는 마음에 한번더 시도를 해보았는데
scope "(/:user_login)" do
이렇게 하니 된다. 
예전에는 resources 하나하나 모두 :path_prefix를 적어주어야 하는 번거로움이 있었는데
이와 같은 방식으로 변해서, 보다 깔끔하게 코드를 작성할 수 있게 되었다.



ps. 작업하다 추가되는것들은 모아놨다가 또 포스팅할 계획임.
ps2. 한국루비사용자모임도 죽은지 오래.. 살아있는 Ruby Forum이 없는것 같은데.. 하나 만들까 -ㅅ-;
도메인은 사놓은게 있긴 한데..
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/180 관련글 쓰기

댓글을 달아 주세요

  1. 루비레일스 개발자

    오픈하신다면 저도 동참하고 싶네요!!

    요즘 JSP가 난무하는 세상에서 Rails를 좀더 알리고 싶네요.
    이제 6개월째 입문해서 잘 쓰고 있는데,
    여러가지 정보를 공유해보고 싶네요.

    Ruby on Rails의 경우엔 정말 국내엔 거의 없어서 정보 얻기가 힘들었는데..
    이런게 하나 있다면 저도 적극 동참해보고 싶습니다.

    2011/09/12 20:35 [ ADDR : EDIT/ DEL : REPLY ]
  2. 레일스 입문자

    정말 생겼으면 좋겠습니다. ㅠ.ㅠ 레일스.. 한땐 붐이 일었었는데 왜 이렇게 침체기에 빠져버린 걸까요..? 루비 자체가 상당히 훌륭하고 발전가능성이 큰 언어라 생각하는데... 슬프네요..

    2011/09/30 15:22 [ ADDR : EDIT/ DEL : REPLY ]

Ruby On Rails/작은 팁2009/09/14 20:50
이 문제들을 해결하느라 하루를 허비했네요.

간단정리
  1. Install "Xcode.mpkg"(snow leopard)
  2. data backup
  3. install MySQL 64bit
  4. gem install mysql for 64bit
  5. port update
  6. other gems re-install


Install Snow Leopard
일반설치를 하시면 안됩니다. 꼭 "선택설치(Optional Installs)"를 클릭하신 후 "Xcode.mpkg"를 설치하셔야 합니다. 
"Xcode.mpkg" 클릭 후 설치과정에서 옵션들을 선택하는 페이지가 있는데 그대로 설치를 하시면 됩니다.
snow leopard => 선택설치 => Xcode.mpkg

여담. 저는 Xcode.mpkg로 설치를 안했어서.. 이것 때문에 한참 고생했습니다.

MySQL
Snow Leopard가 되면서 64bit로 Upgrade를 해야됩니다. 즉 재설치를 해야 한다는 말인데, 이렇게 되면 기존의 data들이 뿅~* 하고 날라갑니다. 그러므로 필요한 data들은 backup을 하세요.
mysqldump -u username -ppassword database_name > dump.sql
모든 databases를 backup하시기 원하시면
mysqldump -u username -ppassword –all-databases > dump.sql 

자 이제 최신 버전(10.5)의 64bit MySQL을 다운받습니다. (10.5 MySQL받기)
다운받은 dmg를 mount 시켜보면 4개의 파일들이 있습니다.
ReadMe를 제외한 나머지 3개 모두 설치를 합니다.

설치 순서는
  1. mysql-5.1.38-osx10.5-x86_64.pkg (mysql입니다.)
  2. MySQLStartupItem.pkg (mac이 booting할때 mysqld를 자동 실행합니다.)
  3. MySQL.prefPane (시스템 환경설정에 MySQL panel을 추가합니다)
그 후 
sudo env ARCHFLAGS="-arch x86_64" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
하여 mysql gem을 설치합니다.

백업했던 데이터들을 복구합니다.

mysql -u username -ppassword database_name < dump.sql 

자. 그럼 console을 열어서 제대로 동작하는지 확인을 해봅니다.
그런데 만약 아래와 같은 Error Message가 나온다면

uninitialized constant MysqlCompat::MysqlRes

mysql  gem이 여러개 깔려 있어서 그런것입니다.

sudo gem uninstall mysql

깔려있는 mysql gem들을 삭제후 재설치를 합니다. (이 부분은 아무리 뒤져봐도 정보가 없어, 혼자 삽질하다가 알아냈습니다.)

sudo env ARCHFLAGS="-arch x86_64" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config

MacPort

그 후 port를 upgrade해야 하는데.

sudo port selfupdate sudo port sync sudo port upgrade --force installed #아직 준비가 덜 된것들이 있어서 이 부분은 안하시는게 좋아요. 이것때문에 엄청 삽질했어요.

하시면 됩니다. 그런데 만약 아래와 같은 Error Message가 뜬다면

dlopen(/opt/local/share/macports/Tcl/pextlib1.0/Pextlib.dylib, 10): no suitable image found.

snow leopard용 port를 설치하신 후 upgrade하시면 됩니다. (snow leopard용 port 다운받기)


other gems
MySQL말고도 여러 gem들이 문제가 되고 있습니다. 이러한 gem들은 재설치를 해야 하는데, script를 이용하시거나, irb에서 명령어를 치셔서 하실 수 도 있습니다.
만약 gem들에서 문제가 발생하지 않는다면, 구지 재설치 하실 필요는 없습니다.
`gem list`.each_line {|line| `sudo env ARCHFLAGS="-arch x86_64" gem install #{line.split.first}`}

참고링크
ps. Mac에서 Safari로 글 썻더니.. 행간이 정리가 안되네요.
아 글이 무지 지저분해졌어 ㅠ,.ㅠ


크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/166 관련글 쓰기

  1. [ROR] window7 x64환경의 ruby 1.9.2에 mysql2 gem 설치하기  삭제

    2011/10/20 19:41TRACKBACK FROM 월풍도원(月風道院) - Delight on the Simple Life

    windows 7 x64환경의 ruby 1.9.2에 mysql2 gem 설치하는 방법입니다.windows 7환경의 ruby 1.9.2에 mysql2 gem 설치하기gem을 설치하는 방법은 간단합니다.gem install mysql2하지만 안타깝게도 저의 64비트 윈도우 환..

  2. [RoR] 맥 OS X에 rvm을 이용해 ruby on rails 개발 환경 구축하기  삭제

    2011/10/30 18:39TRACKBACK FROM 월풍도원(月風道院) - Delight on the Simple Life

    맥에서 rvm(Ruby Version Manager)를 이용한 ruby on rails 개발 환경 구축 방법입니다.맥 OS X에 rvm을 이용해 ruby on rails 개발 환경 구축하기맥 OS X에서 루비 설치하기우선 터미널에서 아래의 커멘드를 이용해 RVM(Ruby Version Manager)을 설치합니다.$ bash &lt; &lt;(curl -s...

댓글을 달아 주세요

  1. 좋은 정보 감사합니다. 덕분에 쉽게 업그레이드할 수 있었습니다.

    2009/09/25 23:12 [ ADDR : EDIT/ DEL : REPLY ]
  2. 박은현

    + _ + 아주 많이 감사합니다..ㅎ

    2009/11/02 20:47 [ ADDR : EDIT/ DEL : REPLY ]

Ruby On Rails/작은 팁2009/04/15 06:21
제목을 뭐로 해야할지 참 애매하네요.
지금 만들려고 하는 Join Table은, 같은 Model을 향하는 Join Table입니다.(말이 어렵네요. ㅎㅎ)


Subscription 이라는 Join Table은 user_id, writer_id를 가지고 있습니다.
user_id, writer_id 모두 User Model을 가르키는 ID를 가지고 있죠.

제가 하고 싶은것은
User.subscriptions # User 구독하고 있는 모든 Users
User.subscribers # User 구독하고 있는 모든 Users
입니다.


Join Table명을 (딱히 좋은 이름이 생각안나서) Subscript로 변경하겠습니다.
class Subscript < ActiveRecord::Base
    belongs_to :user
    belongs_to :writer, :foreign_key => "writer_id", :class_name => "User"
end

class User < ActiveRecord::Base
    has_many :subscripts #내(Logged User)가 구독하고 있는 User ids
    has_many :subscriptions, :through => :subscripts, :source => :writer #내가 구독하는 Users

    has_many :subscribes, :foreign_key => "writer_id", :class_name => "Subscript" #날 구독하는 User ids
    has_many :subscribers, :through => :subscribes, :source => :user #날 구독하는 Users
end

코드 설명을 세세하게 하면 싫어하실것 같아 간략하게 코드 설명을 하겠습니다.
Subscript의 writer_id를 이용하는 새로운 관계(belongs_to)를 만듭니다.
그리고 그 만든 관계명을 User에서 writer_id로 User를 불러와야 하는 곳(:subscriptions)의 :source로 써준 것이죠.

좀 찜찜하지만 이런식으로도 구현할 수 있습니다.
class User < ActiveRecord::Base
    has_many :subscripts, :dependent => :destroy
    def subscriptions
        ids = self.subscripts.collect { |s| s.writer_id }
        User.find(ids)
    end
end
확장성의 제약이 있겠지만, 사용하는것에는 큰 문제점이 없을듯 하네요
하지만.. 그래도 역시 찜찜하죠? ㅎㅎ


여담>
지금 딱 새벽 6시 20분이네요. 오랜만에 와이프 아침밥이나 해주고 자야겠네요 ㅎㅎ (라고 말하고 기절하기)
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/162 관련글 쓰기

댓글을 달아 주세요

Ruby On Rails/작은 팁2009/04/14 17:52
test/test_helper.rb 에서
class Test::Unit::TestCase
class ActiveSupport::TestCase
요렇게 바꿔주면 됩니다.

참고링크
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/161 관련글 쓰기

댓글을 달아 주세요

Ruby On Rails/작은 팁2009/04/07 23:09
environment.rb 에서 RAILS_GEM_VERSION 을 '2.2.2'로 개발중이던것을
'2.3.2'로 수정하면..
uninitialized constant ApplicationController
라는 Error Message가 뜹니다.

Rails가 2.3 으로 Update 하면서 application.rb 가 application_controller.rb 로 변경이 되어서 생기는 문제점입니다.

직접 application.rb 파일을 rename 해주거나.
rake rails:update:application_controller 
이런식으로 rake를 해주셔도 됩니다.

저는 rake를 사용해서 작업했습니다.
이제 잘 되네요 :)

관련링크

덧.
위에 적은 rake는 rake rails:update에 포함되어 있다고 하네요.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/160 관련글 쓰기

댓글을 달아 주세요

Ruby On Rails/작은 팁2009/03/10 11:28
간만에 gem update 했는데.. mime-types에서 Error가 난다.
아쉽게도 Error문구를 기록을 못했는데..
libxslt가 없다면서 나는 에러였다.

libxslt가 뭔지 궁금해서 찾아봤는데 XSLT 란다.
XSLT는 Extensible Stylesheet Language Transformations 의 약자로, 쉽게 말해 XML을 다른형태로 바꿔주는 XML변신기 라고 보면 된다.

mime-types에서 쓸일이 없을것 같기도 하면서도, 왠지 쓸거 같기도 한 애매모호한 놈이다.
뭐 update를 안시켜주는데 별 수 있나.. 설치해줘야지

방법은 간단한다
emerge -av libxslt
dependent  묻는거 나오면 그냥 Enter 한번 눌러주면 된다. (물런 필요나 의도에 의해 No를 할 수 도 있음.)

간만에 emerge sync랑 world complie 하니.. 시간이 조금.. 크헉!
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/157 관련글 쓰기

댓글을 달아 주세요

  1. 데비안은 바이너리라서 간편합니다. :) 데비안으로 오세요~~

    2009/03/13 00:47 [ ADDR : EDIT/ DEL : REPLY ]

Ruby On Rails/agile note2008/05/26 21:38
Code Review를 하면 Code를 짠 개발자는 얼굴이 붉어지고 기가 죽게된다.
한마디로 발가벗겨진 느낌이 든다.
아마 개발자의 자아가 Code에 담기기 때문이 아닐까..?

하지만 발가벗겨진만큼 배우게 된다.

ps. 그렇다면 많이 발가벗겨질수록 좋은건가..?
크리에이티브 커먼즈 라이선스
Creative Commons License

'Ruby On Rails > agile note' 카테고리의 다른 글

코딩하기전 생각하는 습관을 가져라.  (0) 2012/05/04
Code Review  (0) 2008/05/26
Getting Real~!  (0) 2008/02/25
start agile!  (0) 2007/11/26
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/126 관련글 쓰기

댓글을 달아 주세요

Ruby On Rails/작은 팁2008/04/21 11:37
흠..멋진걸..!! -ㅅ-;
확인해보니 host가 있는건 전부 이러네..
rubyonrails.org 만 제대로 뜨고;;
사용자 삽입 이미지

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/122 관련글 쓰기

댓글을 달아 주세요

Ruby On Rails/agile note2008/02/25 17:42
알만한 사람은 다 알겠지만 얼마전 37signals에서 새로운 책 Getting Real 이 나왔다.
Getting Real37signals에서 사용하는 방법론인데 읽어보면 알겠지만 많은 부분들이 Agile 방법론과 일치한다.
상당히 유익한 내용이 많기때문에 관심있는 사람은 한번 읽어보길 추천한다.

책으로 발매된것은 돈을 내고 구매를 해야 되지만, 온라인으로는 공개가 되어 있어 무료로 볼 수 있다. 그리고 다행스럽게 한국어로 번역도 되어 있다.

크리에이티브 커먼즈 라이선스
Creative Commons License

'Ruby On Rails > agile note' 카테고리의 다른 글

코딩하기전 생각하는 습관을 가져라.  (0) 2012/05/04
Code Review  (0) 2008/05/26
Getting Real~!  (0) 2008/02/25
start agile!  (0) 2007/11/26
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/107 관련글 쓰기

댓글을 달아 주세요

Ruby On Rails/agile note2007/11/26 22:43
오늘은 개발자인생에서 뜻깊은 날 중 하나이다.
그 이유는 바로 애자일 방법론, 즉 XP(Extreme Programming)와 TDD(Test Driven Development, 테스트 주도 개발)를 시작한 날이기 때문이다.
첫날인 오늘은 부담없이 간단한 새기능을 TestCode(Unit Test)부터  짝프로그래밍(Pair Programming)으로 개발을 했다

사실 짝프로그래밍은 몇번 경험해봤지만 이렇게 심도있는 짝프로그래밍은 처음이었다.(아니 어쩌면 내가 경험했던 짝프로그래밍이 짝프로그래밍이 아닐 수 도 있다..?)
짝프로그래밍을 하면서 가장 어려웠던것은 짝이
이렇게 해보자
이건 이렇게 구현이 되어야 할것 같아
같은 의견을 내놓으면 키보드맨인 내가 코딩을 해야 하는데 그러다 보면 나의 생각이 끊겨버리는 경우가 많았다. 생각이 자꾸 끊기다보면 내 생각은 없어지고 옆에서 짝이 말하는대로만 타이핑하고 있는 멍함과 "내가 무슨생각하고 있었지?" 하는 혼돈이 머리속에 공존하는 타이핑로봇으로 변신을 해버리는데 이게 정말 힘들었다.
오늘 내가 뭘 코딩한건지 사실 아직까지 한 20%는 잘 모르겠다...;;
물런, 익숙하지 않은 언어인 ruby를 사용했고 내가 개발에 전혀 관여하지 않았던 코드라
이 코드가 어떤 프로세스에 대한 기능인데 이러저러한 filter를 거치고 이러저러한 일을 해서 이러한 일을한다
라는 큰흐름에 대한 이해도도 부족한데 거기다 언어까지 생소하니...
(물런 변명으로 들리겠지만 사실 변명이다. 하지만 20%정도는 진실이다!)

오늘 작업한 check_conflict 는 login이 필요한데 test code에서 login처리가 잘 안되서 3시간 삽질을 했다.
ruby가 unit test기능을 제공해줘서 고맙긴 한데..이 자식, 에러가 나면 정확한 Hint좀 줄것이지..IE에서 Javascript Error처럼 막연하게 무슨에러인데 몇번째 라인이다. 라고만 나온다.
삽질했던건 login session 처리와 redirect에 대한거였는데 좀 정확한 Hint를 줬었더라면 1시간만에 끝낼 수 도 있었을텐데...나쁜놈...


멍청한 타이핑로봇이 되지 않기 위해 앞으로 짝프로그래밍에 좀 더 적응해야 할 거 같다.
나의 가장 큰 문제점은 생각을 공유하지 않았다는 점에 있는것 같다.
짝의 의견을 바로 타이핑하지 않으면 왠지 짝의 의견을 무시하는것 같아서 내 생각을 끊고 타이핑로봇으로 변신을 하게되는데 역시 이건 애자일 스럽지 않은것 같다.
짝도 나도 이런것으로 부터 자유로와지는것이 애자일인데 아직 난 준비가 덜 되었나보다.
좀 더 애자일 스러워지도록 노력해야겠다. 무조건 받아적는 타이핑로봇이 아니라 생각을 공유하며 함께 프로그래밍을 해 나가도록 말이다.


첫걸음은 괜찮은것 같다.
비록 애자일스러운 짝프로그래밍을 완벽하게 못했지만 옛말에 "첫술에 배부르랴" 했다.
이제 시작이다. "애자일스러운 짝프로그래밍을 못했다"라고 인식하고 그것에 대한 원인을 발견한 것 만으로 난 만족한다.

몇마디 더 쓰고 싶은데.. 와이프가 밥먹으로 난리다;;
그래서 오늘의 일기 끝~
크리에이티브 커먼즈 라이선스
Creative Commons License

'Ruby On Rails > agile note' 카테고리의 다른 글

코딩하기전 생각하는 습관을 가져라.  (0) 2012/05/04
Code Review  (0) 2008/05/26
Getting Real~!  (0) 2008/02/25
start agile!  (0) 2007/11/26
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/79 관련글 쓰기

댓글을 달아 주세요