라벨이 개발인 게시물 표시

koyeb(heroku 대체제) 으로 flask 배포하기

이미지
## koyeb 선택 이유 2015년부터 잘 쓰던 heroku(무료 플랜)가 곧 무료 플랜을 종료한다고 해서 대체제를 찾아봤다. fly.io, render.com 등을 확인해봤는데 fly.io 는 카드를 등록해야해서 탈락. render.com 는 괜찮은 것 같았는데 가격 대비 서비스가 미세하게나마 koyeb이 좋아서 선택. CPU 1 / RAM 512 / SSD 5G 가 무료라고 되어 있다. 정확히는 5달러를 주고 저 플랜을 5.4달러에 제공해서 0.4달러를 내야하는 것 같은데... 아래 이미지처럼 되어 있어서 일단 한 달 써보려고 한다. 0.4달러를 내야하면 render.com 로 가면 되니. 배포하는 방법은 별 것 없어서 쓸데없는 말이 길어졌다. ## 배포 방법 아래 이미지대로 쭉 따라하면 된다. 먼저 create app 을 누르고, gunicorn 을 사용하기 때문에 **run command** 에 `gunicorn app:app` 을 작성했다. 만약 python version 을 고정하고 싶다면 추가 작업이 필요하다. `root` directory 에 `runtime.txt` 파일을 추가하고 `python-3.9.15` 라고 명시하면 된다. 해당 작업을 하지 않으면 koyeb이 알아서 파이썬 버전을 정해서 빌드한다. 배포는 이렇게하면 끝이다. 적고 나니까 render.com 도 올려 봐야겠다는 생각이 든다. 뭐가 더 간단하려나.

자바스크립트 spread 문법(JavaScript spread syntax)

## 자바스크립트 spread 문법(JavaScript spread syntax) 자바스크립트 spread 문법은 다음과 같다. ``` let request = { a: "1", b: "2"} console.log(request) // { a: '1', b: '2' } console.log({request}) // { request: { a: '1', b: '2' } } console.log({...request}) // { a: '1', b: '2' } console.log({c: "3", ...request}) { c: '3', a: '1', b: '2' } console.log({...request, c: "3"}) { a: '1', b: '2', c: '3' } ```

AWS CloudWatch와 AWS Lambda를 활용해 AWS EC2 실행, 중지 될 때마다 Slack 메세지 받기(How to receive Slack message using AWS CloudWatch and AWS Lambda when AWS EC2 state is changed)

## AWS CloudWatch와 AWS Lambda를 활용해 AWS EC2 실행, 중지 될 때마다 Slack 메세지 받기(How to receive Slack message using AWS CloudWatch and AWS Lambda when AWS EC2 state is changed) [이 글](https://ghkdgh2365.blogspot.com/2020/12/aws-lambda-aws-cloudwatch-aws-rds-how.html)을 쓴 김에 쓰는 글입니다. AWS EC2 상태가 변경(실행 또는 중지 등)할 때마다 슬랙으로 메세지를 받는 방법에 대해서 작성합니다. 순서는 아래와 같습니다. 1. Slack 설정 2. AWS Lambda 설정 3. AWS CloudWatch 설정 ### 1. Slack 설정 [해당 페이지](http://ghkdgh2365.blogspot.com/2020/12/aws-lambda-aws-cloudwatch-aws-rds-how.html) 1. Slack 설정과 같습니다. ### 2. AWS Lambda 설정 AWS Lambda 에 가서 **함수 생성** 버튼을 클릭하고 **함수 이름**을 적은 뒤 함수를 생성합니다. 저의 경우 **런타임**(사용할 프로그래밍 언어)은 **Python 2.7**로 했습니다. 생성한 뒤 **함수 코드**는 아래와 같이 작성합니다. `'YOUR SLACK URL'` 자리에 Slack 설정 시 확인했던 **Webhook URL** 을 복사해서 붙여넣어주면 됩니다. ``` # -*- coding: utf-8 -*- import json, random import httplib from botocore.vendored import requests def lambda_handler(event, context): slack_url = 'https://hooks.slack.com/services/TBF4TQCQ4/B01GABAKDSP/i...

