Hike News
Hike News

MacOS에서 prompt 설정하기

Person:

  • macos의 터미널의 zsh 쉘에서
  1. 현재의 디렉토리를 보여주게 한다.
    쉘프롬프트를 알려주세요

ChatGPT:

  • macOS의 터미널에서 zsh 쉘을 사용할 때 현재 디렉토리를 쉘 프롬프트에 표시하는 방법은 다음과 같습니다:
  1. 터미널을 실행하고 zsh 쉘로 전환합니다.
  2. 홈 디렉토리로 이동하여 .zshrc 파일을 편집합니다. 만약 .zshrc 파일이 없다면 새로 생성합니다.
  3. .zshrc 파일에 다음과 같은 줄을 추가합니다:
1
2

PROMPT='%n@%m:%~%# '

위의 프롬프트 형식은 다음과 같이 구성됩니다:

  • %n: 현재 사용자 이름
  • @: “@” 기호
  • %m: 현재 호스트 이름
  • :: 콜론 기호
  • %~: 현재 디렉토리 경로를 홈 디렉토리를 기준으로 표시 (예: ~/Documents)
  • %#: 일반 사용자는 $ 기호로, 관리자(root)는 # 기호로 표시됩니다.
  1. .zshrc 파일을 저장하고 닫습니다.
  2. 변경 사항을 적용하기 위해 터미널에서 다음 명령어를 실행합니다:
1
2

source ~/.zshrc

이제 쉘 프롬프트에는 현재 디렉토리 경로가 표시될 것입니다.

Person:

  • 위의 프롬프트에서 사용자이름, @, 현재호스트이름, 콜론을 삭제하고
    현재 디렉토리 경로를 화살표 배경으로 출력해주는
    프롬프트를 만들어주세요

ChatGPT:

  • 아래와 같이 .zshrc 파일에 다음 줄을 추가하여 원하시는 형식의 쉘 프롬프트를 설정할 수 있습니다:
1
2

PROMPT='%F{blue}%D{%H:%M:%S} %F{white}%1d %F{cyan}➜ %F{reset}'

