/Library/Ruby/Gems/2.0.0/gems/aws-sdk-core-2.2.11/lib/seahorse/client/plugins/raise_response_errors.rb:15:in `call': The request signature we calculated does not match the signature you provided. Check your key and signing method. (Aws::S3::Errors::SignatureDoesNotMatch) from /Library/Ruby/Gems/2.0.0/gems/aws-sdk-core-2.2.11/lib/aws-sdk-core/plugins/s3_sse_cpk.rb:18:in `call' from /Library/Ruby/Gems/2.0.0/gems/aws-sdk-core-2.2.11/lib/aws-sdk-core/plugins/param_converter.rb:20:in `call' from /Library/Ruby/Gems/2.0.0/gems/aws-sdk-core-2.2.11/lib/seahorse/client/plugins/response_target.rb:21:in `call' from /Library/Ruby/Gems/2.0.0/gems/aws-sdk-core-2.2.11/lib/seahorse/client/request.rb:70:in `send_request' from /Library/Ruby/Gems/2.0.0/gems/aws-sdk-core-2.2.11/lib/seahorse/client/base.rb:207:in `block (2 levels) in define_operation_methods' from /Library/Ruby/Gems/2.0.0/gems/aws-sdk-resources-2.2.11/lib/aws-sdk-resources/services/s3/file_uploader.rb:42:in `block in put_object' from /Library/Ruby/Gems/2.0.0/gems/aws-sdk-resources-2.2.11/lib/aws-sdk-resources/services/s3/file_uploader.rb:49:in `open_file' from /Library/Ruby/Gems/2.0.0/gems/aws-sdk-resources-2.2.11/lib/aws-sdk-resources/services/s3/file_uploader.rb:41:in `put_object' from /Library/Ruby/Gems/2.0.0/gems/aws-sdk-resources-2.2.11/lib/aws-sdk-resources/services/s3/file_uploader.rb:34:in `upload' from /Library/Ruby/Gems/2.0.0/gems/aws-sdk-resources-2.2.11/lib/aws-sdk-resources/services/s3/object.rb:231:in `upload_file' from build.rb:240:in `<main>'



위와 같은 에러가 발생하여 확인해보니



aws crediential을 설정하는 부분에 띄어쓰기 문자가 들어있었다. 띄어쓰기나 다른 들어가면 안되는 문자가 있는지 확인해보자

Posted by pjc0247
TAG AWS

기본적으로 템플릿 파일들은 변경하여도 서버 재시작 없이 적용이 되지만,
rb 파일을 변경하였을 경우에는 서버 재시작을 해야 반영이 된다.

