개요

오래간만에 루비관련 코드를 분석할 일이 있었다. 몇 가지 메모해둔다.

라이브러리(모듈) 경로 관련

Ruby가 로드하는 라이브러리 경로 확인하기

puts $LOAD_PATH로 로드한 라이브러리 경로를 확인할 수 있다.

irb
irb(main):001:0> puts $LOAD_PATH

irb가 로드하는 경로 추가하기 (일시적)

로드하고 싶은 Ruby 스크립트가 있는 경로로 이동후 다음 명령어를 실행한다.

irb
$LOAD_PATH.push('.')

irb가 로드하는 경로 추가하기 (영구적)

~/.irbrc 파일을 생성하고 다음 코드를 적어두면 된다.

$LOAD_PATH.push('${추가하고싶은모듈의절대경로}')

특정 Ruby 스크립트와 동일한 위치에서 다른 스크립트를 개발할 때 해당 스크립트 require(import)하기

예를들어 불러오고 싶은 로컬 모듈이름이 module_a 라고 하자. 그러면 호출하는 쪽에서 require 'module_a' 라고 선언하면 루비는 알아먹지 못하고 그런 모듈없다는 에러를 발생시킨다. 이럴 떄는 require_relative를 사용한다. 다음과 같이 작성하면 된다.

require_relative 'module_a' # 이 선언을 작성중인 파일을 기준으로 module_a의 상대경로를 적는다. 동일한 경로라면 이렇게 적으면 된다.

Gem관련

직접개발한 로컬 Gem 설치하기

gem install --local path_to_gem/filename.gem

Gem 목록 확인하기

gem list 

로그 출력 관련

레일즈에서 로그를 파일에 출력하기

레일즈(Ruby on Rails)에서 로그를 파일에 출력하려면 puts를 사용해서는 안된다. (참고: https://qiita.com/NaokiIshimura/items/dbf072c313f36c2d9dcc)

puts 는 표준 출력으로 로그를 내보내지만 파일로는 내보내지 않는다. 따라서 파일에 남기고 싶다면 logger.debug 또는 Rails.logger.debug 를 사용해서 출력해야 한다.

logger.debug("어쩌구 저쩌구")
Rails.logger.debug("어쩌구 저쩌구")

서명관련

PKI의 공개키를 사용해서 어떤 데이터의 변조여부를 확인하고 싶을 떄 다음과 같이 사용한다.

require 'openssl'
raw_key = File.read('${KEY_PATH}')
pk =  OpenSSL::PKey::RSA.new(raw_key)
pubkey = pk.public_key
if pubkey.verify('SHA256', signature, data)
    puts 'the signature is valid'
else
    puts 'the signature is invalid'
end

참고

  • https://docs.ruby-lang.org/ja/latest/method/OpenSSL=3a=3aPKCS7/i/verify.html
  • https://gist.github.com/lkdocs/6526465

Base64과 헥스덤프 관련

require 'base64'
require 'hexdump'

# Base64 디코드
Base64.decode64('${BASE64_STRING}')

# Base64 인코드: strict_encode64 를 쓰면 라인래핑(\r\n)이 추가되지 않은 상태의 문자열을 얻을 수 있다. 
Base64.strict_encode64('${BINARY}')

# 헥스덤프(바이트 코드) 출력 
Hexdump.dump('${BINARY}')

참고로 리눅스에서는 다음과 같이 Base64 인코딩된 문자열을 파이프로 연동해서 바이트 코드를 출력하는 방법을 자주쓴다.

echo -n "${BASE64_STRING}" | base64 -d | hexdump -C