루비 온 레일즈 프로덕션 환경에서 컨트롤러 변수들을 확인하는 방법(How to view variable of controller in Ruby on Rails production)

## 루비 온 레일즈 프로덕션 환경에서 컨트롤러 변수들을 확인하는 방법(How to view variable of controller in Ruby on Rails production) 보통 개발 환경에서 puts 또는 p 로 변수를 프린트해 console로 확인하는 경우가 있는데, 프로덕션 환경에선 puts 또는 p 로 확인하기가 어렵다. 따라서 아래와 같이 변수들을 확인해보는 것을 권장한다. ``` Rails.logger.info "Time: #{Time.now}" ``` 이 때, `/config/environments/production.rb` 또는 `/config/environments/staging.rb`에서 아래와 같이 log level을 설정해줘야 한다. ``` config.log_level = :info ``` 참고 : https://stackoverflow.com/questions/16824355/logging-in-ruby-on-rails-in-production-mode log level 참고 : https://guides.rubyonrails.org/debugging_rails_applications.html

루비 온 레일즈에서 해시 타입의 데이터를 키 또는 밸류를 기준으로 정렬하는 방법(How to sort hash by value or key of hash in Ruby on Rails) ###

## 루비 온 레일즈에서 해시 타입의 데이터를 키 또는 밸류를 기준으로 정렬하는 방법(How to sort hash by value or key of hash in Ruby on Rails) ### Hash 형식의 데이터를 value를 기준으로 정렬하는 방법에 대해 알아보자. 오른차순 정렬은 아래 코드와 같다. ``` hash = { a: 5, b: 1, c: 2, d: 4, e: 3 } hash.sort_by {|k,v| v}.to_h # => {:b=>1, :c=>2, :e=>3, :d=>4, :a=>5} ``` 내림차순 정렬은 아래 코드와 같다. ``` hash = { a: 5, b: 1, c: 2, d: 4, e: 3 } hash.sort_by {|k,v| v}.reverse.to_h # => {:b=>1, :c=>2, :e=>3, :d=>4, :a=>5} ``` ### Hash 형식의 데이터를 key를 기준으로 정렬하는 방법에 대해 알아보자. 오른차순 정렬은 아래 코드와 같다. ``` hash = { a: 5, b: 1, c: 2, d: 4, e: 3 } hash.sort_by {|k,v| k}.to_h # => {:a=>5, :b=>1, :c=>2, :d=>4, :e=>3} ``` 내림차순 정렬은 아래 코드와 같다. ``` hash = { a: 5, b: 1, c: 2, d: 4, e: 3 } hash.sort_by {|k,v| v}.reverse.to_h # => {:e=>3, :d=>4, :c=>2, :b=>1, :a=>5} ```

크론탭을 이용한 리눅스 서버 용량 줄이기(How to solve linux server disk problem by using crontab)

