팀뷰어로 원격 pc를 제어하려면
host PC에 teamViewer host를 설치해야한다. (라이선스 있다고 눌러야 뜨네요)
참고링크: https://m.blog.naver.com/terry_daddy/223284278249
팀뷰어로 원격 pc를 제어하려면
host PC에 teamViewer host를 설치해야한다. (라이선스 있다고 눌러야 뜨네요)
참고링크: https://m.blog.naver.com/terry_daddy/223284278249
file2를 file1Copied에 붙여서 2개파일을 합치는 명령어.
brew install coreutils를 한후,
$gdd if=file2.bin of=file1Copied.bin bs=1M oflag=append conv=notrunc
[array]
리턴하는 함수들: split,map, join(문자열 리턴)
예제:
const toCamelCase = (templCode) => {
return templCode
.toLowerCase() // 전체를 소문자로 변환
.split('_') // "_" 기준으로 분할
.map((word, index) =>
index === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1) // 첫 단어는 소문자 유지, 이후 단어는 첫 글자만 대문자
)
.join(''); // 배열을 문자열로 합침
}
특이함수: slice - 문자열/array 모두 동작.
const str = "JavaScript";
console.log(str.slice(5)); // "cript" (start만 입력하면 끝까지)
console.log(str.slice(0, 4)); // "Java"
console.log(str.slice(-6, -3)); // "Scr" (음수 인덱스 사용 가능)
- slice와 splice 차이점
( 원본 배열 변경 여부, 반환값, 주요 용도 로 비교)
.splice() | ✅ 원본 배열을 변경함 | 삭제된 요소를 배열로 반환 | 요소 추가, 삭제, 교체 |
.slice() | ❌ 원본 배열을 변경하지 않음 | 새로운 배열 반환 | 배열의 일부 복사 |
[splice 사용예제]
const index = users.findIndex(user => user.id === 2);
if (index !== -1) {
users.splice(index, 1); // 삭제
}
[Object]:json
let obj = {a:1, b:2, c:3};
[Set]
let mySet = new Set([1,2]);
let newSet = mySet.add(5); //[1,2,5]; 리턴하는 함수, mySet자체도 바꿈.
mySet.delete(2); //[1,5]; //리턴없는 함수
const mySet = new Set([1, 2, 3, 4, 5]);
const arr = Array.from(mySet);
console.log(arr); // [1, 2, 3, 4, 5]
[String] javascript도 java처럼 immutable이라서,
customGPT모델은 openAPI로 호출이 안되는 현상이 있네요.
그래서 자체훈련을 시키려면 fine-tuning모델이 맞고,
아래와 같이 생성하면 됩니다.
OpenAI에서 Fine-Tuning 모델을 생성하는 과정을 처음부터 끝까지 단계별로 설명하겠습니다. 🚀
Fine-Tuning을 통해 GPT-3.5 Turbo 또는 GPT-4를 특정한 스타일, 문체, 데이터에 맞게 최적화할 수 있습니다.
Fine-Tuning이란 기존 OpenAI 모델(GPT-3.5-Turbo, GPT-4)을 사용자의 특정 데이터에 맞춰 재훈련하는 과정입니다.
✅ 사용 사례:
Fine-Tuning을 하려면 OpenAI API 키가 필요합니다.
Fine-Tuning을 하려면 **훈련 데이터(training data)**를 만들어야 합니다.
OpenAI는 JSONL(JSON Lines) 형식의 데이터를 요구합니다.
Fine-Tuning 데이터는 "messages" 형식으로 작성됩니다.
(json형식 예제)
{"messages": [
{"role": "system", "content": "너는 친절한 금융 상담사야."},
{"role": "user", "content": "대출 금리가 어떻게 되나요?"},
{"role": "assistant", "content": "현재 대출 금리는 연 3.5%입니다."}
]}
jsonl형식.필요
{"messages": [{"role": "system", "content": "너는 친절한 채권 전문가야."}, {"role": "user", "content": "채권 회수 절차가 어떻게 되나요?"}, {"role": "assistant", "content": "채권 회수 절차는 1) 채무자 연락 2) 독촉장 발송 3) 법적 조치 순으로 진행됩니다."}]}
{"messages": [{"role": "system", "content": "너는 친절한 채권 전문가야."}, {"role": "user", "content": "부실채권을 매각할 수 있나요?"}, {"role": "assistant", "content": "네, 부실채권은 채권 매입 기관을 통해 매각할 수 있습니다."}]}
📌 JSONL 파일을 만들고, .jsonl 확장자로 저장해야 합니다.
OpenAI API를 사용하여 준비한 JSONL 파일을 업로드합니다.
curl -X POST "https://api.openai.com/v1/files" \
-H "Authorization: Bearer YOUR_OPENAI_API_KEY" \
-H "Content-Type: multipart/form-data" \
-F "file=@training_data.jsonl" \
-F "purpose=fine-tune"
응답예시:
{
"id": "file-abc123",
"object": "file",
"bytes": 12345,
"created_at": 1700000000,
"filename": "training_data.jsonl",
"purpose": "fine-tune"
}
✅ "id" 값을 저장 (file-abc123) → Fine-Tuning을 수행할 때 사용됩니다.
이제 Fine-Tuning을 실행하여 맞춤형 모델을 학습시킵니다.
curl -X POST "https://api.openai.com/v1/fine_tuning/jobs" \
-H "Authorization: Bearer YOUR_OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-3.5-turbo",
"training_file": "file-abc123",
"hyperparameters": {
"n_epochs": 3
}
}'
응답 예시:
{
"id": "ftjob-xyz789",
"object": "fine_tuning.job",
"model": "gpt-3.5-turbo",
"training_file": "file-abc123",
"status": "running",
"created_at": 1700000000
}
✅ "id" (ftjob-xyz789)가 Fine-Tuning 작업의 ID입니다.
✅ 훈련이 완료되면 새로운 모델 ID가 생성됩니다.
Fine-Tuning이 얼마나 진행되었는지 확인하려면 아래 명령어를 실행합니다.
curl -X GET "https://api.openai.com/v1/fine_tuning/jobs/ftjob-xyz789" \
-H "Authorization: Bearer YOUR_OPENAI_API_KEY"
응답 예시:
{
"id": "ftjob-xyz789",
"status": "succeeded",
"fine_tuned_model": "ft:gpt-3.5-turbo:your-org:custom-model"
}
✅ Fine-Tuning이 완료되면 "fine_tuned_model" 값이 생성됩니다.
✅ "ft:gpt-3.5-turbo:your-org:custom-model"이 새로운 모델 ID입니다.
Fine-Tuning이 완료되면 새로운 모델 ID를 사용하여 API 호출이 가능합니다.
curl https://api.openai.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "ft:gpt-3.5-turbo:your-org:custom-model",
"messages": [{"role": "user", "content": "채권 회수 절차가 어떻게 되나요?"}],
"temperature": 0.7
}'
📌 Fine-Tuned 모델이 기존 GPT-3.5보다 더 정확하게 원하는 답변을 생성합니다.
Fine-Tuning 모델을 더 이상 사용하지 않으려면 삭제할 수 있습니다.
📌 이 작업은 영구적이므로 주의해야 합니다.
✅ 1) JSONL 형식으로 Fine-Tuning 데이터 준비
✅ 2) API를 사용하여 JSONL 파일 업로드 (/v1/files)
✅ 3) Fine-Tuning 실행 (/v1/fine_tuning/jobs)
✅ 4) 모델 학습이 완료되면 Fine-Tuning 모델 ID 확인
✅ 5) Fine-Tuned 모델을 API에서 호출하여 사용
✅ 6) 필요할 경우 Fine-Tuned 모델 삭제 가능
Custom GPT를 설정하려면 OpenAI 플랫폼에서 새로운 Custom GPT를 생성해야 합니다.
Custom GPT는 OpenAI의 Guided Setup을 통해 설정할 수 있습니다.
이 과정에서는 GPT의 성격, 역할, 학습 데이터, API 기능 설정을 조정할 수 있습니다.
Custom GPT의 동작 방식을 정의하는 가장 중요한 과정입니다.
✅ 사용자가 Custom GPT에 대한 추가 정보를 제공할 수도 있습니다.
예시:
Custom GPT는 API 호출 및 외부 도구(Functions)와 연동할 수도 있습니다.
예제:
{
"name": "채권 회수 API",
"description": "고객의 채권 정보를 조회하고 법률 절차를 안내합니다.",
"parameters": {
"채권자명": {
"type": "string",
"description": "채권자의 이름"
},
"채무자명": {
"type": "string",
"description": "채무자의 이름"
}
}
}
이 기능을 활용하면 API를 직접 호출하여 최신 정보를 제공하는 Custom GPT를 만들 수 있습니다.
Custom GPT를 OpenAI API에서 사용하려면, API에서 model 값을 Custom GPT ID로 변경하면 됩니다.
import okhttp3.*;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.IOException;
@Service
public class OpenAICustomService {
private static final String API_URL = "https://api.openai.com/v1/chat/completions";
private final OkHttpClient client = new OkHttpClient();
@Value("${openai.api.key}")
private String apiKey;
@Value("${openai.custom.gpt.id}") // Custom GPT ID (예: gpt-4-custom-XXXXX)
private String customGptId;
public String getCustomGptResponse(String userInput) throws IOException {
String json = "{"
+ "\"model\":\"" + customGptId + "\","
+ "\"messages\":[{\"role\":\"user\",\"content\":\"" + userInput + "\"}],"
+ "\"temperature\":0.7"
+ "}";
RequestBody body = RequestBody.create(json, MediaType.get("application/json"));
Request request = new Request.Builder()
.url(API_URL)
.header("Authorization", "Bearer " + apiKey)
.header("Content-Type", "application/json")
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(response.body().string());
return rootNode.get("choices").get(0).get("message").get("content").asText();
}
}
}
✅ 설정 완료 후 API에서 Custom GPT를 호출하면, 사전에 설정한 역할, 동작 방식, 지식 등을 반영한 응답을 반환합니다.
✅ OpenAI API에서 Custom GPT를 사용하려면 먼저 OpenAI 플랫폼에서 설정이 필요합니다.
✅ 사전 설정을 통해 특정한 업무(법률, 금융, IT 등)에 최적화된 GPT를 만들 수 있습니다.
✅ API에서 model 값을 Custom GPT ID로 변경하면 사전 설정이 반영된 맞춤형 응답을 받을 수 있습니다.
curl https://api.openai.com/v1/models \
-H "Authorization: Bearer YOUR_OPENAI_API_KEY"
6. custom GPT 구성(Config)
- 우측 큰화면의 상단에 GPT제목을 누르고, 편집을 누른 후, "구성"탭에서 설정.
인증형식은 API key로 하고, https://platform.openai.com/ 에서 카드설정+발급받은 키를 이용하게 되며,
인증방식은 기본이 아닌-> "Bearer" 로 설정하는게 편함.
심플 get용 스키마:
{
"openapi": "3.1.0",
"info": {
"title": "간단한 GET API",
"description": "GET 요청을 받아 텍스트를 반환하는 API",
"version": "v1.0.0"
},
"servers": [
{
"url": "https://api.example.com"
}
],
"paths": {
"/hello": {
"get": {
"summary": "텍스트 반환",
"operationId": "getHello",
"responses": {
"200": {
"description": "성공적인 응답",
"content": {
"text/plain": {
"schema": {
"type": "string",
"example": "Hello, GPT!"
}
}
}
}
}
}
}
}
}
post용 스키마:
{
"openapi": "3.1.0",
"info": {
"title": "채권 조회 API",
"description": "채권자 및 채무자 정보를 입력하면 채권 상태를 반환합니다.",
"version": "v1.0.0"
},
"servers": [
{
"url": "https://api.example.com"
}
],
"paths": {
"/getDebtStatus": {
"post": {
"summary": "채권 상태 조회",
"operationId": "getDebtStatus",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/DebtRequest"
}
}
}
},
"responses": {
"200": {
"description": "채권 상태 응답",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/DebtResponse"
}
}
}
}
}
}
}
},
"components": {
"schemas": {
"DebtRequest": {
"type": "object",
"properties": {
"채권자명": {
"type": "string",
"description": "채권자의 이름"
},
"채무자명": {
"type": "string",
"description": "채무자의 이름"
}
},
"required": ["채권자명", "채무자명"]
},
"DebtResponse": {
"type": "object",
"properties": {
"결과": {
"type": "string",
"description": "응답 상태 (성공 또는 실패)"
},
"채권 상태": {
"type": "string",
"description": "채권의 현재 상태 (예: 연체, 회수 완료 등)"
},
"회수 가능 금액": {
"type": "number",
"description": "현재 회수 가능한 금액 (원화 기준)"
}
}
}
}
}
}
javascript 혹은 react상에서 간단한 템플릿 랭기지인 mustache 를 살펴보면 다음과 같다.
설치: npm install mustache
예제코드.
import React from "react";
import Mustache from "mustache";
const TemplateRenderer = () => {
const template = "Hello, {{name}}! Welcome to {{platform}}.";
const data = {
name: "John",
platform: "React Mustache",
};
const renderedText = Mustache.render(template, data);
return <div>{renderedText}</div>;
};
export default TemplateRenderer;
포인터가 존재: c언어와 유사
패키지명/가비지 컬렉션존재: java와 유사
- 함수의 지연된 실행 허용
- 동시 프로그래밍을 지원하여 여러 프로세스를 동시에 실행할 수 있음
이는 채널, 고루틴 등을 사용하여 달성됩니다.
코드 에디터 (아래에 실행영역)이 있는 것 처럼 아래 위 두개의 영역이 있고,
중간을 마우스로 드래그하면서 둘 사이의 비율을 조절하고 싶을때
다음과 같은 방식으로 가능하다.
react 코드:
import React, { useState } from "react";
import "./ResizableDiv.css"; // 스타일 관리
const ResizableDiv = () => {
const [height, setHeight] = useState(300); // 상단 div 초기 높이
const [isResizing, setIsResizing] = useState(false); // 조절 상태 관리
const handleMouseDown = () => {
setIsResizing(true); // 마우스 드래그 시작
};
const handleMouseMove = (e) => {
if (!isResizing) return;
const newHeight = e.clientY; // 마우스 위치를 기준으로 높이 계산
setHeight(newHeight);
};
const handleMouseUp = () => {
setIsResizing(false); // 마우스 드래그 종료
};
return (
<div
className="container"
onMouseMove={handleMouseMove}
onMouseUp={handleMouseUp}
onMouseLeave={handleMouseUp}
>
<div className="top-div" style={{ height: `${height}px` }}>
상단 Div
</div>
<div className="resizer" onMouseDown={handleMouseDown}></div>
<div className="bottom-div">하단 Div</div>
</div>
);
};
export default ResizableDiv;
CSS
.container {
display: flex;
flex-direction: column;
height: 100vh;
width: 100%;
user-select: none; /* 텍스트 선택 방지 */
}
.top-div {
background-color: #f0f0f0;
border-bottom: 2px solid #ccc;
overflow: auto;
}
.resizer {
height: 10px;
background-color: #888;
cursor: row-resize;
}
.bottom-div {
background-color: #e0e0e0;
flex: 1;
overflow: auto;
}
Slack API 키를 발급받기 위해서는 Slack 앱 생성과정을 거쳐야 합니다. Slack 앱을 생성한 후, API 키(토큰)를 발급받아 다양한 Slack API 호출에 사용할 수 있습니다. 아래는 단계별 방법입니다.
복사한 API 키를 사용하여 Slack API를 호출할 수 있습니다. 예를 들어, 메시지 전송 API를 호출하려면 다음과 같이 작성합니다:
original_window = self.driver.current_window_handle
self.driver.switch_to.window(original_window) # 메인 창으로 이동
# 새로운 창에서 실행
## child window
for window_handle in self.driver.window_handles:
print(window_handle, original_window, window_handle != original_window)
if window_handle != original_window:
print("자식 창 변경")
self.driver.switch_to.window(window_handle)
print("current handle 2:: ", self.driver.current_window_handle)
self.driver.implicitly_wait(5)
self.driver.switch_to.window(original_window) # 메인 창으로 이동