위의 프롬프트 형식은 다음과 같이 구성됩니다:

  • %F{color}: 다음에 오는 텍스트의 색상을 설정합니다. color는 원하는 색상으로 대체됩니다. 예를 들어, blue, white, cyan은 각각 파란색, 흰색, 청록색을 나타냅니다.
  • `%D

Google sheet에서 importxml과 xpath

Person:

  • Google Sheet의 ImportXML을 이용해서
    구글검색 후, 아래와 같은 selector를 찾는 예제를 만들어줘
    1
    #rso > div:nth-child(1) > div > div > div.Z26q7c.UK95Uc.jGGQ5e > div

ChatGPT:

  • 물론! 아래는 Google Sheet의 ImportXML 함수를 사용하여 Google 검색 결과에서 해당 선택자를 찾는 예제입니다.
1
2

=IMPORTXML("https://www.google.com/search?q=키워드", "//*[@id='rso']/div[1]/div/div/div[3]/div")

위 예제에서 “키워드” 부분은 원하는 검색어로 대체해야 합니다. 검색어를 수정한 후에 함수를 Google Sheet 셀에 입력하면 해당 선택자의 결과가 표시됩니다.

선택자 #rso > div:nth-child(1) > div > div > div.Z26q7c.UK95Uc.jGGQ5e > div는 구글 검색 결과 페이지의 첫 번째 결과 요소에 해당합니다.

주의: 구글은 검색 결과 페이지의 HTML 구조를 자주 변경하기 때문에 선택자가 작동하지 않을 수 있습니다. 이러한 경우에는 새로운 선택자를 찾아야 합니다. 선택자가 작동하지 않는 경우에는 구글 검색 결과 데이터를 가져오기 위해 다른 방법을 고려해야 할 수도 있습니다.

Person:

1
2
IMPORTXML("https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=ninja", "//*[@id='power_link_body']/ul//li/div/a/span") 함수를 
Google Apps Script에서 호출하는 방법을 알려주세요

ChatGPT:

  • Google Apps Script에서 IMPORTXML 함수를 직접 호출할 수는 없습니다. 하지만 Google Apps Script를 사용하여 웹 페이지의 내용을 가져와 파싱하는 방법을 알려드릴 수 있습니다. 아래는 Google Apps Script를 사용하여 네이버 검색 결과에서 해당 선택자를 찾는 예제입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

function getSearchResults() {
var url = "https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=ninja";
var selector = "//*[@id='power_link_body']/ul//li/div/a/span";

var response = UrlFetchApp.fetch(url);
var content = response.getContentText();

var doc = XmlService.parse(content);
var root = doc.getRootElement();

var elements = root.getDescendants();
var results = [];

for (var i = 0; i < elements.length; i++) {
var element = elements[i];
var elementSelector = XmlService.getXPath(element);

if (elementSelector === selector) {
var text = element.getText();
results.push(text);
}
}

return results;
}

위 예제에서는 UrlFetchApp을 사용하여 웹 페이지의 내용을 가져온 후, XmlService를 사용하여 XML 문서를 파싱합니다. 이후 XPath를 사용하여 원하는 선택자에 해당하는 요소를 찾아 결과를 배열에 저장합니다. results 배열은 getSearchResults 함수의 반환값으로 사용될 수 있습니다.

Google Apps Script는 Google Sheets와 함께 사용될 수 있으므로, 이 함수를 Google Sheets에서 호출하여 결과를 표시할 수 있습니다.

Person:

  • GAS(Google Apps Script)에서 Google Sheet의 sum 함수를 사용하는 예제를 보여주세요

ChatGPT:

  • GAS(Google Apps Script)를 사용하여 Google Sheets의 SUM 함수를 호출하는 예제를 아래에 제시합니다.
1
2
3
4
5
6
7
8
9
10

function sumExample() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

// 범위 A1:A10의 합을 계산
var range = sheet.getRange("A1:A10");
var sum = sheet.getRange("B1").setFormula('=SUM(' + range.getA1Notation() + ')');

Logger.log("Sum: " + sum.getValue());
}

위 예제에서는 sumExample 함수를 생성하고 현재 활성화된 스프레드시트의 시트를 가져옵니다. 그런 다음, getRange 메소드를 사용하여 합계를 계산할 범위를 선택하고, setFormula 메소드를 사용하여 SUM 함수를 셀에 설정합니다.

셀에 SUM 함수를 설정한 후, getValue 메소드를 사용하여 계산된 합계 값을 가져옵니다. Logger.log를 사용하여 콘솔에 합계를 출력하고, 필요에 따라 다른 작업을 수행할 수 있습니다.

이 예제는 B1 셀에 A1:A10 범위의 합계를 계산하고, 결과를 로그에 출력합니다. 필요에 따라 셀의 위치와 범위를 수정하여 다른 셀에 합계를 계산할 수 있습니다.

Person:

  • setFormula()를 이용하여 importXML을 사용하는 방법을 알려주세요

ChatGPT:

  • setFormula 메소드를 사용하여 IMPORTXML 함수를 Google Sheets 셀에 설정하여 웹 데이터를 가져오는 예제를 아래에 제시합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

function importXMLExample() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

// IMPORTXML 함수를 설정할 셀 범위
var cell = sheet.getRange("A1");

// IMPORTXML 함수의 URL과 XPath
var url = "https://www.example.com";
var xpath = "//*[@id='content']/h1";

// IMPORTXML 함수 설정
var formula = "=IMPORTXML(\"" + url + "\", \"" + xpath + "\")";
cell.setFormula(formula);

// 계산된 결과 가져오기
var result = cell.getValue();

Logger.log("Result: " + result);
}

위 예제에서는 importXMLExample 함수를 생성하고 현재 활성화된 스프레드시트의 시트를 가져옵니다. 그런 다음, getRange 메소드를 사용하여 IMPORTXML 함수를 설정할 셀 범위를 선택합니다. 여기서는 A1 셀을 선택하였습니다.

다음으로, urlxpath 변수에 각각 가져올 웹 페이지의 URL과 XPath를 지정합니다.

그 후, setFormula 메소드를 사용하여 IMPORTXML 함수를 셀에 설정합니다. 이때, formula 변수에 IMPORTXML 함수를 문자열로 구성하여 전달합니다.

셀에 IMPORTXML 함수를 설정한 후, getValue 메소드를 사용하여 계산된 결과를 가져옵니다. Logger.log를 사용하여 콘솔에 결과를 출력하거나, 필요에 따라 다른 작업을 수행할 수 있습니다.

이 예제에서는 A1 셀에 IMPORTXML 함수를 설정하고, 결과를 로그에 출력합니다. 필요에 따라 다른 셀에 함수를 설정하고, 결과를 다른 위치에 저장할 수도 있습니다.

Person:

  • XPath에 대해서 간략히 설명해주세요

ChatGPT:

  • XPath(XML Path Language)는 XML 문서의 요소 및 속성을 식별하기 위한 경로 언어입니다. XPath는 XML 문서의 특정 부분에 접근하기 위해 사용되며, 웹 스크래핑이나 XML 처리 등 다양한 작업에 활용됩니다.

XPath는 XML 문서의 요소, 속성, 텍스트 등을 찾기 위한 경로를 지정하는데 사용됩니다. XPath 경로는 XML 문서의 계층 구조를 따라 이동하며, 다양한 문법을 사용하여 요소 및 속성을 선택합니다.

XPath 표현식은 다음과 같은 구성 요소로 이루어집니다:

  1. 요소 이름: 요소 이름을 사용하여 해당 요소를 선택합니다. 예를 들어, book<book> 요소를 선택합니다.
  2. 경로 연산자(/): 경로 연산자는 요소 계층 구조를 따라 이동하는 데 사용됩니다. 예를 들어, library/book<library> 요소 아래의 모든 <book> 요소를 선택합니다.
  3. 속성 선택자(@): 속성 선택자는 요소의 속성을 선택하기 위해 사용됩니다. 예를 들어, book/@title<book> 요소의 title 속성을 선택합니다.
  4. 조건([ ]): 조건을 사용하여 요소를 필터링할 수 있습니다. 예를 들어, book[price>10]price 속성 값이 10보다 큰 모든 <book> 요소를 선택합니다.

XPath는 더 많은 기능을 제공하며, 축(Axis), 함수, 연산자 등을 사용하여 복잡한 선택 및 조작을 수행할 수 있습니다. XPath는 다양한 프로그래밍 언어 및 도구에서 지원되며, XML 문서 처리 및 웹 스크래핑과 같은 작업에 유용하게 활용됩니다.

Person:

  • XPath에서 /와 //, * 연산자에 대한 설명을 해주세요

ChatGPT:

  • XPath에서 사용되는 /, //, * 연산자에 대해 설명드리겠습니다.
  1. / 연산자:
    / 연산자는 경로 표현식에서 요소의 직접적인 자식을 선택하는 데 사용됩니다. 예를 들어, books/bookbooks 요소의 자식인 모든 book 요소를 선택합니다. 이 연산자는 계층 구조를 따라 하나의 수준만 이동합니다.
  2. // 연산자:
    // 연산자는 경로 표현식에서 요소의 임의의 위치에 있는 모든 자손 요소를 선택하는 데 사용됩니다. 예를 들어, //book은 문서 전체에서 모든 book 요소를 선택합니다. 이 연산자는 계층 구조를 따라 모든 수준을 이동합니다.
  3. * 연산자:
    * 연산자는 경로 표현식에서 모든 요소를 선택하는 데 사용됩니다. 예를 들어, //*은 문서 내의 모든 요소를 선택합니다. 이 연산자는 요소의 이름을 지정하지 않고 모든 요소를 선택할 때 유용합니다.

이러한 연산자들은 XPath에서 요소를 선택하고 필터링하는 데 사용됩니다. / 연산자는 계층 구조를 따라 요소를 직접 선택하고, // 연산자는 모든 자손 요소를 선택하며, * 연산자는 모든 요소를 선택합니다. 이들을 조합하여 원하는 요소에 대한 XPath 경로를 지정할 수 있습니다.

python 윈도우즈 폴더하부까지 파일찾기

Person:

1
windows에서 폴더하부까지 찾아서 파일을 읽어와 특정 문자열을 찾을 수 있는 방법을 알려주세요

ChatGPT:

  • Windows에서 폴더 하부까지 파일을 찾아 특정 문자열을 찾는 방법에는 여러 가지 방법이 있습니다. 여기서는 Python을 사용하여 파일 시스템을 탐색하고 특정 문자열을 찾는 방법을 설명하겠습니다.
  1. Python을 설치합니다: 먼저 Python을 설치해야 합니다. Python은 파일 시스템 탐색과 문자열 처리를 위해 사용될 수 있습니다. Python 3.x 버전을 사용하는 것을 권장합니다. Python은 https://www.python.org/에서 다운로드할 수 있습니다.
  2. 필요한 라이브러리 설치: 파일 탐색을 위해 os 모듈을 사용하고, 파일 내용 검색을 위해 re 모듈을 사용할 것입니다. 이 두 가지 모듈은 기본 Python 라이브러리에 포함되어 있습니다.
  3. 코드 작성: 아래의 Python 코드 예제를 통해 폴더 하부의 파일을 검색하고 특정 문자열을 찾을 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

import os
import re

def search_files_for_string(folder_path, search_string):
for root, _, files in os.walk(folder_path):
for file_name in files:
file_path = os.path.join(root, file_name)
if os.path.isfile(file_path):
try:
with open(file_path, 'r', encoding='utf-8') as file:
content = file.read()
if re.search(search_string, content):
print(f"Found in: {file_path}")
except UnicodeDecodeError:
print(f"UnicodeDecodeError occurred while reading: {file_path}")

# 사용 예시:
folder_path = 'C:\\path\\to\\your\\folder'
search_string = 'your_search_string'
search_files_for_string(folder_path, search_string)

위 코드에서 folder_path 변수에는 검색을 시작할 폴더의 경로를 지정하고, search_string 변수에는 찾고자 하는 특정 문자열을 입력합니다. 코드가 실행되면 해당 폴더와 하부 폴더의 파일들을 모두 탐색하여 해당 문자열이 포함된 파일을 출력합니다.

주의사항:

  • os.walk() 함수를 사용하여 폴더 하부를 재귀적으로 탐색하므로 큰 폴더 구조에서는 실행 시간이 오래 걸릴 수 있습니다. 큰 폴더를 검색할 때는 주의하시기 바랍니다.
  • open() 함수에서 파일을 열 때 인코딩을 명시해야 합니다. 위 예제에서는 UTF-8 인코딩을 사용했습니다.
  • 파일 탐색 시 예외 처리를 수행하여 파일을 읽는 중에 발생할 수 있는 오류를 처리합니다.

위의 코드를 수정하여 원하는 대로 사용하시면 됩니다.

nodejs tutorial

Node.js 학습하기

Node.js 기초학습 목차

Human

1
2
😀 node.js를 처음배우는 사람을 위한 기초지식 목차를 정리해주세요

🤖 ChatGPT

아래는 Node.js를 처음 배우는 사람을 위한 기초 지식 목차입니다:

  1. Node.js 소개
    • Node.js의 정의와 목적
    • Node.js의 특징과 장점
    • Node.js의 사용 사례
  2. JavaScript 기초
    • JavaScript 문법과 구문
    • 변수, 데이터 타입, 연산자
    • 조건문과 반복문
    • 함수와 객체
    • 콜백 함수 개념 이해
  3. Node.js 설치와 설정
    • Node.js 설치 방법
    • npm (Node Package Manager) 소개
    • 프로젝트 디렉토리 설정
  4. 모듈과 패키지
    • 모듈 개념 이해
    • 내장 모듈과 외부 패키지
    • npm을 사용한 패키지 설치 및 관리
  5. 비동기 프로그래밍
    • 비동기 작업과 콜백 함수
    • 이벤트 루프와 이벤트 기반 프로그래밍
    • Promise와 async/await 사용하기
  6. 파일 시스템 다루기
    • 파일 읽기와 쓰기
    • 폴더 생성과 삭제
    • 파일 및 폴더 관련 기능 사용
  7. HTTP 서버와 클라이언트
    • HTTP 프로토콜 개요
    • HTTP 모듈을 사용한 서버 생성
    • 요청과 응답 처리
  8. Express.js 프레임워크
    • Express.js 소개와 설치
    • 미들웨어 개념 이해
    • 라우팅과 컨트롤러 설정
  9. 데이터베이스 연동
    • 데이터베이스 개요
    • MongoDB, MySQL, PostgreSQL 등과의 연동
    • ORM(Object-Relational Mapping) 사용
  10. 보안과 인증
    • 사용자 인증과 인가
    • 비밀번호 해싱과 솔트
    • 세션과 쿠키 관리
  11. 테스트와 디버깅
    • 테스트의 중요성과 종류
    • 단위 테스트와 통합 테스트 도구
    • 디버깅 기법과 도구 사용
  12. 배포와 운영
    • 서버 배포 전략과 도구
    • 클라우드 플랫폼 활용
    • 로깅과 모니터링

이 목차를 참고하여 Node.js를 처음 배우는 사람이 필요로 하는 기초 지식을 습득할 수 있습니다. 중요한 것은 단계별로 천천히 익혀가며 실습을 통해 학습하는 것입니다. 선호하는 온라인 자습서, 도 서, 블로그, 강의 등을 활용하여 학습에 도움을 받을 수도 있습니다.

Human

1
2
😀 node.js 필수 기초예제 10개를 정리해주세요

🤖 ChatGPT

Node.js를 처음 배우는 사람을 위한 필수 기초 예제 10개를 정리해보겠습니다:

  1. Hello, World 출력하기:
1
console.log("Hello, World!");
  1. 파일 읽기:
1
2
3
4
5
6
const fs = require('fs');

fs.readFile('file.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
  1. HTTP 서버 생성하기:
1
2
3
4
5
6
7
8
9
10
11
const http = require('http');

const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello, World!');
});

server.listen(3000, 'localhost', () => {
console.log('Server running at http://localhost:3000/');
});
  1. 외부 패키지 설치하고 사용하기:
1
2
3
4
5
6
7
8
9
const axios = require('axios');

axios.get('https://api.example.com/data')
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error(error);
});
  1. Express.js를 사용한 간단한 웹 애플리케이션:
1
2
3
4
5
6
7
8
9
10
const express = require('express');
const app = express();

app.get('/', (req, res) => {
res.send('Hello, World!');
});

app.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
  1. 비동기 함수와 Promise 사용:
1
2
3
4
5
6
7
8
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}

delay(2000)
.then(() => {
console.log('Delayed action!');
});
  1. 파일 쓰기:
1
2
3
4
5
6
const fs = require('fs');

fs.writeFile('file.txt', 'Hello, World!', 'utf8', (err) => {
if (err) throw err;
console.log('File saved!');
});
  1. 데이터베이스 연결과 쿼리 실행:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const mysql = require('mysql');

const connection = mysql.createConnection({
host: 'localhost',
user: 'username',
password: 'password',
database: 'database_name'
});

connection.connect();

connection.query('SELECT * FROM users', (error, results) => {
if (error) throw error;
console.log(results);
});

connection.end();
  1. 사용자 입력 받기:
1
2
3
4
5
6
7
8
9
10
11
const readline = require('readline');

const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});

rl.question('What is your name? ', (name) => {
console.log(`Hello, ${name}!`);
rl.close();
});
  1. 디버깅하기:
1
2
3
4
5
const util = require('util');

const debug = util.debuglog('app');

debug('This is a debug message');

이 예제들을 통해 기본적인 Node.js 개념과 기능을 익힐 수 있으며, 실습을 통해 더 많은 경험을 쌓을 수 있습니다. 각 예제의 설명과 함께 스스로 코드를 작성하고 실행해 보는 것을 권장합니다.

Human

1
2
😀 node,js에 url 등록하는 방법과 post, get 방식의 필수예제를 정리해주세요

🤖 ChatGPT

Node.js에서 URL을 등록하는 방법은 다양한 방법이 있지만, 가장 일반적인 방법은 Express.js를 사용하는 것입니다. 아래는 Express.js를 사용하여 URL을 등록하는 예제입니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const express = require('express');
const app = express();

// GET 방식의 URL 등록
app.get('/hello', (req, res) => {
res.send('Hello, World!');
});

// POST 방식의 URL 등록
app.post('/login', (req, res) => {
// 로그인 로직 처리
res.send('Logged in successfully!');
});

// 모든 HTTP 메서드에 대한 URL 등록
app.all('/users', (req, res) => {
// 사용자 관련 로직 처리
res.send('User data');
});

// 매개변수가 있는 URL 등록
app.get('/users/:id', (req, res) => {
const userId = req.params.id;
// 특정 사용자 정보 가져오기
res.send(`User ID: ${userId}`);
});

app.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});

위 예제에서 /hello는 GET 방식으로 접근 가능한 URL이며, /login은 POST 방식으로 접근 가능한 URL입니다. /users는 모든 HTTP 메서드(GET, POST, PUT, DELETE 등)에 대해 접근 가능한 URL이며, /users/:id는 id라는 매개변수를 가진 URL입니다.

이제 POST와 GET 방식에 대한 필수 예제를 정리해보겠습니다:

  1. GET 방식으로 데이터 전송하기:
1
2
3
4
5
6
7
8
9
10
11
12
const express = require('express');
const app = express();

app.get('/search', (req, res) => {
const query = req.query.q;
// 검색 로직 처리
res.send(`Search Query: ${query}`);
});

app.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});

위 예제에서 /search URL에 GET 요청을 보내면 q라는 쿼리 매개변수를 통해 검색어를 전달할 수 있습니다. 전달받은 검색어를 활용하여 검색 로직을 처리한 후 결과를 반환합니다.

  1. POST 방식으로 데이터 전송하기:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const express = require('express');
const app = express();

app.use(express.urlencoded({ extended: true }));

app.post('/login', (req, res) => {
const username = req.body.username;
const password = req.body.password;
// 로그인 로직 처리
res.send('Logged in successfully!');
});

app.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});

위 예제에서 /login URL에 POST 요청을 보내면 username과 password라는 필드를 가진 데이터를 전달할 수 있습니다. 전달받은 데이터를 활용하여 로그인 로직을 처리한 후 성공 메시지를 반환합니다. express.urlencoded() 미들웨어를 사용하여 POST 요청의 본문(body) 데이터를 파싱할 수 있도록 설정합니다.

이러한 예제를 통해 GET과 POST 방식으로 데이터를 전송하고 처리하는 방법을 익힐 수 있습니다. 자세한 내용은 Express.js 공식 문서를 참고하시기 바랍니다.

Human

1
2
😀 express를 사용하면 static html을 전송하는 예제를 보여주세요

🤖 ChatGPT

Express.js를 사용하여 정적 HTML 파일을 전송하는 예제를 보여드리겠습니다. 아래는 Express.js를 활용하여 정적 파일을 제공하는 방법입니다:

  1. 프로젝트 폴더 구조:
1
2
3
4
5
6
7
- project_folder
- public
- index.html
- styles.css
- script.js
- server.js

  1. Express.js 서버 설정:
1
2
3
4
5
6
7
8
9
const express = require('express');
const app = express();

// 정적 파일을 제공하기 위해 'public' 디렉토리를 사용합니다.
app.use(express.static('public'));

app.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
  1. HTML 파일 작성:
  • index.html 파일을 public 디렉토리 안에 생성하고 원하는 내용을 작성합니다.
  1. 서버 실행:
  • 터미널에서 node server.js를 실행하여 서버를 시작합니다.
  1. 웹 브라우저에서 접속:
  • 웹 브라우저에서 http://localhost:3000에 접속하면 index.html 파일이 로드되고, 해당 파일에 포함된 스타일 시트 및 스크립트도 로드됩니다.

위 예제를 통해 Express.js를 사용하여 정적 HTML 파일을 제공하는 방법을 학습할 수 있습니다. 정적 파일들(HTML, CSS, JavaScript 등)을 public 디렉토리에 저장하고, express.static() 미들웨어를 사용하여 해당 디렉토리의 파일들을 정적으로 제공합니다.

Human

1
2
😀 file upload하는 간단한 예제를 보여줘

🤖 ChatGPT

Express.js를 사용하여 파일 업로드하는 간단한 예제를 보여드리겠습니다.

  1. 필요한 패키지 설치하기:
1
npm install express multer
  1. Express.js 서버 설정:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const express = require('express');
const multer = require('multer');
const app = express();

// 업로드된 파일을 저장할 디렉토리 설정
const upload = multer({ dest: 'uploads/' });

// 파일 업로드를 처리할 라우트 핸들러
app.post('/upload', upload.single('file'), (req, res) => {
// 업로드된 파일 정보는 req.file 객체에 저장됩니다.
if (req.file) {
res.send('File uploaded successfully!');
} else {
res.status(400).send('No file uploaded.');
}
});

app.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
  1. HTML 폼 작성:
1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html><html>
<head>
<title>File Upload</title>
</head>
<body>
<h1>File Upload</h1>
<form action="/upload" method="POST" enctype="multipart/form-data">
<input type="file" name="file">
<button type="submit">Upload</button>
</form>
</body>
</html>
  1. 서버 실행:
  • 터미널에서 node server.js를 실행하여 서버를 시작합니다.
  1. 웹 브라우저에서 접속:
  • 웹 브라우저에서 http://localhost:3000에 접속하여 파일을 선택하고 업로드 버튼을 클릭합니다.

위 예제를 통해 Express.js와 Multer를 사용하여 파일 업로드 기능을 구현하는 방법을 학습할 수 있습니다. 클라이언트에서 enctype="multipart/form-data"로 설정된 HTML 폼을 통해 파일을 선택하고 서버로 전송하면 Multer 미들웨어가 업로드된 파일을 처리하고, 결과를 응답으로 반환합니다. 업로드된 파일은 req.file 객체를 통해 접근할 수 있습니다.

Human

1
2
😀 위의 예제에서 문자열로 이름과 나이를 받도록 해주고 파일의 크기도 5 mega byte를 넘으면 받지 못하도록 해줘

🤖 ChatGPT

파일 업로드 예제에 문자열로 이름과 나이를 받고, 파일 크기를 제한하는 기능을 추가해보겠습니다.

  1. 필요한 패키지 설치하기:
1
npm install express multer
  1. Express.js 서버 설정:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
const express = require('express');
const multer = require('multer');
const app = express();

// 파일 업로드를 처리할 미들웨어 생성
const upload = multer({
dest: 'uploads/',
limits: {
fileSize: 5 * 1024 * 1024, // 5MB 제한
},
});

// 파일 업로드를 처리할 라우트 핸들러
app.post('/upload', upload.single('file'), (req, res) => {
// 업로드된 파일 정보는 req.file 객체에 저장됩니다.
if (req.file) {
const name = req.body.name;
const age = req.body.age;
console.log('Name:', name);
console.log('Age:', age);
res.send('File uploaded successfully!');
} else {
res.status(400).send('No file uploaded.');
}
});

app.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
  1. HTML 폼 작성:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html><html>
<head>
<title>File Upload</title>
</head>
<body>
<h1>File Upload</h1>
<form action="/upload" method="POST" enctype="multipart/form-data">
<label for="name">Name:</label>
<input type="text" name="name" id="name" required>
<br>
<label for="age">Age:</label>
<input type="number" name="age" id="age" required>
<br>
<label for="file">File:</label>
<input type="file" name="file" id="file" required>
<button type="submit">Upload</button>
</form>
</body>
</html>
  1. 서버 실행:
  • 터미널에서 node server.js를 실행하여 서버를 시작합니다.
  1. 웹 브라우저에서 접속:
  • 웹 브라우저에서 http://localhost:3000에 접속하여 이름, 나이, 그리고 파일을 선택하고 업로드 버튼을 클릭합니다. 파일 크기가 5MB를 초과하면 업로드에 실패합니다.

위 예제를 통해 Express.js와 Multer를 사용하여 파일 업로드 기능에 이름과 나이를 추가하고, 파일 크기를 제한하는 방법을 학습할 수 있습니다. limits 속성을 사용하여 파일 크기를 제한하였으며, req.body를 통해 이름과 나이 데이터를 접근할 수 있습니다.

Human

1
2
😀 위의 소스에서 http://localhost:3000로 접속했을 때, 파일업로드 Html이 나오도록 추가해주세요

🤖 ChatGPT

Express.js 서버 설정에 루트 경로(/)에 접속했을 때 파일 업로드 HTML을 보여주는 기능을 추가해보겠습니다.

  1. 필요한 패키지 설치하기:
1
npm install express multer
  1. Express.js 서버 설정:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
const express = require('express');
const multer = require('multer');
const path = require('path');
const app = express();

// 파일 업로드를 처리할 미들웨어 생성
const upload = multer({
dest: 'uploads/',
limits: {
fileSize: 5 * 1024 * 1024, // 5MB 제한
},
});

// 파일 업로드를 처리할 라우트 핸들러
app.post('/upload', upload.single('file'), (req, res) => {
// 업로드된 파일 정보는 req.file 객체에 저장됩니다.
if (req.file) {
const name = req.body.name;
const age = req.body.age;
console.log('Name:', name);
console.log('Age:', age);
res.send('File uploaded successfully!');
} else {
res.status(400).send('No file uploaded.');
}
});

// 루트 경로에 접속했을 때 파일 업로드 HTML을 보여줍니다.
app.get('/', (req, res) => {
const uploadForm = `
<!DOCTYPE html>
<html>
<head>
<title>File Upload</title>
</head>
<body>
<h1>File Upload</h1>
<form action="/upload" method="POST" enctype="multipart/form-data">
<label for="name">Name:</label>
<input type="text" name="name" id="name" required>
<br>
<label for="age">Age:</label>
<input type="number" name="age" id="age" required>
<br>
<label for="file">File:</label>
<input type="file" name="file" id="file" required>
<button type="submit">Upload</button>
</form>
</body>
</html>
`;
res.send(uploadForm);
});

app.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});

위 예제를 통해 루트 경로(/)에 접속했을 때 파일 업로드 HTML 폼이 보여지도록 설정했습니다. 루트 경로에 접속하면 HTML 폼이 렌더링되고, 해당 폼을 통해 이름, 나이, 그리고 파일을 선택하여 업로드할 수 있습니다.

Human

1
2
😀 node.js에서 html 파일에서 전용 tag를 사용하여 프로그래밍하는 예제를 정리해주세요

🤖 ChatGPT

Node.js에서 HTML 파일에서 전용 태그를 사용하여 프로그래밍하는 예제를 보여드리겠습니다. 이를 위해 ejs (Embedded JavaScript) 템플릿 엔진을 사용할 것입니다.

  1. 필요한 패키지 설치하기:
1
npm install express ejs
  1. Express.js 서버 설정:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const express = require('express');
const app = express();

// 템플릿 엔진으로 ejs 설정
app.set('view engine', 'ejs');

// 루트 경로에 접속했을 때 HTML 템플릿을 렌더링하여 보여줍니다.
app.get('/', (req, res) => {
const pageTitle = 'Node.js Programming Example';
const userList = [
{ name: 'John', age: 25 },
{ name: 'Jane', age: 30 },
{ name: 'Bob', age: 40 }
];
res.render('index', { pageTitle, userList });
});

app.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
  1. HTML 템플릿 작성 (views/index.ejs):
1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html><html>
<head>
<title><%= pageTitle %></title>
</head>
<body>
<h1><%= pageTitle %></h1>
<ul>
<% for (let user of userList) { %>
<li>Name: <%= user.name %>, Age: <%= user.age %></li>
<% } %>
</ul>
</body>
</html>
  1. 서버 실행:
  • 터미널에서 node server.js를 실행하여 서버를 시작합니다.
  1. 웹 브라우저에서 접속:
  • 웹 브라우저에서 http://localhost:3000에 접속하여 HTML 템플릿이 렌더링된 결과를 확인합니다. 페이지 제목과 사용자 리스트가 동적으로 표시됩니다.

위 예제를 통해 Express.js와 ejs 템플릿 엔진을 사용하여 HTML 파일에서 전용 태그(<% %><%= %>)를 사용하여 프로그래밍하는 방법을 학습할 수 있습니다. res.render() 메서드를 사용하여 HTML 템플릿을 렌더링하고, 템플릿 안에서 변수를 사용하여 동적인 데이터를 출력할 수 있습니다.

Human

1
2
ejs의 기초문법을 정리해주세요

EJS (Embedded JavaScript)는 JavaScript 코드를 HTML 템플릿 안에 넣어 동적으로 웹 페이지를 생성하는 데 사용되는 템플릿 엔진입니다. EJS의 기초 문법에 대해 정리해드리겠습니다.

  1. 변수 출력(<%= %>)
  • <%= 변수 %> 구문을 사용하여 변수의 값을 HTML에 출력합니다.
  • 예: <h1>Welcome, <%= username %>!</h1>
  1. JavaScript 코드 실행(<% %>)
  • <% 코드 %> 구문을 사용하여 JavaScript 코드를 실행합니다.
  • 예: <% if (isLoggedIn) { %><h1>Welcome!</h1><% } %>
  1. 반복문(<% for (...) { %> ... <% } %>)
  • JavaScript의 for 루프를 사용하여 반복적으로 코드를 실행합니다.

  • 예:

    1
    2
    3
    4
    5
    <ul>
    <% for (let item of items) { %>
    <li><%= item %></li>
    <% } %>
    </ul>
  1. 조건문(<% if (...) { %> ... <% } %>)
  • JavaScript의 if 문을 사용하여 조건에 따라 특정 코드 블록을 실행합니다.

  • 예:

    1
    2
    3
    4
    5
    <% if (isLoggedIn) { %>
    <h1>Welcome, <%= username %>!</h1>
    <% } else { %>
    <h1>Please log in.</h1>
    <% } %>
  1. 주석(<%# 주석 내용 %>)
  • <%# 주석 내용 %> 구문을 사용하여 주석을 작성할 수 있습니다.
  1. 부분 템플릿(<%- include('템플릿 파일 경로') %>)
  • 다른 EJS 템플릿 파일을 포함시킬 수 있습니다.
  • 예: <%- include('header.ejs') %>

위의 기초 문법을 사용하여 EJS 템플릿 엔진을 활용할 수 있습니다. EJS는 HTML 템플릿 안에서 JavaScript 코드를 쉽게 실행할 수 있어 동적인 웹 페이지 생성에 유용합니다. 자세한 문법과 사용 방법은 EJS 공식 문서를 참조하시면 좋습니다.

Human

1
2
3
4
5
6
7
8
9
10
11
12
13
14
😀
1. SQLiteDB를 사용합니다.
- table이름은 t_todo로 합니다.
- 필드는 다음과 같습니다.
- name은 문자열
- todo는 문자열
- day는 날짜
- SQLiteDB의 파일명은 "test.db"로 합니다.
2. node.js에서 소스를 만듭니다.
- test.db와 연동합니다.
- 추가, 삭제, 보여주기 기능을 구현합니다.

간단한 예제를 만들어주세요

🤖 ChatGPT

SQLiteDB를 사용하고, “test.db”라는 파일명을 가진 데이터베이스를 생성하여 t_todo라는 테이블을 사용하는 간단한 예제를 만들어보겠습니다. 예제에서는 Node.js와 SQLite3 패키지를 사용합니다.

  1. 필요한 패키지 설치하기:
1
npm install sqlite3
  1. 소스 코드 작성:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
const sqlite3 = require('sqlite3').verbose();

// 데이터베이스 연결
const db = new sqlite3.Database('test.db');

// 테이블 생성
db.serialize(() => {
db.run(`CREATE TABLE IF NOT EXISTS t_todo (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
todo TEXT,
day TEXT
)`);
});

// 데이터 추가
function addTodoItem(name, todo, day) {
db.run(`INSERT INTO t_todo (name, todo, day) VALUES (?, ?, ?)`, [name, todo, day], function(err) {
if (err) {
return console.error(err.message);
}
console.log(`Todo item added with ID: ${this.lastID}`);
});
}

// 데이터 삭제
function deleteTodoItem(id) {
db.run(`DELETE FROM t_todo WHERE id = ?`, [id], function(err) {
if (err) {
return console.error(err.message);
}
console.log(`Deleted todo item with ID: ${id}`);
});
}

// 데이터 보기
function showTodoItems() {
db.all(`SELECT * FROM t_todo`, [], (err, rows) => {
if (err) {
return console.error(err.message);
}
rows.forEach(row => {
console.log(`ID: ${row.id}, Name: ${row.name}, Todo: ${row.todo}, Day: ${row.day}`);
});
});
}

// 사용 예시
addTodoItem('John', 'Complete the project', '2023-06-01');
addTodoItem('Jane', 'Buy groceries', '2023-06-02');
showTodoItems();
deleteTodoItem(1);
showTodoItems();

// 데이터베이스 연결 종료
db.close();

위의 예제 코드에서는 SQLite3 패키지를 사용하여 SQLite 데이터베이스와 연동하고, t_todo 테이블을 생성합니다. addTodoItem()deleteTodoItem()showTodoItems() 함수를 사용하여 데이터를 추가, 삭제, 조회할 수 있습니다. 예제에서는 두 개의 데이터를 추가한 후 전체 데이터를 조회하고, 첫 번째 데이터를 삭제한 후 다시 조회합니다.

위 예제를 실행하면 SQLiteDB와 연동하여 데이터를 추가, 삭제, 조회하는 기능을 가진 간단한 Node.js 애플리케이션을 확인할 수 있습니다.

Human

1
2
😀 위의 예제를 express로 웹과 연도하는 간단한 예제를 만들어주세요

🤖 ChatGPT

위의 예제를 기반으로 Express.js를 사용하여 웹과 연동하는 간단한 예제를 만들어보겠습니다.

  1. 필요한 패키지 설치하기:
1
npm install express sqlite3
  1. 소스 코드 작성:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
const express = require('express');
const sqlite3 = require('sqlite3').verbose();

const app = express();
const db = new sqlite3.Database('test.db');

// 테이블 생성
db.serialize(() => {
db.run(`CREATE TABLE IF NOT EXISTS t_todo (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
todo TEXT,
day TEXT
)`);
});

// 데이터 추가
app.post('/add', (req, res) => {
const { name, todo, day } = req.body;
db.run(`INSERT INTO t_todo (name, todo, day) VALUES (?, ?, ?)`, [name, todo, day], function(err) {
if (err) {
return res.status(500).send(err.message);
}
res.send(`Todo item added with ID: ${this.lastID}`);
});
});

// 데이터 삭제
app.post('/delete/:id', (req, res) => {
const id = req.params.id;
db.run(`DELETE FROM t_todo WHERE id = ?`, [id], function(err) {
if (err) {
return res.status(500).send(err.message);
}
res.send(`Deleted todo item with ID: ${id}`);
});
});

// 데이터 조회
app.get('/todos', (req, res) => {
db.all(`SELECT * FROM t_todo`, [], (err, rows) => {
if (err) {
return res.status(500).send(err.message);
}
res.send(rows);
});
});

app.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});

위의 소스 코드에서는 Express.js를 사용하여 웹 서버를 구성하고, /add/delete/:id/todos 경로에 대한 라우트를 정의합니다. 데이터 추가와 삭제는 POST 요청으로 처리하고, 데이터 조회는 GET 요청으로 처리합니다.

위의 코드는 예시일 뿐, 실제 운영 환경에서는 보안 및 에러 처리, 데이터 유효성 검사 등을 추가해야 합니다. 또한, 웹 클라이언트(HTML, CSS, JavaScript)를 구성하여 서버에 요청을 보내고 결과를 표시하는 기능을 추가할 수 있습니다.

위 예제를 실행하면 Express.js와 SQLiteDB를 연동하여 데이터를 추가, 삭제, 조회하는 웹 애플리케이션이 구현됩니다. 각 경로에 요청을 보내어 데이터를 조작하고 결과를 확인할 수 있습니다.

Human

1
2
😀 위의 예제를 http://localhost:3000/에 접속했을 때, HTML에서 테스트할 수 있도록 만들어주세요

🤖 ChatGPT

위의 예제를 수정하여 http://localhost:3000/에 접속했을 때, HTML 템플릿을 사용하여 테스트할 수 있는 기능을 추가해보겠습니다.

  1. 필요한 패키지 설치하기:
1
npm install express sqlite3 ejs
  1. 소스 코드 작성:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
const express = require('express');
const sqlite3 = require('sqlite3').verbose();

const app = express();
const db = new sqlite3.Database('test.db');

app.set('view engine', 'ejs'); // 템플릿 엔진으로 ejs 설정
app.use(express.urlencoded({ extended: false })); // POST 요청의 body 파싱을 위한 미들웨어

// 테이블 생성
db.serialize(() => {
db.run(`CREATE TABLE IF NOT EXISTS t_todo (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
todo TEXT,
day TEXT
)`);
});

// 데이터 추가
app.post('/add', (req, res) => {
const { name, todo, day } = req.body;
db.run(`INSERT INTO t_todo (name, todo, day) VALUES (?, ?, ?)`, [name, todo, day], function(err) {
if (err) {
return res.status(500).send(err.message);
}
res.send(`Todo item added with ID: ${this.lastID}`);
});
});

// 데이터 삭제
app.post('/delete/:id', (req, res) => {
const id = req.params.id;
db.run(`DELETE FROM t_todo WHERE id = ?`, [id], function(err) {
if (err) {
return res.status(500).send(err.message);
}
res.send(`Deleted todo item with ID: ${id}`);
});
});

// 데이터 조회
app.get('/todos', (req, res) => {
db.all(`SELECT * FROM t_todo`, [], (err, rows) => {
if (err) {
return res.status(500).send(err.message);
}
res.send(rows);
});
});

// 메인 페이지 렌더링
app.get('/', (req, res) => {
db.all(`SELECT * FROM t_todo`, [], (err, rows) => {
if (err) {
return res.status(500).send(err.message);
}
res.render('index', { todos: rows });
});
});

app.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
  1. HTML 템플릿 작성 (views/index.ejs):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!DOCTYPE html><html>
<head>
<title>Todo List</title>
</head>
<body>
<h1>Todo List</h1>
<form method="POST" action="/add">
<label for="name">Name:</label>
<input type="text" name="name" id="name" required><br>
<label for="todo">Todo:</label>
<input type="text" name="todo" id="todo" required><br>
<label for="day">Day:</label>
<input type="text" name="day" id="day" required><br>
<button type="submit">Add Todo</button>
</form>

<h2>Todo Items:</h2>
<% if (todos.length === 0) { %
>
<p>No todo items.</p>
<% } else { %>
<ul>
<% todos.forEach(todo => { %>
<li><%= todo.name %> - <%= todo.todo %> (Day: <%= todo.day %>)</li>
<% }); %>
</ul>
<% } %>
</body>
</html>

위의 코드는 Express.js와 SQLiteDB를 연동하여 데이터를 추가, 삭제, 조회하며, http://localhost:3000/에 접속하면 HTML 템플릿을 렌더링하여 테스트할 수 있는 기능을 제공합니다.

애플리케이션을 실행하고 http://localhost:3000/에 접속하면 Todo List를 관리할 수 있는 HTML 페이지가 표시됩니다. 새로운 Todo 항목을 추가하고, 삭제 버튼을 클릭하여 Todo 항목을 삭제할 수 있습니다. 현재 등록된 Todo 항목들은 리스트로 표시됩니다.

이 예제는 간단한 형태의 HTML 템플릿을 사용하였으며, 보다 복잡한 기능과 디자인을 위해서는 HTML, CSS, JavaScript 등을 추가하여 확장할 수 있습니다.

python에서 데코레이터 사용법

Person:

  • 파이썬에서 데코레이터를 간략하게 설명하고 초간단 예제를 보여주세요

ChatGPT:

  • 데코레이터(Decorator)는 파이썬에서 함수나 클래스를 수정하거나 기능을 추가하기 위해 사용되는 기능입니다. 데코레이터는 기존의 코드를 변경하지 않고도 기능을 추가하거나 수정할 수 있어 코드의 재사용성과 가독성을 높일 수 있습니다. 데코레이터는 함수나 클래스 위에 @데코레이터_함수와 같은 형태로 사용되며, 해당 함수는 데코레이팅된 함수나 클래스를 인자로 받아 기능을 추가하거나 수정한 뒤 반환합니다.

다음은 더 간단한 예제로 @uppercase라는 데코레이터를 사용하여 함수의 반환값을 대문자로 변환하는 예제입니다:

1
2
3
4
5
6
7
8
9
10
11
12

def uppercase(func):
def wrapper():
result = func() # 원래 함수 호출
return result.upper() # 반환값 대문자로 변환
return wrapper

@uppercase
def greet():
return "hello, world!"

print(greet())

위 예제에서 uppercase 데코레이터는 wrapper라는 내부 함수를 정의하고, 이 함수에서 원래 함수인 greet를 호출하고 반환값을 대문자로 변환하여 반환합니다. @uppercase 데코레이터를 사용하여 greet 함수를 장식하면, greet 함수의 반환값이 대문자로 변환된 상태로 출력됩니다.

출력 결과:

1
2

HELLO, WORLD!

이처럼 데코레이터를 사용하면 함수나 클래스의 동작을 수정하거나 기능을 추가할 수 있습니다.

python으로 excel sheet별 파일만들기

Person:

    1. a.xls 파일이 있다.
  1. 시트가 다음과 같이 있다. [a, b, c]
  2. 시트별로 파일을 만들고 저장한다.
  3. 시트별 파일의 이름은 a_시트명.xls 이다.
    파이썬으로 소스코드를 만들어줘

ChatGPT:

  • 아래는 Python을 사용하여 주어진 요구사항에 따라 Excel 파일을 읽고 각 시트를 별도의 파일로 저장하는 코드입니다. 이 코드를 실행하려면 openpyxl 라이브러리를 설치해야 합니다.

먼저, 필요한 라이브러리를 설치하고 코드를 실행해 보겠습니다:

1
pip install openpyxl

그런 다음 아래의 Python 코드를 사용하여 작업할 수 있습니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import openpyxl

# 원본 엑셀 파일 이름
source_file = 'a.xls'

# 엑셀 워크북 열기
workbook = openpyxl.load_workbook(source_file)

# 각 시트를 별도의 파일로 저장
for sheet in workbook.sheetnames:
# 새로운 워크북 생성
new_workbook = openpyxl.Workbook()

# 원본 시트의 데이터 복사
source_sheet = workbook[sheet]
new_sheet = new_workbook.active
for row in source_sheet.iter_rows():
for cell in row:
new_sheet[cell.coordinate] = cell.value

# 새로운 파일로 저장
new_filename = f'a_{sheet}.xlsx'
new_workbook.save(new_filename)
print(f'{sheet} 시트를 {new_filename} 파일로 저장했습니다.')

# 원본 워크북 닫기
workbook.close()

이 코드는 원본 엑셀 파일을 열고 각 시트를 새로운 엑셀 파일로 저장합니다. 각 시트의 이름을 사용하여 파일 이름을 지정합니다. 코드를 실행하면 각 시트에 해당하는 파일이 생성될 것입니다.

mermaid의 간단한 사용법

Person:

  • markdown mermaid 예제 10개만 보여주세요

ChatGPT:

  • Sure, here are 10 Markdown Mermaid examples for you:
  1. Flowchart:
1
2
3
4
5
6
7

```mermaid
graph TD;
A-->B;
A-->C;
B-->D;
C-->D;
graph TD;
  A-->B;
  A-->C;
  B-->D;
  C-->D;
  1. Sequence Diagram:
