콘솔 환경에서

rake tmp:clear

 명령어를 작성하면 tmp에 저장된 캐시가 삭제된다.


참고
http://stackoverflow.com/questions/12028088/how-can-i-clear-rails-cache-after-deploy-to-heroku




WRITTEN BY
rabbbit
필기

,

rails 프로젝트를 하다가 객체를 만들어 concat을 사용하는 메소드를 실행 시키는데 


초기 config값을 가지고 있는 변수의 값이 자꾸만 변하는것이다. 예를 들면


class Test 

CONFIG = "1111"


def print

test1 = CONFIG

test1.concat("2222")


puts test1

puts CONFIG

end

end


이런 클래스가 있다고 치자 이때 CONFIG 변수에 저장된 값을 test1에 저장하고 


test1에 문자열을 더하고 싶어 concat을 하여 2222를 추가 하였다. 그리고 test1과 CONFIG를 출력하였다.


이때 출력값은 무엇이 나올까?


놀랍게도 두개의 출력값다 기존에 있던 1111값과 concat한 2222를 한 값인 11112222가 나오게 된다.


사실 이건 concat의 문제는 아니다.


다만 내가 concat을 사용할때 생긴 문제이기 때문에 예를 이것으로 든것 뿐이다. 


그래서 왜 이런 일이 생긴것인지에 대해서 찾아보았다.


먼저 결론부터 말하자면 루비에서 변수는 객체 이기 때문에 이런 현상이 생긴것이다.

(읽기 귀찮으면 밑에 3줄요약만 읽어도됨)



루비는 모든것이 객체인가?


이 현상의 원인은 루비의 자체에 있는데


루비는 모든것이 객체이다. 그래서 정말 변수도 객체인것인가 해서 찾아보았다.


Is variable is object in ruby?

라는 제목으로 누군가가 질문을 한것에 답이있는데 요약하자면

루비의 모든것이 객체 이다 하지만 변수는 객체를 가리키는 이름이다라고 했다.

음.. 무슨 말인지는 모르겠지만 어쨋든 "변수는 객체를 가리키는 것이고 변수 자체는 객체가 아니다" 라는게 대답의 요점인것 같다.

그러니까 처음에 위에서 선언한 변수는 객체가 아니지만 CONFIG 에 저장한 "1111"이라는 문자열은 루비에서 string객체로 인식을 하고 객체(1111)의 주소값을 저장한것이다.

고로 

test1 = CONFIG

이러한 행위는 CONFIG변수 안에 담고있는 string객체(1111)의 주소값을 test1에 저장하는 행위가 되는것이다.

하지만 아무리 변수가 객체를 가지고 있는다고 해도 변수를 다른 변수에 저장할때 객체의 값을 복사할수도 있는데 왜 주소값이 복사가 되는것일까 라는 의문점이 생겼다.



루비는 call by references 방식 인가?

그래서 루비는 call by references 방식인건가 라는 생각에 한번더 검색을 해봤다.

(call by references가 무엇인지에 대해서 궁금하면 이곳 에 들어가면 간단하게 정리되어있다. call by value에 대한 설명과 둘의 차이점도 정리되어있다.)

두개의 답변을 볼수 있는데 요약 하자면 

"변수는 항상 객체를 참조(references)한다. 루비에서 변수는 객체를 가리키는(point)존재 이므로 객체를 가리킬수 있는 주소값을 변수에 저장하는 것이고 그 값을 복사하는 것이다. 그래서 루비는 call by value 이지만 value에  references(객체의 주소값)를 가지고 있기때문에 주소값이 복사되는것이다." 

라는게 요약이다. 뭔가 어렵다...

간단히 말하자면

루비는 call by references 방식이 아니고 call by value 방식으로 변수를 복사 하지만 복사할 value에 주소값이 들어있을 뿐이다.


결론적으로 루비는 call by references 방식을 가지고 있어서, 주소값을 복사해주는게 아니라 value 가 주소값이라서 주소값을 복사하는 것이다. 예를들면


a = 1 <-- a가 가리키는 객체(1)의 주소값 111

b = a <-- a가 가리키는 객체(1)의 주소값 111을 b에 저장


puts b <--- b가 가리키는 객체(1)의 주소값 111에 저장된 값 출력


이렇게 된다는 것이다.


그래서 b의 값을 변경하면 a의 값도 변경이 되는 거다.



루비에서 변수의 값(객체의 값) 복사 하기


위에서 루비의 변수는 객체의 주소값을 가지고 있기 때문에 복사당한 대상의 변수값도 변경이 될수있다고 했다. 