리눅스 서버 용량이 자꾸 늘어 서버에 오류가 발생하는 경우가 생겼습니다. 이에 대한 해결 방법을 작성합니다. 먼저 `df -h` 리눅스 명령어를 이용해 파일 시스템 별 디스크 용량을 확인해봅니다. ``` Filesystem Size Used Avail Use% Mounted on udev 971M 0 971M 0% /dev tmpfs 199M 776K 198M 1% /run /dev/xvda1 7.7G 7.6G 0.1G 99% / tmpfs 993M 0 993M 0% /dev/ tmpfs 5.0M 0 5.0M 0% /run/ tmpfs 993M 0 993M 0% /sys/ /dev/loop0 18M 18M 0 100% /dev/loop1 94M 94M 0 100% /snap/ /dev/loop2 94M 94M 0 100% /snap/ tmpfs 199M 0 199M 0% /run/ ``` 그 다음, root 위치에서부터 어떤 디렉토리에서 사용량이 많은지 확인해나갑니다. 현재 디렉토리에서 디스크 사용량 상위 10개를 확인해보는 명령어입니다. ``` du -hsx * | sort -rh | head -n 10 ``` 그 결과, 대부분이 로그 파일 용량이 문제임을 확인했습니다. 로그 파일의 경우 파일크기가 지속적으로 증가하기 때문에, 주기적으로 로그 파일 용량을 줄여주기로 했습니다. 리눅스 crontab 을 이용해 주기적으로 로그 파일 용량을 줄여주도록 합니다. 먼저, crontab으로 실행시킬 shell 파일을 생성합니다. ``` vi delete_log_file.sh ``` 만든 파일에 다음과 같이 입력합니다. ``` #!/bin/bash truncate --size 0 파...

맥(Mac)에서 MySql 사용 시 Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 오류가 발생하는 경우 해결 방법

## 맥(Mac)에서 MySql 사용 시 Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 오류가 발생하는 경우 해결 방법 mysql 사용 시 간혹 Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 라는 오류를 마주하게 될 때가 있다. mysql 이 비정상적으로 종료를 하게 되면 나타나는 현상이라고 하는데 어떻게 해결해야 하는지 알아봅니다. 저의 경우는 아래와 같이 2줄을 해당 프로젝트 폴더 위치에서 터미널을 실행하면 해결이 되었습니다. ```shell brew services stop mysql brew services start mysql ``` 그 다음 해결이 되었는지 확인할 때 아래와 같이 확인하고, 비밀번호를 입력합니다. ```shell mysql -u root -p ``` 비밀번호 설정이 되어있지 않은 경우 아래와 같이해도 무방합니다. ```shell mysql ``` 참고: https://postitforhooney.tistory.com/entry/MACDBError-Cant-connect-to-local-MySQL-server-through-socket-tmpmysqlsock-2 [PostIT]

루비 온 레일즈에서 세션 삭제하는 법 (How to delete session data in Ruby on Rails)

## 루비 온 레일즈에서 세션 삭제하는 법 (How to delete session data in Ruby on Rails) 기존 사용자의 로그인 세션이 남아 있어 오류가 생기는 현상이 있어, 강제로 해당 사용자의 로그인 세션을 지우고자 했다. 아래의 방법처럼 해결했는데 가장 좋은 방법인지는 모르겠다. 먼저 session data를 출력시키는 방법은 아래와 같다. ```ruby session.inspect ``` 그 다음 key로 삭제해주는 방법은 아래와 같다. ```ruby session.delete(:user_id) ```

루비 온 레일즈에서 split, strip, join 메소드 사용법(How to use split, join in Ruby on Rails)

## 루비 온 레일즈에서 split, strip, join 메소드 사용법(How to use split, join in Ruby on Rails) 해시태그를 구현하는 중에 split, strip, join 을 사용하게 되서 기록을 남긴다. input text field 에 "바나나, 딸기, 키위, 사과" 라고 적고 저장하면 바나나, 딸기, 키위, 사과 라는 각각의 해시태그가 만들어졌으면 했다. 그걸 위해 split 을 사용했다. ```ruby text = "바나나, 딸기, 키위, 사과" #text field로 저장한 값 array_hashtag = text.split(",") # => ["바나나", "딸기", "키위", "사과"] ``` 위와 같이 String에 있는 값들을 "," 단위로 쪼개 배열에 넣어준다. 쪼개서 배열에 들어갔으니 저 배열을 하나씩 해시태그로 저장하면 됐다. 근데 문제는 만약 사용자가 띄어쓰기를 잘못하면 어떻게 하나 라는 문제가 생겼다. 예를 들어. "바나나 ,딸기 , 사과, 키위 " 이런 식으로 말이다. 그런 문제를 해결하기 위해 strip 메소드를 사용했다. ```ruby text = "바나나 ,딸기 , 사과, 키위 " array_hashtag = text.split(",") # => ["바나나 ", "딸기 ", " 사과", " 키위 "] array_hashtag.map! {|hashtag| hashtag.strip} # => ["바나나", "딸기", "사과", "키위"] ``` 그리고나서 저장한 해시태그 전부를 출력하려고 하는데 대괄호, 각각의 따옴표를 삭제해서 출력하고...

루비 온 레일즈에서 Strong Parameters 를 사용할 때 permit이 아닌 파라미터를 사용하는 방법(How to use unpermitted parameter by using Strong Parameters in Ruby on Rails)

## 루비 온 레일즈에서 Strong Parameters 를 사용할 때 permit이 아닌 파라미터를 사용하는 방법(How to use unpermitted parameter by using Strong Parameters in Ruby on Rails) Strong Parameters는 강력한 보안을 위해 사용된다. 하지만 모델의 속성(attribute)이 아니지만 하나의 모델 form에서 받아야하는 파라미터가 있을 수 있다. 그럴 때 어떻게 할까? 라는 질문에 답을 해보자. 아래와 같은 컨트롤러에서 "special_attribute" 라는 파라미터로 값을 넘겨받아야 한다고 가정해보자. ```ruby def action if @instance.save(model_params) redirct_to :back end end private def model_params params.require(:model).permit(:attribute1, :attribute2) end ``` 그런 경우 아래와 같이 코드를 작성할 수 있다. ```ruby def action if @instance.save(model_params) special_attribute = params[:model][:special_attribute] puts "#{special_attribute}" redirct_to :back end end private def model_params params.require(:model).permit(:attribute1, :attribute2) end ```

루비 온 레일즈 프라이빗 메소드 사용하기(How to use private method in Ruby on Rails)