1
2
3
4
5

```mermaid
sequenceDiagram
Alice->>Bob: Hello Bob, how are you?
Bob-->>Alice: Hi Alice, I'm good. Thanks!
1
2


  1. Class Diagram:
1
2
3
4
5
6
7

```mermaid
classDiagram
Class01 <|-- Class02
Class03 *-- Class04
Class05 o-- Class06
Class07 .. Class08
1
2


  1. State Diagram:
1
2
3
4
5
6
7
8
9

```mermaid
stateDiagram
[*] --> State1
State1 --> State2
State1 --> State3
State2 --> State3
State3 --> State1
State3 --> [*]
1
2


  1. Gantt Chart:
1
2
3
4
5
6
7
8
9

```mermaid
gantt
title Project Timeline
section Task A
Task 1: 2023-08-01, 2d
Task 2: 2023-08-03, 3d
section Task B
Task 3: 2023-08-06, 4d
1
2


  1. Pie Chart:
1
2
3
4
5
6
7
8

```mermaid
pie
title Expenses
"Food" : 40
"Rent" : 20
"Utilities" : 10
"Entertainment" : 30
1
2


  1. ER Diagram:
1
2
3
4
5
6
7
8
9
10
11
12

```mermaid
erDiagram
ENTITY01 {
id INT
name VARCHAR
}
ENTITY02 {
id INT
age INT
}
ENTITY01 ||..|| ENTITY02 : has
1
2


  1. User Journey:
