csv 파일을 pandas의 데이터프레임으로 변환할 때는 pandas의 read_csv 함수를 사용하면 변환할 수 있습니다. 그런데, 다음과 확장자가 없는 파일도 read_csv 함수로 읽을 수 있습니다.

이 문서는 단어 사이가 tab으로 구분되어 있습니다. 따라서, delimiter(구분자)를 `\t`으로 설정해줘야 합니다.
```
import pandas as pd
file = pd.read_csv('test', delimiter = '\t')
print(file)
```
데이터프레임으로 잘 변환된 것을 확인할 수 있습니다.

Kyohoon Sim
posted at
2023-04-18 11:00:26
vscode에서도 Remote - SSH 익스텐션을 활용하면 쉽게 ssh 접속이 가능합니다.
1) 먼저, remote - ssh 익스텐션을 설치하세요.
2) 그 다음에는 F1 키를 누른 다음 검색창에 ssh를 입력하면 나오는 `Remote-SSH: Open SSH Configuration File...`을 클릭합니다.
3) 접속하고자 하는 원격 서버 정보를 입력합니다.
```
Host [alias]
HostName [ip 주소]
User [유저명]
Port [포트번호]
IdentityFile [pem키 위치]
```

4) Remote Explorer를 클릭한 후 원격 서버 IP 주소에 마우스 커서를 올리면 나오는 화살표 버튼 또는 새창 버튼을 클릭하면 해당 서버에 SSH 연결이 됩니다.

이제 신나게 개발을 하시면 됩니다.
Kyohoon Sim
posted at
2023-04-17 16:41:31
API 서버에 어떤 것을 요청하면 보통 JSON의 형태로 응답을 받습니다.
오늘은 JSON 내 배열에서 특정 키의 값으로 배열을 만드는 방법에 대해 살펴보도록 하겠습니다.
## JSON 내 배열에서 특정 키의 값으로 배열 만드는 방법
우선 다음과 같은 JSON 데이터가 있다고 가정하겠습니다.
```
var a = {
"page_views":[
{"date":"2023-04-10", "views":2050},
{"date":"2023-04-11", "views":3123},
{"date":"2023-04-12", "views":4321},
{"date":"2023-04-13", "views":918},
{"date":"2023-04-14", "views":5444}
]
};
```
여기서 page_views 내 date 값들로만 배열을 만들려면 다음과 같이 코드를 작성하면 됩니다.
```
var date = a.page_views.map(function(e) {return e.date;});
```

이번에는 views 값들로만 배열을 만들어보겠습니다.
```
var views = a.page_views.map(function(e) {return e.views;});
```

chart.js 등으로 각종 chart를 그릴 때 이런 식으로 변환할 일들이 있어서 정리해봤습니다.
Kyohoon Sim
posted at
2023-04-17 09:04:32
javascript에서 문자열 중 일부만 잘라서 선택하고 싶을 때는 `slice()` 메소드를 사용할 수 있습니다.
"심교훈입니다"라는 문자열이 있다고 가정하겠습니다. 이 중 "심교훈"만 잘라내고 싶다면, 다음과 같이 0, 3을 인수로 넣어주면 됩니다. 첫번째 인수는 begin 인덱스를 두번째 인수는 end 인덱스(end 미포함)를 뜻합니다.

위 예시들을 통해 `slice()` 메소드를 어떻게 사용하는지 충분히 이해하셨을 것이라 생각합니다.
### 참고자료
[1] [https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/slice](https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/slice)
Kyohoon Sim
posted at
2023-04-16 22:51:54
javascript에서 숫자를 소수점 아래 두번째 자리까지 반올림하고 싶다면, toFixed() 메소드를 사용할 수 있습니다.
```
숫자.toFixed(2)
```