하지만 나는 변수의 값(객체의 값)을 복사해서 사용하고 싶다.


이럴때는 clone이라는 함수를 사용하면된다. 예를들면


test = [1,2,3]

b = a.clone

b.concat 4


puts a

puts b


를하면 a는 123이 출력되고 b는 1234가 출력된다.


더 자세하게 알고 싶다면 이곳 에서 cloning objects라는 부분을 보면된다.


결국 루비에서 변수는 객체를 가지고 있는 것이고, 변수끼리 값을 전달할때 변수에 저장된 값은 객체의 주소값을 가지고 있기 때문에 주소값이 전달이 된다. 그러므로 변수의 값(객체의 값)을 복사해서 사용하고 싶다면 clone 메소드를 사용하면된다.


3줄 요약


1. 루비에서 변수는 객체를 가리키(point)기 때문에 주소값을 가짐

2. 그래서 변수 복사를 할때 call by value 방식이지만 주소값이 넘어가서 메모리를 공유하게됨

3. 이게 싫으면 clone메소드를 쓰면됨





참고 

http://stackoverflow.com/questions/1872110/is-ruby-pass-by-reference-or-by-value

http://stackoverflow.com/questions/22827566/ruby-parameters-by-reference-or-by-value/22827949#22827949

http://stackoverflow.com/questions/8382173/ruby-is-variable-is-object-in-ruby

https://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/39-ruby-s-object-model/lessons/132-cloning-and-freezing-objects




WRITTEN BY
rabbbit
필기

,

bundle update후 mysql2 에러가 나기 시작했다.

이유를 몰라서 찾아보는중 단서를 찾게 되었다.


사실 나랑은 크게 상관이 없는거 같긴한데 어쨋든 해결이 되었으니 올린다.


이번에 rails가 4.2.4버전으로 올라가면서 mysql2 최신버전과 호환이 완벽하지 않기 때문에

낮은 버전을 써야 한다고 한다


그래서 mysql2를 0.3.18버전을 쓰니 에러가 해결됐다.


사실 나도 왜 돼는지는 모르겠다...



WRITTEN BY
rabbbit
필기

,

dragonfly를 사용하여 이미지를 업로드 하고 보여주려고 하는데

image_tag가 작동 하지 않아서 몇일 고생했다..


결국 에러로그를 보고 해결을 했는데

에러 로그에 

sh: convert: command not found

이런 에러가 발생했다.


이 에러에 대한 해결책은 항상 그렇지는 않겠지만.

일단

/usr/bin/convert -version 을 했을때

버전 정보가 아닌 

-bash: /user/bin/convert: No such file or directory가 나온다면


ImageMagick을 설치 하면된다.


yum install ImageMagick


하면 sh: convert: command not found 에러 또한 해결이 된다.


어떤 library나 gem등에서 ImageMagick을 사용할때 이러한 에러가 난다면 꼭 설치 확인을 하고 설치를 하길바란다.


WRITTEN BY
rabbbit
필기

,

rails+nginx+passenger로 개발을 하면 몇가지 모드가 있다(꼭 이 조합으로 했을때는 아니고  rails에 존재한다)

production

development

test


production은 말그대로 개발한 제품을 출시할때 사용 하는 모드로 캐싱 기능이 켜져있다.

development는 개발할때 사용 하는 모드로 캐싱 기능을 꺼서 개발해서 바로 변경사항이 보일수 있도록 한다. 

test는 테스트를 할때 사용하는 모드이다.


enviroments에 관한 설명은 나중에 더 자세히 하고 간단하게 넘기겠다.


아무튼


production모드로 개발을 하려면 한번 변경 할때마다 서버를 껐다 켜야 하는 불편함이 있다.

그래서 개발할 때는 development모드를 사용하여야 하는데


nginx의 경우


rack_env development를


http,server,location ,if configuration 중에 한곳에만 넣고 서버를 재시작을 하면된다


추가 적으로


apache의 경우


RailsEnv development를


global server configuration, virtual host, <Directory>,<Location>, .htaccess, if AllowOverride 등중에 한곳에만 넣으면된다.



위의 옵션들을 적절히 사용하면 하나의 서버에서 여러개의 프로젝트를 레일즈로 개발하거나 deploy할때 특정 프로젝트에만 사용하는것도 가능하다.


마지막으로 development모드를 끄려면 위에 작성한 코드를 지우고 서버를 재시작하면 production모드로 되돌아 간다.


WRITTEN BY
rabbbit
필기