1
2
3
4
5
6
7
8
9
10
11
12

```mermaid
journey
title My User Journey
section Homepage
This is the homepage of the website.
section "Login / Register"
This section is for user authentication.
section Dashboard
This section displays user data after login.
section "Purchase Item"
Users can purchase items in this section.
1
2


  1. Radial Tree:
1
2
3
4
5
6
7
8
9
10
11

```mermaid
%% Example using radial tree
%% https://github.com/mermaid-js/mermaid
%% :auto-coordinates: true
graph TD
A[Christmas] -->|Get money| B(Go shopping)
B --> C{Let me think}
C -->|One| D[Laptop]
C -->|Two| E[iPhone]
C -->|Three| F[Car]
1
2


  1. Entity Relationship Diagram (ERD):
1
2
3
4
5

```mermaid
erDiagram
CUSTOMER ||--o{ ORDER : places
ORDER ||--|{ LINE-ITEM : contains
1
2

Please note that for these examples to render correctly, you'll need a Markdown Mermaid plugin or a platform that supports Mermaid diagrams.

Person:

  • mindmap 예제도 보여주8ㅔ쇼

ChatGPT:

  • Sure, here’s a Mindmap example using Markdown Mermaid:
1
2
3
4
5
6
7
8
9
10

```mermaid
graph LR
A[Main Topic] --> B(Subtopic 1)
A --> C(Subtopic 2)
A --> D(Subtopic 3)
B --> E(Sub-subtopic 1)
B --> F(Sub-subtopic 2)
C --> G(Sub-subtopic 3)
C --> H(Sub-subtopic 4)
1
2