Amazon RDS 이벤트 알림 규칙(Feat. AWS CloudWatch, Amazon EventBridge)(Amazon RDS event notification rules)

## Amazon RDS 이벤트 알림 규칙(Feat. AWS CloudWatch, Amazon EventBridge)(Amazon RDS event notification rules) AWS Lambda 와 함께 AWS CloudWatch, Amazon EventBridge의 RDS 상태 변경과 관련된 규칙을 사용하고 싶을 때 아래와 같이 설정하면 됩니다. [해당 페이지](https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/USER_Events.html)에서 더 자세히 확인하실 수 있습니다. #### RDS Cluster가 중지됐을 때 ``` { "source": [ "aws.rds" ], "detail-type": [ "RDS DB Cluster Event" ], "detail": { "EventID": [ "RDS-EVENT-0150" ], "EventCategories": [ "notification" ], "SourceType": [ "CLUSTER" ], "SourceArn": [ "arn:aws:rds:ap-northeast-2:xxxxxxxxxxx" # 해당 RDS cluster 의 arn ], "SourceIdentifier": [ "xxxxxxxx" # 해당 RDS cluster 의 DB 식별자 ] } } ``` #### RDS Cluster가 시작됐을 때 ``` { "source": [ "aws.rds...

AWS Lambda와 AWS CloudWatch 이용해서 AWS RDS가 시작 또는 중지되었을 때, 슬랙으로 메시지 받기(How to receive slack message using AWS Lambda and AWS CloudWatch when AWS RDS is started or stopped)

이미지
## AWS Lambda와 AWS CloudWatch 이용해서 AWS RDS가 시작 또는 중지되었을 때, 슬랙으로 메시지 받기(How to receive slack message using AWS Lambda and AWS CloudWatch when AWS RDS is started or stopped) AWS Lambda와 CloudWatchAWS 이용해서 AWS RDS가 시작 또는 중지되었을 때, 슬랙으로 메시지 받는 방법을 소개하려고 합니다. ~~(AWS RDS는 비싸니깐요?)~~ 여기서 가장 중요한 부분은 **AWS CloudWatch 이벤트 생성 규칙**입니다. 따라서 가장 마지막에 적겠습니다. ~~(왜..?)~~ 순서는 다음과 같습니다. 1. Slack 설정 2. AWS Lambda 설정 3. AWS CloudWatch 설정 ### 1. Slack 설정 slack에 들어가 Apps 옆에 있는 **+** 버튼을 클릭합니다. 그 다음 검색창에 **incoming-webhook** 을 검색해 들어간 후 **Add**를 누르고, 새 창이 열리면 **Add to slack** 이라는 버튼을 클릭합니다. 그 다음 메시지를 받기 원하는 채널을 선택한 후 **Add Incoming WebHooks integration** 버튼을 선택하면 끝납니다. 새 페이지에서 **Webhook URL**에 적혀져 있는 링크만 복사해서 보관하고 있으면 끝. 혹시 메시지 알려주는 봇? 의 이름을 바꿔주고 싶다면 조금 더 아래로 내려가서 **Customize Name**을 바꿔주면 됩니다. 그 아래 **Icon** 도 바꾸실 수 있습니다. ### 2. AWS Lambda 설정 AWS Lambda 에 가서 **함수 생성** 버튼을 클릭하고 **함수 이름**을 적은 뒤 함수를 생성합니다. 저의 경우 **런타임**(사용할 프로그래밍 언어)은 **Python 2.7**로 했습니다. 생성한 뒤 **함수 코드**는 아래와 같이 작성합니다. `'YOU...

AWS Lambda + CloudWatch 를 이용해 주기적으로 AWS EC2 중지, 시작하는 방법(How to stop and start AWS EC2 periodically using AWS Lambda + CloudWatch)