주의할 것은 반올림한 결과는 문자열이라는 점입니다.
Kyohoon Sim
posted at
2023-04-14 19:32:31
python의 pandas 데이터프레임을 활용하여 피어슨 상관계수를 구하는 방법에 대해 살펴보겠습니다.
df라는 이름의 데이터프레임에 col1이라는 컬럼과 col2라는 컬럼이 있다고 할 때, 피어슨 상관계수는 다음과 같이 구할 수 있습니다.
```
corr = df['col1'].corr(df['col2'], method='pearson')
```
참고로 상관계수는 절대값으로 1에 가까울 수록 두 변수 간에 상관성이 강한 것이고, 0에 가까울 수록 상관성이 약한 것입니다.
Kyohoon Sim
posted at
2023-04-14 19:20:06
웹 사이트 또는 API 서버를 개발 중이라면, 이 사이트가 얼마나 많은 트래픽을 동시에 처리할 수 있는지 확인해보는 것이 좋습니다. 그래야 어느 정도의 트래픽을 감당할 수 있는지 예상을 할 수 있고, 그에 맞는 서버 스펙을 선정할 수 있기 때문입니다.
오늘은 wrk라는 툴로 부하 테스트하는 방법에 대해 살펴보겠습니다. wrk는 단일 멀티코어 CPU에서 실행할 때 상당한 부하를 생성할 수 있는 최신 HTTP 벤치마킹 도구입니다[1].
## wrk 설치하기
먼저 wrk를 리눅스 서버에 설치하도록 하겠습니다. 다음 명령을 순차적으로 실행하세요.
1. sudo apt install make gcc unzip git libssl-dev
2. git clone https://github.com/wg/wrk.git
3. cd wrk
4. make
5. sudo cp wrk /usr/local/bin
## get 부하테스트
get 요청을 받을 수 있는 엔드포인트에 부하테스트를 해보겠습니다. 현재 여러분이 이용하고 계시는 asksim.co.kr에 해보겠습니다. 다음과 같은 명령을 실행하시면 됩니다.
```
wrk https://asksim.co.kr
```

이 엔드포인트는 초당 974개의 요청을 처리할 수 있음을 확인할 수 있습니다. 10초간 2개의 쓰레드, 10개의 connection을 연 상태로 테스트를 한 결과입니다.
테스트 시간과 사용할 쓰레드 개수와 열어둘 connection의 개수를 지정하고 싶다면, 다음과 같이 옵션을 추가해서 명령을 날리면 됩니다. 이번에는 로그인 엔드포인트에 부하테스트를 하겠습니다.
10 쓰레드, 100 connection, 30초
```
wrk -t10 -c100 -d30s https://asksim.co.kr/auth/login
```