This example shows a simple mind map with a main topic "Main Topic" and three subtopics "Subtopic 1", "Subtopic 2", and "Subtopic 3". Each subtopic has two sub-subtopics. You can customize this mind map with your own content and structure.

chrome 디버깅

ChatGPT로 프롬프트

Person:

  • chrome 개발자 모드에서 수정한 HTML을 저장하는 방법은?

ChatGPT:

  • Chrome 개발자 모드에서 수정한 HTML을 저장하는 방법은 다음과 같습니다:
  1. 개발자 모드 열기: Chrome 브라우저에서 웹 페이지를 열고 F12 키를 누르거나, 마우스 오른쪽 버튼을 클릭한 후 “검사”를 선택하여 개발자 모드를 엽니다.
  2. HTML 수정: Elements 탭에서 웹 페이지의 HTML 코드를 수정할 수 있습니다. 원하는 부분을 클릭하고 직접 수정하거나, 마우스 오른쪽 버튼을 클릭하여 “편집”을 선택하여 수정할 수 있습니다.
  3. 수정 사항 적용: 수정이 완료되면, 수정한 내용이 실제로 적용되지 않습니다. 이 단계에서는 페이지를 새로 고치거나 다른 작업을 해도 수정한 내용이 유지됩니다.
  4. 수정한 HTML 저장: 수정한 내용을 저장하기 위해서는, Elements 탭에서 마우스 오른쪽 버튼을 클릭하고 “Edit as HTML” 옵션을 선택합니다. 그런 다음 나타난 창에서 수정한 HTML 코드를 모두 선택하고 복사합니다.
  5. 로컬 파일에 저장: 복사한 HTML 코드를 새로운 텍스트 문서에 붙여넣고, “.html” 확장자로 파일을 저장합니다. 이제 수정한 HTML이 로컬 파일로 저장되었습니다.