Sinatra에서 제공하는 해결책은 rerun gem을 이용하는것인데 
(http://www.sinatrarb.com/faq.html)
(https://github.com/alexch/rerun)

이는 윈도우 환경에서 정상적으로 동작하지 않는다.

C:/Ruby22/lib/ruby/gems/2.2.0/gems/rerun-0.11.0/lib/rerun/runner.rb:152:in `fork': fork() function is unimplemented on this machine (NotImplementedError)

        from C:/Ruby22/lib/ruby/gems/2.2.0/gems/rerun0.11.0/lib/rerun/runner.rb:152:in `start'

        from C:/Ruby22/lib/ruby/gems/2.2.0/gems/rerun0.11.0/lib/rerun/runner.rb:9:in `keep_running'

        from C:/Ruby22/lib/ruby/gems/2.2.0/gems/rerun-0.11.0/bin/rerun:12:in `<top (required)>'

        from C:/Ruby22/bin/rerun:23:in `load'

        from C:/Ruby22/bin/rerun:23:in `<main>'


맥 또는 리눅스 환경에서는 rerun을 이용하여 해결할 수 있겠지만, 윈도우에서는 다른 방법을 사용해야 한다.


gem install sinatra-reloader


require 'sinatra'
require 'sinatra/reloader'


require 쪽에 적어주기만 하면 알아서 적용되고, rb 파일을 변경해서 다시 요청을 시도해보면 정상적으로 리로드가 되는걸 확인 가능하다.


Posted by pjc0247
TAG Ruby, sinatra

루비의 yield 문을 이용하여 템플릿 안에 템플릿을 렌더링하는것을 만들어볼 수 있습니다.

이러한 방법은 전체 레이아웃과, 각각의 콘텐츠의 레이아웃을 분리시킬 때 유용합니다.


한개의 중첩 안에 여러개의 템플릿을 사용할 때는 아래와 같이 이용합니다.
yield에 렌더링해야 하는 템플릿의 타입을 지정합니다.


Posted by pjc0247

[Ruby] autoload

Ruby 2016.01.04 13:47
http://ruby-doc.org/core-2.1.0/Module.html#method-i-autoload

autoload는 클래스가 사용되는 시점에 해당 클래스가 포함된 rb 파일을 lazy 하게 로드할 수 있도록 하는 기능을 제공합니다.


  
  


autoload? 메소드를 사용하면, 특정 클래스에 대해 autoload 가 지정된 파일 경로를 가져올 수도 있습니다.


Posted by pjc0247
TAG Ruby

[Ruby] at_exit

Ruby 2015.12.30 11:04
루비 Sinatra 의 간단한 예제 코드는 아래와 같습니다.

위의 코드를 실행하면 바로 웹 서버가 실행되는데, 이 동작은 약간 이상합니다.


분명히 라우팅만 지정했을 뿐이고, 서버를 실행하는 코드는 아무데도 없습니다. 파일의 끝이 나와서 프로그램이 꺼져야 하는데, 꺼지지 않고 계속 서버가 실행됩니다.


이는 at_exit를 이용한 트릭이며, 사용자가 직접 서버를 켜는 코드를 작성하지 않아도 되도록 도와줍니다. 

at_exit는 앱이 종료될 때 실행되는 콜백을 지정하는 함수입니다. 단순히 블록 하나만 넘겨주면 되며, 사용법은 아래와 같습니다.


at_exit를 여러번 실행하면, 콜백이 교체되는것이 아니라 '추가'됩니다. 아래의 코드는 RunServer를 3번 실행시킵니다.


위에서 말했듯이 Sinatra는 이 방법을 이용한 트릭을 사용합니다. 'get' 등을 호출하면 어딘가에 정보를 저장하고 있다가, at_exit에서 서버를 실행하는 것 입니다.


Posted by pjc0247
TAG Ruby, sinatra

Ruby HTTPS 연결에서의 아래와 같은 에러가 발생할 때

C:/Ruby22/lib/ruby/2.2.0/net/http.rb:923:in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)


cacert.pem

위 파일을 rb 파일이 위치한 폴더에 다운받습니다.


방법 1. SSL_CERT_FILE 환경 변수 설정하기


또는


방법2. 수동으로 인증서 지정하기


Posted by pjc0247

jenkins & LINE 원격 환경을 구성하는 방법을 소개하는 글은 아닙니다.


얼마 전부터 '다른' 방법으로 jenkins를 다루는법을 생각하다가 결국 LINE 메신져를 이용해서 관리하기로 정했다. 이 방법의 제일 좋은점은 빌드가 끝나면 '라인 메신저'로 완료를 알려준다. (라인 앱에서 푸시도옴)

기본적으로 원격으로 빌드할 수 있고 (당연히), 서버의 item들의 리스트를 모두 가져오는 기능도 나중에 추가하였다. 이 이상의 기능은 더 만들라면 만들수 있겠지만, 별로 필요가 없어서 안만듬. (이거보다 더 상세히 컨트롤하고싶으면 젠킨스 페이지를 들어가는게 더 편할텐데 라는 생각이다,)



라인 메신져로 빌드를 명령한 화면. 빌드 파라미터중에 Version이 있는데, 이건 수동으로 지정해서 빌드해야 한다. 나머지는 젠킨스에서 구성한 기본값이 들어간다.

젠킨스상에서 실제 빌드가 된 모습. (계속 만들고 테스트하면서 스크린샷 찍어서 빌드 넘버는 맞지 않는다.)


jenkins에서 실행되는 빌드 스크립트쪽에서도 빌드 상황같은걸 빌드를 요청한쪽에 알려줄수 있게 하기 위해 따로 API를 만들었다. 


위 스펙대로 요청하면 해당 빌드를 요청한 사용자한테 메세지를 보내준다. (이 요청은 빌드 상태일때만 유효하다. 빌드 끝나면 닫힘)


오늘 추가한 기능.
빌드 명령에 빌드할 item 이름을 지정할 수 있도록 패치한 모습 & 없는 item을 입력했을 때의 에러 테스트. 사실 나 혼자 쓸거라 그동안 빌드 아이템이나, 파라미터같은걸 그냥 고정으로 해놨었다.

jenkins에 등록된 모든 item 목록을 가져오는 명령어


봇이 살아있는지를 검사하는 명령어


Posted by pjc0247

[Ruby] binding_of_caller

Ruby 2015.11.27 15:29

binding_of_caller gem을 사용하면 자신의 호출자의 binding을 가져올 수 있다.



원래대로라면 foo 함수에서 bar의 로컬에 접근하는것은 불가능하다. 




binding_of_caller gem을 사용하면 콜스택을 거슬러 올라간 binding을 가져와 로컬 값을 설정하거나, 가져오는것이 가능하다.



https://github.com/banister/binding_of_caller



Posted by pjc0247
1. @를 이용한 로컬 변수와, 인스턴스 변수의 구분

루비는 변수 이름에 @를 붙이면 인스턴스 변수로 동작한다.

이러한 강제적인 컨벤션은 완벽한 인텔리센스가 제공되지 못하는 루비 특성 상 굉장히 유용하며, 코드를 보았을 때 어떠한 변수가 인스턴스인지, 로컬인지를 한눈에 파악할 수 있도록 해준다.

C++등에서 쓰이는 이름 앞에 m_를 붙이는 컨벤션보다 깔끔하다는것은 말할 것도 없다.


2. !, ? 를 접미사로 가지는 네이밍 규칙

메소드 뒤의 ? 는 이 메소드가 bool 값을 리턴함을 의미한다, 

메소드 뒤의 ! 는 메소드가 자기 자신을 변경함을 의미한다, 예를들어 vector의 reverse 같은 메소드들은 reverse되는 결과를 리턴하는지, 자기 자신을 reverse하는지가 굉장히 애매하다, 다른 정적 언어는 IDE의 도움을 받아, 리턴값이 void인지 어떤것인지를 보고 대충 파악을 할 수 있지만, 메소드 정의 시 명시적으로 리턴값을 지정하지 않는 루비에서는 그런 도움을 받을 수 없어 판단이 애매하다, 이 때 ! 가 출동하면 이러한 문제를 깔끔하게 해결할 수 있다.


사실 ! 에 대해서는 깔끔한 문법이라고 하기에는 애매한 부분이 많다,

pop, clear처럼 자기 자신을 변경하면서도 ! 가 붙지 않는 메소드가 있는가 하면, 몇몇 라이브러리에서 ! 는 다른 의미로 사용된다. 

하지만 위에 적어놓은 용례에 한정해서는 메소드의 동작을 굉장히 명확하게 알려주는 효과가 있기 때문에 이곳에 적어놓았다.


Posted by pjc0247

select

콜렉션에서 주어진 조건과 일치하는 모든 항목의 콜렉션을 반환한다.


collect

콜렉션의 모든 원소들을 가공해서 새로운 콜렉션을 반환한다.


map

map은 collect의 alias이며, 다른 언어에서 사용하는 메소드와 네이밍을 맞춰서 편리성을 제공하기 위해 만들어진 메소드이다.


Posted by pjc0247