루비 온 레일즈에서 최신 로그들을 가지고 오고 싶다면? 부모 모델과 연결된 자식 모델의 마지막 행들의 값을 가지고 오고 싶다면? (How to get recently log or last row of child model Ruby on Rails )

이미지
## 루비 온 레일즈에서 최신 로그들을 가지고 오고 싶다면? 부모 모델과 연결된 자식 모델의 마지막 행들의 값을 가지고 오고 싶다면? (How to get recently log or last row of child model Ruby on Rails ) 최근 루비 온 레일즈 프로젝트에서 부모 모델의 각 id에 연결 된 자식 모델의 행 중 맨 마지막 행의 특정 컬럼값이 몇 개인지 세야 했다. 예를 들자면 아래 이미지와 같은 느낌이다. 이미 SQL을 그대로 삽입해서 구현한 코드는 있었다. 코드는 아래와 같다. ```ruby parents = ParentModel.where("created_at > ?", date_value) parents.where("(SELECT event FROM child_model WHERE parent_model_id = parent_models.id ORDER BY created_at DESC LIMIT 1) = ?", ChildModel.events[:event_name]).count ``` 그러나 Rails way, DB 호환성 등을 위해 ActiveRecord를 사용한 코드로 바꿔야했다. 바꾼 코드는 다음과 같다. ```ruby parents = ParentModel.where("created_at > ?", data_value) #큰 의미 없음 ChildModel.where(parent: parents, id: ChildModel.group(:parent_model_id).maximum(:id).values).group(:event).count["event_name"] ``` ActiveRecord를 사용한 코드라 바꿨고, 걸리는 시간도 조금 줄었다. 코드 설명을 하자면 ChildModel에서 각 parents를 가지고 있으면서 각 ChildModel의 parent 모델의 id 값중 가장 큰 값(최근에 저장된 child mod...

ssh 접속 시 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 문제

## ssh 접속 시 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 문제 평소 ssh 로 잘 접속되었는데 갑자기 아래와 같은 메시지가 나오면서 접속되지 않는다면 ```bash @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ECDSA key sent by the remote host is ... ``` 아래와 같이 명령어를 적고 다시 접속한다. ```bash ssh-keygen -R IP 주소 ```

루비 온 레일즈 eval (eval in Ruby on Rails)

## 루비 온 레일즈 eval (eval in Ruby on Rails) #### 아래와 같이 json 형식으로 값을 뽑아내야하는데 pluck을 사용하니 그 아래와 같이 나왔다. ```ruby "[{\"x\":0,\"y\":-4,\"z\":2},{\"x\":16,\"y\":-4,\"z\":4},{\"x\":16,\"y\":4,\"z\":8},{\"x\":0,\"y\":4,\"z\":5},{\"x\":0,\"y\":0,\"z\":2}]" ``` pluck 으로 뽑아낸 결과 ```ruby ["{:x=>0, :y=>-4, :z=>2}", "{:x=>16, :y=>-4, :z=>4}", "{:x=>16, :y=>4, :z=>8}", "{:x=>0, :y=>4, :z=>5}", "{:x=>0, :y=>0, :z=>2}"] ``` 그래서 사용한 방법은 map 과 eval을 이용하는 것이다. 모델에서 뽑아낸 행들.map{|m| eval(m.모델의 컬럼네임) if 모델의 컬럼네임.present?}

루비 온 레일즈 pluck 메소드 (how to use pluck, eval method in Ruby on Rails)

## pluck 메소드 간단 소개 #### 예를 들어 모든 유저의 이름을 하나의 배열에 담을 때 어떻게 해야 효율적일까? 와 같은 문제를 해결 할 때 유용하게 사용할 수 있는 메소드가 pluck 이다. 물론 아래와 같이 반복문을 사용할 수도 있다. ```ruby user = [] User.all.each do |u| user
Hash에서 값을 얻는 방법(feat. try, fetch, dig) (How to use try, fetch and dig for getting value from hash) ### Hash에서 값을 얻는 방법 데이터를 다루다 보면 자주 Hash (다른 언어에선 Dictionary 라고도 하는)를 사용하게 되는데, Hash에서 데이터를 얻을 때, 어떻게 뽑아내는지와 주의해야할 점에 대해 적으려고 한다. 예제를 통해 알아보자. --- #### fetch 일단 간단한 Hash를 하나 만들어본다. ```ruby hash = {:apple=>{:color=>"red"}, :banana=>"yellow", :melon=>"gree "} # => {:apple=>{:color=>"red"}, :banana=>"yellow", :melon=>"green"} ``` 그 다음 [] 으로 값을 얻어보자. banana 키의 yellow 라는 값을 얻고 싶다면, ```ruby hash[:banana] #=> "yellow" ``` 아주 간단하다. 하지만 banana이라는 key가 없거나 오타가 있다면 어떻게 될까? ```ruby hash[:banaan].upcase # NoMethodError (undefined method `upcase' for nil:NilClass) ``` 위와 같이 에러가 뜬다. 이런 상황을 방지하기 위해 `fetch`를 사용한다. ```ruby hash.fetch(:banaan, "yellow").upcase # => "YELLOW" ``` --- #### try 이번엔 red의 값을 찾아보자. ```ruby hash[:apple][:color] # => "red" `...