다만, 이렇게 수정한 HTML은 현재 작업 중인 페이지에만 적용되며, 다른 사용자들이나 다른 기기에서는 보이지 않습니다. 웹 서버를 통해 변경 사항을 영구적으로 적용하려면 해당 웹 페이지를 호스팅하는 서버에 수정한 HTML을 업로드해야 합니다.

개발자 정리

  1. ctrl + shift + c를 누른다.
  2. 변경하고자 하는 화면에 마우스를 가져간다.
  3. 클릭한다. 변경하고자 하는 것의 HTML 코드를 알 수 있다.

  • 위와 같이 수정한 HTML을 Local file로 저장을 하려고 한다면 요소의 최상위 HTML로 이동해서 클릭 후, HTML 수정을 눌러 복사하면 된다. 그러나 유의할 점은 Online HTML Editor에서 수정했다면 당연히 Online HTML Editor 전체의 소스가 복사된다는 점이다. 그러니 온라인 HTML에서 수정 시에는 위치정도만 파악하는 목적으로 사용하는 것이 좋다.
  • 크롬에서 HTML을 변경시 요령
    • elelement 별로 수정 및 삭제
    • 요소의 최상위 HTML로 이동해서 클릭 후 → HTML 수정을 눌러 복사 후 → 다른 에디터에 백업
    • 문제가 발생 시, 백업한 내용을 최상위 html을 선택 후, html 수정을 눌러 붙여넣기