## AWS Lambda + CloudWatch 를 이용해 주기적으로 AWS EC2 중지, 시작하는 방법(How to stop and start AWS EC2 periodically using AWS Lambda + CloudWatch) [해당 글](https://ghkdgh2365.blogspot.com/2020/12/aws-lambda-cloudwatch-aws-rds-how-to.html)을 쓴 김에 쓰는 글입니다. ### AWS Lambda + CloudWatch 설정 먼저 크게 1. AWS Lambda 설정 2. IAM 정책 설정, 3. CloudWatch 설정 순으로 나눠서 설정해보자. #### 1. AWS Lambda 설정 AWS 계정은 있다고 가정하고, AWS에 로그인하고 들어가 서비스에서 **AWS Lambda** 를 클릭한다. 그 다음 **함수 생성**을 클릭. **새로 작성** 을 선택하고(그대로 두고) **함수 이름** 을 작성합니다. 런타임(사용할 언어)의 경우 여기선, Python 2.7로 하겠습니다. 그리고 **권한**은 그대로 **기본 Lambda 권한을 가진 새 역할 생성** 으로 두고 **함수 생성**을 클릭합니다. 생성이 되면 생성된 함수에 들어가 코드를 삽입합니다. **함수 코드**는 다음과 같이 삽입합니다. 아래의 코드는 EC2를 중지하는 코드입니다. ``` import boto3 region = 'ap-northeast-2' # EC2가 존재하는 region instances = ['i-0dd344443184503fa'] # EC2 Instance id def lambda_handler(event, context): ec2 = boto3.client('rds', region_name=region) ec2.stop_instances(InstanceIds=instances) print 'stopped your EC2...

AWS Lambda + CloudWatch 를 이용해 주기적으로 AWS RDS 중지, 시작하는 방법(How to stop and start AWS RDS periodically using AWS Lambda + CloudWatch)

이미지
## AWS Lambda + CloudWatch 를 이용해 주기적으로 AWS RDS 중지, 시작하는 방법(How to stop and start AWS RDS periodically using AWS Lambda + CloudWatch) 가끔씩 사용하는 **AWS EC2 + RDS** 가 있다. 그래서 평소에는 중지해놓고, 필요할 때만 실행시키고 싶은데 **RDS** 가 문제다. 왜 그런지는 모르겠는데~~(AWS가 돈을 많이 벌고 싶어서 인 것 같은데... 왜 그런지 아시는 분은 알려주세요...)~~ 중지 후 7일마다 스스로 시작이 된다. 그래서 깜빡하고 나면 비싸도 너무 비싼 RDS 요금이 왕창 나온다. 그래서 매 주 미리 알림을 맞춰놓고, 콘솔에 들어가 중지를 하는데 가끔씩 까먹기도 하고, 너무 귀찮기도 해서 나를 대신할 방법을 찾아봤다. 크게 방법이 2가지 있는데, 아래와 같다. 1. [AWS Instance Scheduler](https://aws.amazon.com/ko/solutions/implementations/instance-scheduler/) 를 이용하는 방법 2. AWS Lambda + CloudWatch 를 이용하는 방법 그런데 검색해보니 1번 방법은 적어도 5달러 이상 나올 것 같아서, 2번 방법으로 시도해봤다.~~(내 돈은 아니지만 5달러도 아까ㅇ...)~~ 서두가 길었는데, 이제 AWS Lambda + CloudWatch 를 이용해 주기적으로 AWS RDS 중지, 시작하는 방법을 알아보자. ### AWS Lambda + CloudWatch 설정 먼저 크게 1. AWS Lambda 설정 2. IAM 정책 설정, 3. CloudWatch 설정 순으로 나눠서 설정해보자. #### 1. AWS Lambda 설정 AWS 계정은 있다고 가정하고, AWS에 로그인하고 들어가 서비스에서 **AWS Lambda** 를 클릭한다. 그 다음 **함수 생성**을 클릭. **새로 작성** 을 선택하고(그대...

ssh gitlab 접속 시 permission denied 오류 해결 방법

터미널에서 아래 명령어로 로그인해준다. ``` ssh -T git@gitlab.xxxxxx.yyy ``` 참고 사이트 https://forum.gitlab.com/t/permission-denied-publickey/29670/7

AWS EC2 ubuntu 18.04 에 Python3, pip3, opencv, requests 설치 방법(How to install Python3, pip3, opencv, requests in AWS EC2 ubuntu 18.04)

