5월, 2020의 게시물 표시

크론탭을 이용한 리눅스 서버 용량 줄이기(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 ``` 아래 코드를 콘솔에서 확인해 현재 본인의 예약 된 작업이 어떤 식으로 구성되어있는지 확인해보고 그에 맞게 수정해보는 것도...

루비 온 레일즈 액션 메일러를 이용해 메일 기능 구현하기(Creating mail function by using Ruby on Rails ActionMailer)

이미지
## 루비 온 레일즈 액션 메일러를 이용해 메일 기능 구현하기(Creating mail function by using Ruby on Rails ActionMailer) Ruby on Rails ActionMailer 를 이용해 메일 기능을 구현해보려고합니다. 이 때 준비된 예제가 있으면 좋겠다 싶어 기존 게시글(아래 링크)을 활용해보려고 합니다. 회원가입을 하고나면 회원가입이 되었다고 메일이 오는 경우가 대부분입니다. 이번 예제 또한 회원가입이 정상적으로 완료되면 가입한 이메일 주소로 회원가입 완료에 대한 메일을 보내주는 예제를 해볼까 합니다. 아래 링크를 참고해 쭉 따라하시면 회원가입까지 할 수 있습니다. ### [루비 온 레일즈에서 devise gem 없이 로그인 기능 구현하기 (How to build authentication system without devise gem in Ruby on Rails)](https://ghkdgh2365.blogspot.com/2020/03/devise-gem-how-to-build-authentication.html) 위 링크까지 코딩이 다 되었다는 가정하에, 메일 기능을 구현하겠습니다. 구현 순서는 다음과 같습니다. 1. Action Mailer 와 관련된 파일 등을 구현한다. 2. 보낼 메일 내용을 작성한다. 3. 메일 구현에 필요한 환경설정을 세팅한다. 4. 회원가입을 하고 메일을 받아본다. 그럼 이제 1번부터 시작하겠습니다. 콘솔에 아래와 같이 입력합니다. ```ruby rails generate mailer UserMailer ``` 그럼 아래와 같이 파일들이 생성될 것입니다. ```bash $ rails generate mailer UserMailer create app/mailers/user_mailer.rb invoke erb create app/views/user_mailer invoke test_unit create...