[Ruby] Lazy Enumerator 사용하기

1. lazy enumerator란? Lazy Enumerator는 루비 2.0 에서 처음 등장한 기능으로, method chain을 사용할 때 chain을 효율적으로 수행할 수 있도록 도와준다. 이 기능을 알고 난 후에 코드의 양은 줄어들었고 가독성은 오히려 늘어나게 되었다. 매우 좋다. . 2. 사용법 사용법은 어렵지 않다. 기존 enumerator를 사용하는 것처럼 take(n).to_a를 하면 앞에서부터 10개의 아이템을 array로 만들어준다 arr = [1, 3, 5, 2, 4, 6] arr.lazy.select { |i| i <= 3 }.take(2).to_a # => [1, 2] arr.lazy.select { |i| i <= 3 }.first(2) # => [1, 2] .. 3. 비교 lazy를 사용하지 않을 때와 비교 1부터 무한대까지의 숫자 중, 3의 배수를 2개 ...

June 12, 2016 · Juyeong Lee

레일즈 암호화 (Rails Encrypt, Decrypt)

레일즈에서는 암호화를 위해 ActiveRecord에서 기본으로 제공하는 라이브러리를 사용할 수 있다.. 암호화 secret = Rails.configuration.secret_key_base encryptor = ActiveSupport::MessageEncryptor.new(secret) encrypted = encryptor.encrypt_and_sign('value') # => bXRidS92aVpUUG1YVEMwd3V4VkUrUT09LS1hbkUzQzUyTjNlSzBiL2xlaTI1WDNnPT0=--61257eaa178fe8c363e83c8cb966a39c4820fa47 복호화 secret = Rails.configuration.secret_key_base encryptor = ActiveSupport::MessageEncryptor.new(secret) encryptor.decrypt_and_verify(encrypted) # => 'value' MessageEncryptor 위의 예제에서 사용된 MessageEncryptor는 ActiveRecord에서 제공되며, 암호화를 위한 secret key는 레일즈 설정의 secret_key를 사용했다. (다른 key를 만들어서 사용해도 된다) secret = SecureRandom.hex(64) signature_key = SecureRandom.hex(64) serializer = JSONSerializer.new # 다른 serializer를 사용해도 된다. 기본은 Marshal ActiveSupport::MessageEncryptor.new(secret, signature_key, serializer: serializer) Rails3 Rails3에서 secret은 Rails.configuration.secret_token를 사용하면 된다. 참고자료 http://api.rubyonrails.org/classes/ActiveSupport/MessageEncryptor.html

March 14, 2016 · Juyeong Lee

루비 가중치 랜덤

Ruby Weighted Random 랜덤 배열을 무작위로 섞는 방법은 루비 기본 API에서 제공한다 [a, b, c].shuffle # => [c, a, b] [a, b, c].sample # => b shuffle을 통해 섞거나, sample을 통해 추출 할 수 있다. 가중치 랜덤 이때 각 값의 가중치(weight)를 다르게 적용하려면? 쓸만한 gem이 없어서 만들어 보았다.1 (github.com/juyeong/wrandom) ex) a.weight => 1, b.weight => 99 [a, b].wsample { |item| item.weight } #=> b [a, b].wshuffle { |item| item.weight } #=> [b, a] 99%의 확률로 99가 추출된다. Algorithm Weighted random sampling with a reservoir 논문에 나오는 알고리즘 ...

February 20, 2016 · Juyeong Lee

루비 조합 (Combination)

조합(combination)이란 n개의 원소를 가지는 집합에서 k개의 부분집합을 고르는 조합의 경우의 수를 이항계수라 하며, nCk나, C(n, k) 로 나타낸다. 기호 C는 콤비네이션이라고 읽기도 한다. 참고 루비에서 조합을 구하는 방법 def combination(n, k) ((n-k+1)..n).inject(:*) / (1..k).inject(:*) end combination(4, 3) # => 3 combination(6, 2) # => 15 경우의 수가 아닌 실제 값을 구하는 방법은 더 쉽다. 루비에서 기본적으로 제공하는 방법을 이용하면 된다. [1,2,3].combination(2).to_a # => [[1, 2], [1, 3], [2, 3]] [1,2,3,4].combination(3).to_a # => [[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]] 루비에서 순열(permutation)을 구하는 방법 def permutation(n, k) ((n-k+1)..n).inject(:*) end permutation(4, 3) # => 24 (4*3*2) permutation(6, 2) # => 30 (6*5) [1,2,3].permutation(2).to_a # => [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]] (추가) 루비에서 제공하는 combination을 이용한 방법 [1,2,3,4,5].combination(3).size # => 10 더 쉽다….

February 13, 2016 · Juyeong Lee