## AWS EC2 ubuntu 18.04 에 Python3, pip3, opencv, requests 설치 방법 2020년 5월경 만든 AWS EC2 ubuntu 18.04에 Python3, pip3, opencv-python, requests를 설치해봤습니다. 기본적으로 Python2.7.17, Python3.6.9가 깔려있었습니다. 버전 확인은 아래와 같이 합니다. ``` python -V ``` Python3의 경우엔 ``` python3 -V ``` `pip3` 설치는 아래와 같이 합니다. ``` sudo apt-get install python3-pip ``` `pip3`을 정상적으로 설치되었으면, 아래와 같이 `opencv-python`를 설치합니다. ``` pip3 install opencv-python ``` opencv-python 설치 도중, `ModuleNotFoundError: No module named 'skbuild'` 라는 오류가 났습니다. 검색 후 아래와 같은 해결 방법으로 해결했습니다. ``` pip3 install --upgrade pip ``` 그 다음 아래와 같은 명령어로 설치가 되었는지 확인합니다. ``` python3 -c "import cv2; print(cv2.__version__)" ``` 만약 오류가 나는 경우, apt로 python3-opencv 설치를 해줍니다 ``` sudo apt update sudo apt install python3-opencv ``` 그 다음 다시 확인해보면 설치된 버전을 확인할 수 있습니다. `requests` 의 경우엔 아래와 같이 설치하는데 이미 깔려있다고 알려줍니다. ``` pip3 install requests ``` #### 참고 사이트 https://yuddomack.tistory.com/entry/%EC%B2%98%EC%9D%8C%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%9...

URL 파라미터를 인코드하는 방법 (How to encode URL parameter in JavaScript)

# URL 파라미터를 인코드하는 방법 (How to encode URL parameter in JavaScript) ''%%%" 라는 파라미터를 넣었더니, invalid query parameter 라는 에러가 발생. 해결하기 위해서 방법을 찾아봤습니다. 스택 오버 플로우에서 여러 해답을 볼 수 있었는데, 그 중에 눈에 띄는 것이 크게 2개였습니다. ## encodeURI(), encodeURIComponent() 함수 사용 encodeURI(), encodeURIComponent() 와 같은 함수를 사용해서 uri의 특정한 문자를 UTF-8로 인코딩해줍니다. ``` console.log(encodeURIComponent('test?')) // output: "test%3F" ``` ## URLSearchParams() 사용 toString()과 함께 사용해 URL의 쿼리 문자열을 반환할 수 있습니다. ``` let params = {} params['online'] = "true" params['age'] = '20s' params['query'] = '!@#$%' console.log(new URLSearchParams(params).toString()) // output: "online=true&age=20s&query=%21%40%23%24%25" ```

레일즈에서 여러 개의 db records를 한 번에 수정하고 싶다면? update_all 을 쓰자 ! (How to update db records at once in Ruby on Rails)

## 레일즈에서 여러 개의 db records를 한 번에 수정하고 싶다면? update_all 을 쓰자 ! (How to update db records at once in Ruby on Rails) 만약 `User` 라는 모델이 있고, `loginname`, `name`, `role` 라는 `column` 이 있다고 가정한 후 example 을 봅시다. 모든 user 의 role 을 "customer" 로 변경해봅시다. 아래와 같이 하면 끝! ``` User.update_all(role: "customer") ``` 이럴 일이 있을지는 모르겠지만, loginname 을 name 으로 모두 바꿔야한다면? ``` User.update_all('name = loginname') ``` 너무 간단하죠? 다만 Active Record callbacks 또는 validations 이 트리거되지 않기 때문에(예를 들어 user를 update하는 경우 무엇을 한다. 또는 user를 update할 때 무엇을 validation 한다.) 이 점을 참고해야해요 ! 또, callbacks 이 트리거되지 않아서 updated_at, updated_on column 들이 자동적으로 update되지 않는다는 점을 참고해야해요 !

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