wrk에서 사용할 수 있는 전체 옵션들은 다음과 같습니다[1].
```
-c, --connections: total number of HTTP connections to keep open with
each thread handling N = connections/threads
-d, --duration: 테스트 기간, e.g. 2s, 2m, 2h
-t, --threads: 사용할 쓰레드 총 개수
-s, --script: LuaJIT 스크립트 사용할 시 파일 경로 앞에 붙여줌
-H, --header: 요청에 붙일 HTTP 헤더, e.g. "User-Agent: wrk"
--latency: 상세한 latency 통계 출력
--timeout: record a timeout if a response is not received within
this amount of time.
```
## post 부하테스트
이쯤이면 wrk로 post 요청을 받는 엔드포인트에 어떻게 부하테스트를 할 수 있을지 궁금하실 것입니다. lua라는 파일 확장자를 가진 파일(LuaJIT 스크립트)을 하나 작성해줘야 합니다.
post.lua라는 스크립트를 하나 만들고(파일명은 post가 아닌 다른 거라도 상관없습니다), 그 안에 다음과 같은 내용을 작성합니다. 여러분의 상황에 맞는 내용을 담으시면 됩니다.
```
wrk.method = "POST"
wrk.headers["content-type"] = "application/json"
wrk.body = '{"key1": "value1", "key2": "value2"}'
```
그 다음에 다음과 같은 명령을 수행하면 POST 요청으로 부하 테스트를 할 수 있습니다.
```
wrk -t10 -c100 -d30s http://localhost:8001/test -s post.lua
```
### 참고자료
[1] [https://github.com/wg/wrk](https://github.com/wg/wrk)
Kyohoon Sim
posted at
2023-04-04 09:17:08
마크다운을 html 요소에 적용하고 싶을 때 사용할 수 있는 자바스크립트 라이브러리 중에 제가 사용해본 것은 [marked.js](https://github.com/markedjs/marked), [simplemde.js](https://simplemde.com/)입니다. 현재 이 사이트에는 simplemde.js를 활용하여 마크다운을 적용했습니다.
오늘은 marked.js를 활용하여 마크다운을 html 요소에 적용하는 방법에 대해 살펴보도록 하겠습니다.
## marked.js 사용법
test라는 아이디를 가진 div 요소가 있다고 하면, 다음과 같이 html 문서를 작성하면 해당 요소에 마크다운이 적용됩니다.
```
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="test"></div>
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<script>
document.getElementById('test').innerHTML =
marked.parse('# 제목\n\n안녕하세요. **bskyvision**입니다.\n\n[bskyvision](https://bskyvision.com)에 놀러오세요.\n\n```print("hello world")```');
</script>
</body>
</html>
```
`marked.min.js`를 임포트하여 marked.parse() 함수를 통해서 마크다운을 적용하였습니다.
결과적으로 다음과 같은 html 문서가 렌더링 됩니다.

Kyohoon Sim
posted at
2023-03-31 21:08:46
유저의 비밀번호를 암호화할 때는 단방향 해시 함수를 많이 사용합니다. 단방향이기 때문에 암호화는 가능하지만 복호화는 불가능합니다.
단방향 해시 함수 중에 많이 사용하는 알고리즘이 `sha256`입니다.
1) sha은 `secure hash algorithm`의 약어입니다.
2) 256이 붙은 이유는 암호화된 결과가 256비트로 구성되기 때문입니다. 64자리의 16진수 문자열이 반환됩니다. 16진수 1자리는 4비트를 차지합니다. 이진수 0000부터 1111까지가 16진수로 0~F이기 때문입니다.
파이썬에서 sha256 알고리즘으로 암호화를 하고 싶을 때는 `hashlib` 모듈을 사용할 수 있습니다. 표준 라이브러리이기 때문에 별도의 설치가 필요하지 않습니다. test1234 라는 비밀번호를 sha256 알고리즘으로 암호화해보겠습니다.
```
import hashlib
pw = b"test1234"
m = hashlib.sha256()
m.update(pw)
hashed_pw = m.hexdigest()
print(hashed_pw)
```
test1234라는 문자열은 결과적으로 다음과 같이 암호화됩니다.
```
937e8d5fbb48bd4949536cd65b8d35c426b80d2f830c5c308e2cdec422ae2244
```
Kyohoon Sim
posted at
2023-03-31 13:52:42
# http 클라이언트 프로그램 httpie 사용법 정리
FastAPI, Flask 등으로 API 서버를 개발하고 있다면, 요청에 대해 API 서버가 어떻게 응답하는지 계속해서 테스트해야 합니다. 그때 사용할 수 있는 대표적인 CLI 프로그램에는 curl이 있습니다. 오늘은 저 개인적으로 curl보다 사용법이 간단하다고 생각되는 HTTPie를 소개해드리도록 하겠습니다. HTTPie는 보통 `에이치티티파이`라고 부릅니다.
우선 HTTPie를 pip로 설치하려면 다음 명령을 실행하시면 됩니다.
```
pip install httpie
```
## get 요청
만약 get 요청을 날리면 pong을 응답해주는 `/ping`이라는 엔드포인트가 있다면, 다음과 같이 명령을 작성하시면 됩니다.
```
http -v GET localhost:5000/ping
```
헤더에 Access Token을 담아서 요청을 해야한다면, 다음과 같이 Authorization 헤더를 추가해줘야 합니다.
```
http -v GET localhost:5000/ping Authorization: "Bearer accesstoken"
```
## post 요청
id, password를 body에 담아서 post 요청을 던지면 회원가입을 수행하는 `/sign-up`이라는 엔드포인트가 있다고 가정한다면, 다음과 같이 명령을 작성하면 됩니다.
```
http -v POST localhost:5000/sign-up id=testid password=testpw1234
```
## 참고자료
[1] [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization)
[2] [https://bskyvision.com/entry/http-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-httpie%EC%99%80-postman-%EC%86%8C%EA%B0%9C](https://bskyvision.com/entry/http-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-httpie%EC%99%80-postman-%EC%86%8C%EA%B0%9C)
Kyohoon Sim
posted at
2023-03-31 12:34:12