nodejs에서 Sqlite 사용하기

Person:

1
2
3
4
5
6
7
8
0. [제목:String], [설명:String], [제작자:String]를 sqlite로 db로 만든다.
1. node.js에서 ejs로 개발한다.
2. node.js에서 index.html로 요청이 들어올 시
index.ejs 파일을 읽어온다.
node.js에서 보낸 값으로
제목, 설명, 제작자의 정보를 출력한다.

6. index.html과 node.js 소스를 만들어주세요

ChatGPT:

  • 아래는 요구사항에 맞게 index.html과 node.js 소스 코드를 작성한 예시입니다. 주의: 이 예시는 실제 서버에서 동작하지 않으며, 개발 및 학습용으로만 사용해야 합니다.

index.html:

1
2
3
4
5
6
7
8
9
10
11
12

<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
</head>
<body>
<h1><%= title %></h1>
<p><%= description %></p>
<p>제작자: <%= author %></p>
</body>
</html>

app.js (node.js):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

const express = require('express');
const app = express();
const ejs = require('ejs');
const sqlite3 = require('sqlite3').verbose();

// SQLite DB 연결
const db = new sqlite3.Database('mydb.db', (err) => {
if (err) {
console.error(err.message);
}
console.log('Connected to the database.');
});

// 루트 경로에서 index.ejs 렌더링
app.get('/', (req, res) => {
// SQLite DB에서 데이터 조회
db.get('SELECT * FROM mytable', (err, row) => {
if (err) {
console.error(err.message);
return res.status(500).send('Internal Server Error');
}

// index.ejs 렌더링 및 데이터 전달
ejs.renderFile('index.ejs', {
title: row.title,
description: row.description,
author: row.author
}, (err, renderedHtml) => {
if (err) {
console.error(err.message);
return res.status(500).send('Internal Server Error');
}
res.send(renderedHtml);
});
});
});

// 서버 시작
const port = 3000;
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});

위의 코드 예시는 다음과 같은 과정을 수행합니다:

  1. index.html은 EJS 문법(<%= %>)을 사용하여 동적으로 제목, 설명, 제작자 정보를 표시하는 간단한 HTML 템플릿입니다.
  2. app.js는 Express와 EJS를 사용하여 웹 서버를 구성합니다.
  3. SQLite 데이터베이스를 연결하고, mytable에서 제목, 설명, 제작자 정보를 가져옵니다.
  4. 웹 서버에 들어오는 루트 경로 요청(http://localhost:3000/)에 대해 index.ejs 파일을 렌더링하여 클라이언트에 전달합니다.
  5. index.ejs는 SQLite DB에서 조회한 값으로 제목, 설명, 제작자 정보를 출력하고, 브라우저로 전달합니다.

이 예시 코드를 실행하려면 먼저 express, ejs, sqlite3 라이브러리를 설치해야 합니다. 프로젝트 폴더에서 아래 명령을 실행하세요:

1
2

npm install express ejs sqlite3

그리고 index.htmlapp.js 파일을 프로젝트 폴더에 생성한 후, SQLite DB 파일(mydb.db)을 생성하여 데이터를 채워넣어야 합니다. 데이터베이스 생성 및 테이블 작성은 이 예시의 범위를 벗어나므로 자세한 내용은 생략하겠습니다.

이후 아래 명령을 실행하여 서버를 실행합니다:

1
2

node app.js

웹 브라우저에서 http://localhost:3000/로 접속하면 index.html에 작성된 내용과 SQLite DB에서 조회한 값이 출력되는 페이지를 확인할 수 있습니다.

Person:

  • [제목:String], [설명:String], [제작자:String]를 sqlite로 db로 만들기 위해 해야할 일을 알려주세요

ChatGPT:

  • SQLite 데이터베이스를 만들고, 해당 데이터베이스에 [제목:String], [설명:String], [제작자:String]를 저장하기 위해 다음과 같은 일들을 해야 합니다:
  1. SQLite 설치: SQLite를 사용하려면 먼저 시스템에 SQLite를 설치해야 합니다. SQLite는 오픈 소스이며, 공식 웹사이트에서 다운로드하여 설치할 수 있습니다. 또는 시스템 패키지 관리자를 통해 SQLite를 설치할 수도 있습니다.
  2. 데이터베이스 파일 생성: SQLite는 파일 기반 데이터베이스를 사용합니다. 데이터를 저장할 SQLite 데이터베이스 파일을 생성해야 합니다.
  3. 데이터베이스 스키마 설계: 데이터베이스 스키마는 테이블의 구조를 정의합니다. 데이터베이스 테이블에는 [제목:String], [설명:String], [제작자:String]를 저장할 수 있는 컬럼이 필요합니다.
  4. SQLite 데이터베이스에 연결: 애플리케이션에서 SQLite 데이터베이스를 사용하려면 데이터베이스에 연결해야 합니다.
  5. 테이블 생성: 데이터베이스에 저장할 데이터를 담을 테이블을 생성해야 합니다. 위의 스키마 설계를 기반으로 테이블을 생성합니다.
  6. 데이터 추가: 테이블에 [제목:String], [설명:String], [제작자:String] 데이터를 추가합니다.

아래는 Node.js에서 SQLite를 사용하여 데이터베이스를 생성하고 테이블을 만들고 데이터를 추가하는 예시 코드입니다. Node.js에서 SQLite를 사용하려면 먼저 ‘sqlite3’ 모듈을 설치해야 합니다.

1
2

npm install sqlite3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

const sqlite3 = require('sqlite3').verbose();

// 데이터베이스 파일 생성 및 연결
const db = new sqlite3.Database('mydb.db', (err) => {
if (err) {
console.error(err.message);
return;
}
console.log('Connected to the database.');

// 테이블 생성
db.run(`
CREATE TABLE IF NOT EXISTS mytable (
id INTEGER PRIMARY KEY,
title TEXT,
description TEXT,
author TEXT
)
`, (err) => {
if (err) {
console.error(err.message);
return;
}
console.log('Table "mytable" created.');

// 데이터 추가
const title = 'Sample Title';
const description = 'This is a sample description.';
const author = 'John Doe';

db.run('INSERT INTO mytable (title, description, author) VALUES (?, ?, ?)',
[title, description, author], (err) => {
if (err) {
console.error(err.message);
return;
}
console.log('Data inserted successfully.');

// 데이터베이스 연결 종료
db.close((err) => {
if (err) {
console.error(err.message);
return;
}
console.log('Database connection closed.');
});
});
});
});

위의 코드는 다음과 같은 작업을 수행합니다:

  1. ‘mydb.db’라는 SQLite 데이터베이스 파일을 생성하고 연결합니다.
  2. ‘mytable’이라는 테이블을 생성합니다. 해당 테이블에는 id(자동 생성된 고유 번호), title, description, author라는 컬럼이 있습니다.
  3. ‘mytable’에 샘플 데이터를 추가합니다. 이 예시에서는 하나의 레코드만 추가했습니다.
  4. 데이터베이스 연결을 종료합니다.

위의 예시 코드를 실행하면 ‘mydb.db’ 파일이 생성되고, ‘mytable’ 테이블이 생성되며, 샘플 데이터가 추가됩니다. 이제 앞서 작성한 Node.js와 EJS 코드에서 해당 데이터베이스를 사용하여 제목, 설명, 제작자 정보를 가져와서 렌더링할 수 있을 것입니다.

Person:

  • 위의 소스에서 브라우저에서 /input을 요청하면
    제목, 설명, 제작자를 입력하는 화면이 나온다.
    그곳에서 입력하면
    db에 저장되는 기능을 추가해줘

ChatGPT:

  • 앞서 작성한 코드에 “제목, 설명, 제작자를 입력하는 화면이 나오는 기능”을 추가하고, 사용자가 입력한 데이터를 SQLite 데이터베이스에 저장하는 기능을 구현해보겠습니다.

아래는 이러한 기능을 추가한 코드 예시입니다:

index.html:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
</head>
<body>
<h1><%= title %></h1>
<p><%= description %></p>
<p>제작자: <%= author %></p>

<h2>데이터 입력</h2>
<form action="/input" method="POST">
<label for="inputTitle">제목:</label>
<input type="text" id="inputTitle" name="title" required><br>

<label for="inputDescription">설명:</label>
<input type="text" id="inputDescription" name="description" required><br>

<label for="inputAuthor">제작자:</label>
<input type="text" id="inputAuthor" name="author" required><br>

<button type="submit">저장</button>
</form>
</body>
</html>

app.js (Node.js):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

const express = require('express');
const app = express();
const ejs = require('ejs');
const bodyParser = require('body-parser');
const sqlite3 = require('sqlite3').verbose();

// SQLite DB 연결
const db = new sqlite3.Database('mydb.db', (err) => {
if (err) {
console.error(err.message);
}
console.log('Connected to the database.');
});

// Body-parser 미들웨어 등록
app.use(bodyParser.urlencoded({ extended: true }));

// 루트 경로에서 index.ejs 렌더링
app.get('/', (req, res) => {
// SQLite DB에서 데이터 조회
db.get('SELECT * FROM mytable', (err, row) => {
if (err) {
console.error(err.message);
return res.status(500).send('Internal Server Error');
}

// index.ejs 렌더링 및 데이터 전달
ejs.renderFile('index.ejs', {
title: row.title,
description: row.description,
author: row.author
}, (err, renderedHtml) => {
if (err) {
console.error(err.message);
return res.status(500).send('Internal Server Error');
}
res.send(renderedHtml);
});
});
});

// 데이터 입력 페이지 렌더링
app.get('/input', (req, res) => {
ejs.renderFile('input.ejs', (err, renderedHtml) => {
if (err) {
console.error(err.message);
return res.status(500).send('Internal Server Error');
}
res.send(renderedHtml);
});
});

// 데이터 입력 처리
app.post('/input', (req, res) => {
const title = req.body.title;
const description = req.body.description;
const author = req.body.author;

// 데이터 삽입
db.run('INSERT INTO mytable (title, description, author) VALUES (?, ?, ?)',
[title, description, author], (err) => {
if (err) {
console.error(err.message);
return res.status(500).send('Internal Server Error');
}
console.log('Data inserted successfully.');
res.redirect('/');
});
});

// 서버 시작
const port = 3000;
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});