## 루비 온 레일즈에서 devise gem 없이 로그인 기능 구현하기 4, 마지막 (How to build authentication system without devise gem in Ruby on Rails) 쿠키, 세션을 이용해 로그인 기능을 구현해봤습니다.([지난 포스트 참고](http://ghkdgh2365.blogspot.com/2020/07/devise-gem-3-how-to-build.html)) 이번엔 JWT(JSON Web Token)를 이용해 로그인을 구현하겠습니다. 구현 방법은 로그인 요청이 왔을 때, 로그인에 성공하면 서버에서 토큰을 생성한 뒤 클라이언트(브라우저)에게 전달합니다. 이후 클라이언트가 유저에 대한 정보를 요청해야할 때, 받은 토큰을 가지고 서버에 요청해 서버가 토큰 정보를 통해 해당 유저에 대한 정보를 제공합니다. 참고로 로드밸런싱처럼 서버를 확장하거나, 모바일 앱에서 인증을 확인하는데 있어서, 이전 방법보다 JWT가 훨씬 유용하기 때문에, JWT를 이용한 로그인을 많이 사용하고 있는 추세입니다. 그럼 이제 JWT를 이용해 로그인을 구현해보도록 하겠습니다. `개발환경 Ruby 2.7.0 / Rails 6.0.2.2` JWT을 만들기 위해 gem 을 설치하겠습니다. `Gemfile` 파일에 아래와 같이 추가합니다. ``` # JWT 생성 및 사용 gem 'jwt' ``` 추가했다면 저장하고 터미널에 아래와 같이 명령어를 실행합니다. ``` bundle install ``` 설치가 끝나면 `lib` 디렉토리에 가서 `json_web_token.rb` 이라는 파일을 만들고 아래와 같이 코드를 입력해줍니다. 생성된 JWT를 해석할 때 사용됩니다. ``` class JsonWebToken def self.decode(token) return HashWithIndifferentAccess.new(JWT.decode(token, Rails.application.credentials.secret...

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

## 루비 온 레일즈에서 devise gem 없이 로그인 기능 구현하기 3 (How to build authentication system without devise gem in Ruby on Rails) [지난 포스트](https://ghkdgh2365.blogspot.com/2020/07/devise-gem-2-how-to-build.html) 에서 쿠키(Cookie)를 이용한 로그인, 로그아웃을 구현했습니다. 이번에는 세션을 이용한 로그인, 로그아웃을 구현하겠습니다. 차이점은 다음과 같습니다. 쿠키를 이용했을 때는 사용자 브라우저에 아이디, 비밀번호를 저장하고 이를 서버에 보내서 검증했다면, 세션을 이용할 때에는 서버에서 검증에 필요한 정보를 저장한 뒤 그 정보를 사용자 브라우저에게 보내주고, 다시 그 정보를 서버에 보내 검증한다는 점이 차이점입니다. 아래 구현 방법을 보시면서 차이점을 확인해보면 이해가 더 잘 될 것입니다. #### 3. 세션을 이용한 로그인 세션을 이용한 로그인, 로그아웃 구현을 위해 새로운 컨트롤러를 생성합니다. `rails g controller session` 으로 생성하거나, 직접 디렉토리(`controllers`)에 파일(`sessions_controller.rb`)을 만들어도 됩니다. 만들고 나면 `controller/sessions_controller.rb` 파일이 생성되고 아래와 같은 코드가 보일 것입니다. ``` class SessionsController 세션 로그인 ``` 확인이 되었으면 `home/index.html.erb` 에 아래와 같이 추가합니다. ``` Hello World ! ``` 이제 로그인 화면이 생겼으니 로그인할 수 있도록 `controllers/sessions_controller.rb` 에 가서 아래와 같이 입력합니다. ``` def create if params[:email].pr...

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

이미지
## 루비 온 레일즈에서 devise gem 없이 로그인 기능 구현하기 2 (How to build authentication system without devise gem in Ruby on Rails) ##### 회원가입이 되었으니 로그인 기능을 만들어보도록 하겠습니다. 혹시나 회원가입 파트가 필요한 분은 아래 링크에 들어가 확인해보시기 바랍니다. [루비 온 레일즈에서 devise gem 없이 로그인 기능 구현하기 - 회원가입](https://ghkdgh2365.blogspot.com/2020/03/devise-gem-how-to-build-authentication.html) 추가적으로 회원가입 후 축하 이메일 기능을 구현하고 싶은 분은 아래 링크에 들어가 확인해보시기 바랍니다. [루비 온 레일즈 액션 메일러를 이용해 메일 기능 구현하기](https://ghkdgh2365.blogspot.com/2020/05/creating-mail-function-by-using-ruby-on.html) --- #### 2. 쿠키를 이용한 로그인 먼저 로그인 화면이 필요하겠죠? 먼저 `controllers` 폴더에 `cookie_controller.rb` 파일을 만들어줍니다. 그 다음 아래와 같이 작성합니다. ``` class CookieController 로그인 ``` 그 다음 `routes.rb` 파일에 가서 아래 같이 입력해줍니다. ``` get 'cookie/new' ``` 이제 `localhost:3000/cookie/new` 로 브라우저에 들어가보면 로그인 화면이 보입니다. 만약 안보인다면 코드를 다시 한 번 보시고, 서버가 켜졌는지 확인해보세요.(만약 서버가 꺼져있다면, 커맨드 창에 `rails s` 를 입력해주시면 서버가 켜집니다.) 편의를 위해 로그인 화면으로 가는 링크를 만듭니다. ``` Hello World ! ``` 그 다음, 로그인 버튼을...