,

/var/log/nginx/error.log

에서 에러로그를 확인했을때


Devise.secret_key was not set. 
Please add the following to your Devise initializer:

이런 에러가 날경우에는


config/initializers/devise.rb


에서 config.secrey_key = '1eoij124l2j5po23~~~'이런식으로 되있는 줄이 주석처리 되어있을것이다.


이부분은 해제 하면 에러가 사라진다.


WRITTEN BY
rabbbit
필기

,

delploy할때 production모드가 default로 되어있기 때문에


config/environments/production.rb


에서 설정을 해줘야 한다.

 

 config.assets.compile = false

이렇게 설정되어있는 것을 false를 true로 변경하면 


css및 자바스크립트가 동작이 된다.



WRITTEN BY
rabbbit
필기

,

레일즈 서버를 시작할때 발생하는


rack/cache Be sure to add rack-cache to your Gemfile (LoadError) 이 에러는


config/environments 에서 devolopment.rb 혹은 production.rb 에 


config.action_dispatch.rack_cache 설정을 true로 해서 생긴 에러이다. 


이 설정을 꼭 true로 해야 겠다면 


rack-cache(gem 'rack-cache')를 설치하여야 하고 


그렇지 않다면 설정을 false로 해놓으면 에러가 사라진다.


WRITTEN BY
rabbbit
필기

,

rails에서 본인이 javascript를 작성하게되면

app/assests/javascript/에 

rails generator 명령어로 페이지를 생성할때와 같은 이름의 coffee script 파일이 생성되어있다.

여기까지는 문제가 없다.


만약 rails 개발자가 coffee script를 사용할줄 모르면 문제가 생기는데

coffee script를 모르기 때문에 javascript로 코딩을 하기 위해서 a.js파일을 생성해서 실행을 했는데 실행이 안된다.

그이유는 a.coffee라는 파일이 이미 존재하기 때문에 두개의 파일이 충돌이 일어나서 에러 한줄도 안뜬다(혹은 내가 레일즈 시작단계라 디버깅이나 로그 보는 법을 모를지도...) 실행이 되지 않는것이다.


이것의 해결책은 a.coffee를 지우고 a.js를 두면 작성했던 코드가 잘 실행이 된다.


rails 3.x 버전부터 coffee script가 default로 채택이 되어있다.

이유야 잘모르겠지만... 약간 불편한건 사실이다 

coffee script의 document를 잠깐보니 javascript의 문법을 확실히 가독성있고, 깔끔하게 만들어 주는거 같긴하다.


일단 나는 javascript도 잘 못하기 때문에 javascript부터 공부하고 한 번 본다면 많은 도움이 될거 같다.


WRITTEN BY
rabbbit
필기

,

google web font 뿐만 아니라 어떤 외부의 웹폰트를 적용할때 사용할 수 있는 방법이다.


맨 처음에는 google-webfonts-rails 라는 gem을 사용하려 했으나 막상 적용해보니 작동이 되지 않아서 github을 보니 커밋하지 않은지 1년이상이나 됐었다..


다른 gem이 있는 지는 모르겠으나 찾기도 귀찮고 폰트 파일을 통채로 불러오면 용량도 크고하니(물론 gem이 있다면 필요한 부분만 쓸수있게 해놓았을수도 있다.) 직접 필요한 부분만 가져와서 쓰는 방식을 사용하려고 한다.


웹폰트를 적용하는 방법은 두가지가 있다.


1. <link>태그를 이용해서 폰트를 넣고 싶은 html.erb 혹은 application.html.erb파일 맨위에 선언한다.

- 보통 한두개의 폰트를 홈페이지 전체에서 쓰기 때문에 application.html.erb파일의 head부분에다가 선언하는게 좋을거 같다.

2. app/assets/stylesheets/application.scss 파일에다가 @import를 사용해서 선언한다.


구글 웹폰트 같은 경우에는 폰트의 굵기마다 선택할수 있도록 되어있다. 다른 곳은 어떤지 잘 모르겠으나.

이렇게 굵기를 직접 정해서 쓰는 방식은 폰트를 꼭 쓰고 싶다면 웹사이트의 속도에 굉장히 많은 영향을 미치게 된다. 

영문 폰트같은 경우야 크지 않지만 한글 폰트같은 경우에는 굵기(font-weight)마다 용량이 못해도 거의 1메가가 되는것들이 대부분이기 때문에 필요한 굵기만 가져다 쓰는것이 좋다.


WRITTEN BY
rabbbit
필기

,