루비 온 레일즈에서 devise gem 없이 로그인 기능 구현하기 (How to build authentication system without devise gem in Ruby on Rails)

##### 해당 포스트의 목표는 로그인 기능을 devise gem을 이용하지 않고 직접 구현하는 것입니다. 직접 구현해보면서 로그인 기능이 어떻게 구현되는지에 대해 이해해보고자 합니다. ##### 만약 Ruby on Rails 입문하고 싶거나, 입문하지 얼마 되지 않았다면, 해당 글을 따라해보기를 권합니다. 로그인에 대한 이해 뿐만 아니라, Ruby on Rails의 CRUD (Create, Read, Update), Background Job 등을 경험해볼 수 있기 때문입니다. 구현 순서는 아래와 같습니다. 루비 온 레일즈는 이미 다 설치되어 있다고 가정하고 진행합니다. *루비 온 레일즈 설치 방법*은 https://gorails.com/setup/osx/10.15-catalina 와 같은 사이트를 참고하시기 바랍니다. #### 1. 회원가입 구현(feat. MVC(Model, View, Controller)) #### 2.쿠키를 이용한 로그인 #### 3. 세션을 이용한 로그인 #### 4. JWT를 이용한 로그인 #### 5. 사용자 메일 인증 --- ### 1. 회원가입 구현(feat. MVC(Model, View, Controller)) 로그인을 구현하기 위해 사용자 정보를 저장할 User table을 만들 것입니다. **명령어로 한 번에 모델, DB 테이블, 테스트 파일 생성** --- ```bash rails g model User ``` 위와 같은 명령어로 model 파일과, migration 파일, test를 위한 파일들을 동시에 만들 수 있습니다만 직접 파일을 만드는 경우에는 아래와 같습니다. **모델, DB 테이블, 테스트 파일을 따로 생성** --- 아래와 같이 models 폴더에 `user.rb` 파일을 만듭니다. 사진 1 만든 파일 안에 아래 코드를 입력합니다. 모델 파일을 만들었습니다. user.rb ```ruby class User # ``` 한 번 똑같은 이메일로 회원가입을 해봅시다. `r...

루비 온 레일즈에서 new 와 build 메소드 차이 (Difference between new and build method in Ruby on Rails)

## 루비 온 레일즈에서 new 와 build 메소드 차이 개발 중 new와 build의 차이가 무엇인가 궁금해졌다. 찾아보니, 크게 다른 것은 없어보였다. `User.comments.new`, `User.comments.build` 는 둘 다 같기 때문이다. 다만 `User.new` 는 되지만 `User.build`는 되지 않는다는 점이 차이라고 할 수 있겠다.

구글 블로거에서 마크다운 사용하는 방법 (How to use markdown in Google Blogger)