리액트 네이티브 모바일 키보드에서 다음 버튼으로 포커스(커서) 이동시키는 방법(How to make focus(cursor) move by using next button of mobile keyboard in React Native)

## 리액트 네이티브 모바일 키보드에서 다음 버튼으로 포커스(커서) 이동시키는 방법(How to make focus(cursor) move by using next button of mobile keyboard in React Native) 예를 들어, 모바일 로그인 화면에서 아이디를 입력하고 비밀번호를 입력해야 할 때, 키보드에서 다음 버튼을 누르면 비밀번호 입력칸으로 이동하게끔 만들려면 아래와 같이 하면 된다. ``` {this.passwordInput.focus();}} bulrOnSubmit={false} /> { this.passwordInput = input; }} /> ``` 참고 : https://stackoverflow.com/questions/32748718/react-native-how-to-select-the-next-textinput-after-pressing-the-next-keyboar

Rails.ajax 를 사용해서 POST Request 보내고 레일즈 Controller에서 받는 방법(How to request and receive POST request by using Rails.ajax at Ruby on Rails)

## Rails.ajax 를 사용해서 POST Request 보내고 레일즈 Controller에서 받는 방법(How to request and receive POST request by using Rails.ajax at Ruby on Rails) 레가시 코드가 Rails.ajax를 사용하고 있어, Rails.ajax로 새로운 function 을 만들어 사용하려고 했는데, POST의 경우 data가 잘 넘어가지 않았다. 정확히 말하면, data 형태가 object 형태로 전송되어 Rails 쪽에서 데이터 처리를 할 수 없었다. 그래서 방법을 찾아본 결과 데이터형태를 FormData 형태로 변환한 뒤 보내니, 원하는 JSON 형태로 받을 수 있었다. 자세한 방법은 다음과 같다. ``` //some.js let hashData = {"one": 1, "two": 2, "three": 3} let someData = new FormData() someData.append("data", JSON.stringify(hashData)) Rails.ajax({ url: '/something', type: 'POST', data: someData, success: function(response) { console.log(response) } }) ``` 위와 같이 보내고 싶은 데이터를 FormData 객체에 append 로 JSON.stringify 함수로 변환해 넣으면 된다. Rails Controller에서는 다음과 같이 받아서 사용하면 된다. ``` # some_controller.rb data = JSON.parse(params["data"]) ``` 출처: stackoverflow 에서 참고한건데 다시 찾으려니 못찾겠음..ㅠ

리액트 네이티브에서 style 을 조건에 따라 적용하는 법 (How to apply style with conditional in React Native)

## 리액트 네이티브에서 style 을 조건에 따라 적용하는 법 (How to apply style with conditional in React Native) 최근 리액트 네이티브 프로젝트에 참가하게 됐다. JavaScript 를 자주 쓰진 않아 상당히 어색하지만, 빠르게 적응하려고 노력 중이다. 작업 중 React Native에서 Style을 조건에 따라서 적용해야 하는 상황이 있었는데 다음과 같이 처리할 수 있다. ``` return ( Great! ) const styles = StyleSheet.create({ yellowContainer: { backgroundColor: '#fff000' }, greenContainer: { backgroundColor: '#08d13b' }, }) ```

루비 온 레일즈 프로덕션 환경에서 컨트롤러 변수들을 확인하는 방법(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 파...