## 루비 온 레일즈 프라이빗 메소드 사용하기(How to use private method in Ruby on Rails) 루비 온 레일즈를 사용하다보면 private method 를 정의해서 사용할 때가 있다. 사용 시 주의사항에 대해서 알아보자. 아래와 같은 코드가 있다고 가정한다. ```ruby class Dog def bark puts "멍멍" end private def sounds_of_mind puts "밥 주세요" end end ``` jindo 라는 instance 객체를 만든 뒤 bark 메소드를 사용하면 아래와 같이 나타난다. ```ruby jindo = Dog.new jindo.bark 멍멍 => nil ``` 아래와 같이 sounds_of_mind 메소드를 사용하면 아래와 같이 나타난다. ```ruby jindo = Dog.new jindo.sounds_of_mind NoMethodError (private method `sounds_of_mind' called for #Dog:..>) ``` 즉, private method는 인스턴스에서 바로 호출해 사용할 수 없는 메소드인 것이다. 그러면 어떻게 사용해야하나? 바로 public method를 이용해 사용할 수 있다. 먼저 아래처럼 코드를 정의한다. ```ruby class Dog def bark puts "멍멍" sounds_of_mind end private def sounds_of_mind puts "밥 주세요" end end ``` 그 다음 아래와 같이 bark 를 호출하면 private method 인 `sounds_of_mind`가 호출되는 것을 볼 수 있다. ```ruby jindo = Dog.new jindo.bark 멍멍 밥주세요 => nil ```

루비 온 레일즈에서 동시에 다수 사용자가 DB 수정이 필요한 작업을 수행할 때 처리하는 방법, 동시성 제어, lock(At the same time, how to handle when multiple users perform a task that requires DB modification in Ruby on Rails, concurrency control, lock)

## 루비 온 레일즈에서 동시에 다수 사용자가 DB 수정이 필요한 작업을 수행할 때 처리하는 방법, 동시성 제어, lock(At the same time, how to handle when multiple users perform a task that requires DB modification in Ruby on Rails, concurrency control, lock) 동시에 다수 사용자가 동일한 row의 값을 변경하게 되는 때가 있다. 예를 들어, 판매 물품의 재고가 1개 남았는데 동시에 2명의 사용자가 그 물품을 사게 된다면 어떻게 될까? 재고는 1개인데 둘 다 구매한 것으로 저장된다면? 좋은 예시(송금 예시와 같은)인지는 잘 모르겠으나, 이런 경우 처리할 수 있는 방법 중 하나를 적어보려고 한다. ```ruby product = Product.first product.with_lock do if product.amount > 0 product.amount -= 1 product.save! end end ``` 특정 상품에 lock 처리를 해서 1개 남아있을 때, 2명이 동시에 구매 시도를 하더라도 1명만 구매할 수 있도록 처리를 한다.

루비 온 레일즈 사이드킥에서 예약 된 특정 작업을 삭제하는 법 (How to delete specific scheduled job in Ruby on Rails with Sidekiq)

## 루비 온 레일즈 사이드킥에서 예약 된 특정 작업을 삭제하는 법 (How to delete specific scheduled job in Ruby on Rails with Sidekiq) 루비 온 레일즈에서 사이드 킥으로 특정 작업을 예약한 후 작업을 할 수 있는데, 간혹 예약 된 특정 작업을 삭제하고 싶을 때가 있다. 예를 들어, 요금을 내지 않은 A고객에게 매일 한 번씩 미납된 요금에 대한 알림을 주도록 예약했는데 A고객이 자신의 요금은 부당하다고 얘기하는 경우, 잠시 멈추고 또는 영원히 알림을 제거해야할 수 있다. 좀 억지라고 느낄 수 있지만, 딱히 좋은 예시가 떠오르지 않으니 넘어가자. 어쨌든 그런 경우 예약된 작업을 제거하는 방법에 대해 알아보자. 아래의 코드는 예약된 작업들을 scheduled_job 에 담는 코드다. ```ruby scheduled_job = Sidekiq::ScheduledSet.new ``` 그 다음, schedule_job 중 내가 원하는 특정 작업을 아래와 같이 찾아 삭제할 수 있다. Job class 가 ShowMeTheMoney 이고 내 어플리케이션 서버의 Model id 를 파라미터로 사용한 경우 아래와 같이 class와 model id 를 찾아 삭제할 수 있다. ```ruby scheduled_job.each do |job| if (job.args.first["job_class"] == "ShowMeTheMoney" && job.args.first["arguments"][0]["_aj_globalid"] == "gid://application-server/Model/#{model.id}") Model.find(model.id).destroy end end ``` 아래 코드를 콘솔에서 확인해 현재 본인의 예약 된 작업이 어떤 식으로 구성되어있는지 확인해보고 그에 맞게 수정해보는 것도...