이미지
## 구글 블로거에서 마크다운 사용하는 방법 구글 블로거를 쓰면서 불편했던 부분이 코드 편집의 어려움이었다. markdown을 쓸 수 있다면 그런 문제도 해결되고 보다 가독성 있게 쓸 수 있을텐데라는 생각에 사용 방법을 찾아 사용했봤다. 여러 방법을 사용해본 후 가장 간편하면서, 내게 잘 맞아 지금도 사용하고 있는 방법을 소개하려고 한다. ### cdn을 이용한 markdown 사용 방법 --- 아래 사진을 보고 따라하면 1분 만에도 설정할 수 있다. 아래 이미지와 같이 블로거 쓰는 페이지에서 테마를 클릭한다. 그 다음 오른쪽 상단에 버튼을 누른 후 HTML 편집을 클릭한다. 그 다음 아래 코드를 아래 이미지와 같은 위치에 복사한다. ```html ``` 그 다음 아래 코드를 맨 아래 쪽으로 내려가서 아래 이미지와 같은 위치에 복사한다. ```html ``` 그 다음 아래 이미지와 같이 맨 하단의 오른쪽 부분의 디스크 모양을 클릭해 저장한다. 꼭 클릭해서 저장 ! 그 다음 설정 => 글, 댓글 및 공유에 들어가 "추가" 버튼을 클릭한다. 아래 이미지와 같이 아래 코드를 입력하고 오른쪽 상단의 설정 저장 버튼을 클릭한다. 꼭 클릭해서 저장! 이제 글쓰기 화면으로 가면 아래와 같이 위에서 저장한 코드가 자동으로 입력되어 있을 것이다. 그 코드 사이에 마크다운 문법을 이용해 글을 작성하면 된다. 참고 - https://js-react.blogspot.com/2017/01/using-markdown-in-blogger.html

AWS 요금 폭탄

  ## AWS 요금 폭탄 AWS 청구서를 보고 멘붕이 왔다. 테스트용으로 $533.17가 사용됐다. 실서버도 아닌데 말이다.... 다 내 무지에서, 안일함에서 나온 비용이다. 해킹을 당한게 아니라 오로지 내가 무지해서 나온 비용임으로 어디에 하소연할 곳도 없다. 하지만, '소잃고 외양간이라도 고쳐야지'라는 심정으로 글을 적어본다. 서울 리전과 도쿄 리전, 두 개 리전에서 동일하게 EC2, RDS, Route53, Elastic IP, VPC를 사용했다. 한 개 리전 비용의 2배가 총 비용이 되겠다. 리전 1개에 대하여 되짚어보자. 가장 많이 비용이 나온 것은 RDS다. RDS를 맨 처음 생성할 때 default 값이 db.r5.large 였는데 이게 그렇게 비싼 db인지 모르고 아무 생각 없이 만들었던게 문제였다. 기본적으로 RDS 요금은 세 가지 항목으로 구성되어 요금이 책정된다. 중지해놓지 않고 사용 중일 때 나가는 instance 요금과 중지해도 과금되는 storage 요금, I/O Request에 따른 요금이다. 테스트용이였기 때문에, storage나 I/O Request에 따른 요금은 2달러 내외였다. 문제는 instance 요금. 이게 거의 $240달러가 나왔다. 테스트용이었기 때문에, 테스트 안할 때는 껐어야 했다. 그리고 db.r5.large만큼 큰 db가 아니라 t2.small, t2.medium 정도로 했어야했다. 그랬으면 이런 불상사가 없었을텐데. 다음으로 많이 나온 것은 EC2다. 3개의 instance를 사용했는데, 1개는 t2.medium, 1개는 t2.small, 1개는 VPC용 t2.nano 였다. 이건 켜놓지 않아도 비용이 들기 때문에, 사용하지 않는 경우에는 AMI를 이용해 이미지를 생성해놓고 필요할 때 꺼내서 사용했어야 했다. 하지만 그렇게 하지 않아 $24가 청구 됐다. 마지막으로 사전에 얼만큼 필요한지, 요금은 얼마인지 알아봐야했다. 그리고 조직에 연결되어있는 AWS여서 결제에 대한 aler...

루비 온 레일즈에서 migration 활용법 (How to use migration in Ruby on Rails)

## Ruby on Rails 에서 migration 활용법 table 을 만들거나 수정하는 경우 migration 파일을 이용한다. 해당 부분은 많이 찾아볼 수 있을 것이기 때문에 이 글에선 migration 시 실행하는 파일에 대해서만 알아보려고 했으나 설명하려다보니 그냥 추가하는 부분도 같이 설명해보려고 한다. --- ### attribute (column) 추가 예를 들어서 User table에 role 이라는 column 을 추가해야 할 때를 가정한다. 아래와 같이 명령어를 실행하면 db > migrate 폴더에 파일이 생성된다. ``` rails g migration add_컬럼명(column)_to_테이블명(table) 컬럼명:데이터타입 #Ex) rails g migration add_role_to_user role:integer ``` 파일을 열면 아래와 같은 코드를 확인할 수 있을 것이다. ```ruby class AddRoleToUser