위의 코드 예시는 다음과 같은 변경을 수행합니다:

  1. index.html에 데이터 입력을 위한 form을 추가합니다. 사용자가 제목, 설명, 제작자를 입력하고 “저장” 버튼을 누르면 /input 경로로 POST 요청이 전송됩니다.
  2. app.js에 /input 경로에 대한 GET 및 POST 핸들러를 추가합니다. GET 요청 시 “input.ejs”를 렌더링하여 데이터 입력 페이지를 보여줍니다. POST 요청 시 사용자가 입력한 데이터를 SQLite 데이터베이스에 삽입합니다.
  3. 데이터 삽입 후에는 / 경로로 리다이렉션하여 변경된 데이터를 확인할 수 있도록 합니다.

위의 코드를 실행하고 http://localhost:3000/input에 접속하면 데이터 입력 페이지가 나타납니다. 사용자가 데이터를 입력하고 저장하면 SQLite 데이터베이스에 저장되고, 메인 페이지(http://localhost:3000/)에서 변경된 데이터를 확인할 수 있습니다.

Person:

  • 위의 form 입력화면인 index.html을 cms.html로 바꾸어주고 node.js에서 호출할 수 있도록 만들어주세요

ChatGPT:

  • Sure! 아래는 cms.html로 변경한 예시 코드입니다. 그리고 app.js에서 /cms 경로에 대한 핸들러를 추가하여 cms.html을 렌더링할 수 있도록 합니다.

cms.html:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

<!DOCTYPE html>
<html>
<head>
<title>CMS - 데이터 입력</title>
</head>
<body>
<h2>데이터 입력</h2>
<form action="/input" method="POST">
<label for="inputTitle">제목:</label>
<input type="text" id="inputTitle" name="title" required><br>

<label for="inputDescription">설명:</label>
<input type="text" id="inputDescription" name="description" required><br>

<label for="inputAuthor">제작자:</label>
<input type="text" id="inputAuthor" name="author" required><br>

<button type="submit">저장</button>
</form>
</body>
</html>

app.js (Node.js):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

const express = require('express');
const app = express();
const ejs = require('ejs');
const bodyParser = require('body-parser');
const sqlite3 = require('sqlite3').verbose();

// SQLite DB 연결
const db = new sqlite3.Database('mydb.db', (err) => {
if (err) {
console.error(err.message);
}
console.log('Connected to the database.');
});

// Body-parser 미들웨어 등록
app.use(bodyParser.urlencoded({ extended: true }));

// 루트 경로에서 index.ejs 렌더링
app.get('/', (req, res) => {
// SQLite DB에서 데이터 조회
db.get('SELECT * FROM mytable', (err, row) => {
if (err) {
console.error(err.message);
return res.status(500).send('Internal Server Error');
}

// index.ejs 렌더링 및 데이터 전달
ejs.renderFile('index.ejs', {
title: row.title,
description: row.description,
author: row.author
}, (err, renderedHtml) => {
if (err) {
console.error(err.message);
return res.status(500).send('Internal Server Error');
}
res.send(renderedHtml);
});
});
});

// CMS 페이지 렌더링
app.get('/cms', (req, res) => {
ejs.renderFile('cms.html', (err, renderedHtml) => {
if (err) {
console.error(err.message);
return res.status(500).send('Internal Server Error');
}
res.send(renderedHtml);
});
});

// 데이터 입력 처리
app.post('/input', (req, res) => {
const title = req.body.title;
const description = req.body.description;
const author = req.body.author;

// 데이터 삽입
db.run('INSERT INTO mytable (title, description, author) VALUES (?, ?, ?)',
[title, description, author], (err) => {
if (err) {
console.error(err.message);
return res.status(500).send('Internal Server Error');
}
console.log('Data inserted successfully.');
res.redirect('/');
});
});

// 서버 시작
const port = 3000;
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});

위의 코드를 실행하고 http://localhost:3000/cms에 접속하면 데이터 입력 페이지인 cms.html이 나타납니다. 사용자가 데이터를 입력하고 저장하면 SQLite 데이터베이스에 저장되고, 메인 페이지(http://localhost:3000/)에서 변경된 데이터를 확인할 수 있습니다.

hexo 설정

install

node.js가 설치되었다는 가정하에 아래커맨드로 설치

1
npm install -g hexo-cli

TODO

hexo가 설치된 상황에서 hexo project 설정 시

1
npm install

특수태그

Hexo에서 markdown에서만 사용가능한 특수태그

1.source code처리

1
2
3
{% codeblock Array.map %}
array.map(callback[, thisArg])
{% endcodeblock %}

아래는 결과

Array.map
1
array.map(callback[, thisArg])

2.강조인용

1
2
3
{% blockquote David Levithan, Wide Awake %}
Do not just seek happiness for yourself. Seek happiness for all. Through kindness. Through mercy.
{% endblockquote %}

아래는 결과

Do not just seek happiness for yourself. Seek happiness for all. Through kindness. Through mercy.

David LevithanWide Awake

3. youtube

1
{% youtube rs5YzOOD24w %}

아래는 결과

4. jsfiddle

1
{% jsfiddle g64atfz2 html,css,result %}

아래는 결과

SEO

플러그인 설치로 SEO 가능하게 하기

  1. 대표 URL 설치(npm install –save hexo-auto-canonical)
    설치 후, 설정된 테마의 head.ejs 소스의 meta 영역에 다음과 같은 코드를 기입해야 한다.
1
<%- autoCanonical(config, page) %>

그리고 root에 있는 _config.yml에 다음과 같이 서비스될 사이트 주소를 명시해야 한다. 다음 예제에서는 “https://adsloader.bitbucket.io"로 설정을 했다.

1
2
3
4
5
6
7
8
9
10
11

# URL
## Set your site url here. For example, if you use GitHub Page, set url as 'https://username.github.io/project'
url: https://adsloader.bitbucket.io
permalink: :year/:month/:day/:title/
permalink_defaults:
pretty_urls:
trailing_index: true # Set to false to remove trailing 'index.html' from permalinks
trailing_html: true # Set to false to remove trailing '.html' from permalinks


  1. sitemap 자동생성(npm install hexo-generator-seo-friendly-sitemap –save)

설치 후, 다음과 같이 _config.yml에 sitemap 정보를 저장한다.

1
2
3
4
5
sitemap:
path: sitemap.xml
tag: false
category: false