안녕하세요? 선생님. 다름이 아니라 실습을 따라하면서 템블릿을 복제해 오니깐 아래와 같은 메시지가 표시됩니다. 블록도 많이 사용한 것 까지 않고 무료 요금제도 블록 생성 개수에 제한이 없다고 들었는데, 말입니다. ㅠ.ㅠ 무료 요금제 이지만 워크스페이스에 멤버를 초대하면 블록 생성 개수에 제한을 받나요? 네~ 시원한 여름. 되시기 바라며
jwt 부분을 다 듣고 아래 테스트 수업 듣는 중입니다. 사용자 로그인 시에 우리가 jwt를 발급하고, 사용자가 매 요청마다 이걸 가져오면 검증하는 건 이해가 됐습니다. 그러다 문득 궁금해진 게, 저희가 테스트할 때는 포스트맨을 통해 헤더의 Authorization에 토큰을 직접 넣어주었습니다. 하지만 실제 어플리케이션에선 사용자가 직접 이 작업을 하지는 않죠. 그렇다면 사용자 요청 헤더의 Authorization에 토큰을 포함해야 하는 건 서버 측에서 해야할 일 같은데 이에 대한 강의는 없는 것 같습니다. 혹시 자세하게는 아니라도 대충 어떠하게 흘러가는 지 알려주실 수 있을까요??
비전공자를 위한 풀스택 맛집지도 만들기 프로젝트!: Front, Back-end 그리고 배포까지
안녕하세요 선생님 강의를 따라하는 도중 제가 실수로 port번호를 입력하지 않아 수정 후 다시 git에 push를 하고 새로 업데이트된 내용을 적용시키기위해 PuTTY에서 git pull을 하였습니다. 그런데도 마커가 뜨지 않아서 브라우저 개발자도구를 살펴보니 수정한 port번호가 추가 되어있지 않더라구요 ㅠㅠㅠ 이럴때는 어떤방법을 시도해보아야하나요..?
안녕하세요 루키스님! 강의 언제나 잘 보고 있습니다! https://www.inflearn.com/questions/801980/%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%98%EB%A8%B8-%EC%BB%A4%EB%A6%AC%EC%96%B4-%EA%B3%A0%EB%AF%BC 몇달전에 해당 질문 글을 올리고 빡세게 공부해 서버 면접에 최종 합격했습니다! 최종 합격은 한곳만 했고 아직 다른곳은 진행중인 상태입니다. 다만 아쉬운점이 연봉 문제로 현재 회사에서 사천 중반 정도를 받고있는데 최종 합격한 회사에서는 연봉을 삼천 후반대로 제시해주시더라구요.. 서버 신입으로 지원했다보니 어느정도 감봉은 예상했지만 생각보다 액수가 커 고민중인 상황입니다. 이정도는 감수하는게 보통일까요? 바쁘신데 강의 내용에 관한 질문이 아니라 죄송합니다 ㅠㅠ
안녕하세요 교수님 CNN에 대해 궁금한 점이 있어 질문 남깁니다. CNN으로 이미지 분류를 수행할 때, 인풋데이터로 이미지가 아닌 수치형 데이터를 넣어도 분류가 가능한가요? 예를 들면, 수치형 데이터의 색을 부여한 후,(0이면 흰색에 가깝게, 100이면 검은색에 가깝게) 색을 부여한 이미지로 분류를 수행하는 것이 가능한 건가요? 위에서 말하는 색 이미지를 파이썬 코드로 대체하여 출력을 하지 않고도(따로 인풋 데이터로 이미지를 제공하지 않아도) CNN의 이미지 분류가 가능한 것인지 궁금합니다.
[Bloc 응용] 실전 앱 만들기 (책 리뷰 앱) : SNS 로그인, Firebase 적용, Bloc 상태 관리, GoRouter
강의 내용 따라하면서 하고 있는데요 강사님하고는 다르게 아래와 같이 기본값을 넣어라 정의되어 있지 않다? 아래 캡쳐와 같이 나오더라구요 막혀서 더이상 진행이 안되고 있는데 제가 한 부분 첨부 드리니 확인 부탁드릴께요! https://drive.google.com/file/d/1609gWfNr-B7Nvc9dlBW9ve_zGff89gd2/view?usp=sharing
import { DataSource } from 'typeorm'; import dotenv from 'dotenv'; import { ChannelChats } from './src/entities/ChannelChats'; import { ChannelMembers } from './src/entities/ChannelMembers'; import { Channels } from './src/entities/Channels'; import { DMs } from './src/entities/DMs'; import { Mentions } from './src/entities/Mentions'; import { Users } from './src/entities/Users'; import { WorkspaceMembers } from './src/entities/WorkspaceMembers'; import { Workspaces } from './src/entities/Workspaces'; dotenv.config(); const dataSource = new DataSource({ type: 'mysql', host: 'localhost', port: 3306, username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, database: process.env.DB_DATABASE, entities: [ ChannelChats, ChannelMembers, Channels, DMs, Mentions, Users, WorkspaceMembers, Workspaces, ], migrations: [__dirname + '/src/migrations/*.ts'], charset: 'utf8mb4_general_ci', synchronize: false, logging: true, }); export default dataSource; 에러! Error: Can't add new command when connection is in closed state at Connection._addCommandClosedState (/Users/minchankim/Desktop/study/nestToy/node_modules/mysql2/lib/connection.js:148:17) at Connection.end (/Users/minchankim/Desktop/study/nestToy/node_modules/mysql2/lib/connection.js:855:26) at Query.onResult (/Users/minchankim/Desktop/study/nestToy/node_modules/typeorm-extension/dist/database/driver/mysql.js:27:28) at Connection._notifyError (/Users/minchankim/Desktop/study/nestToy/node_modules/mysql2/lib/connection.js:228:17) at Connection._handleFatalError (/Users/minchankim/Desktop/study/nestToy/node_modules/mysql2/lib/connection.js:167:10) at Connection._handleNetworkError (/Users/minchankim/Desktop/study/nestToy/node_modules/mysql2/lib/connection.js:180:10) at Socket.emit (node:events:513:28) at Socket.emit (node:domain:489:12) at emitErrorNT (node:internal/streams/destroy:151:8) at emitErrorCloseNT (node:internal/streams/destroy:116:3) { fatal: true } 계속 이렇게 나오는데 npm run db:create 데이터베이스 정보확인 및 dotenv도 재설치 해봤는데 계속 안되서 질문드립니다!버전에 문제가 있나 싶어서 강사님 package.json에서 그대로 불러왔습니다!
RFID RC522 카드 태그 모듈의 여러 정보를 SPI 통신을 통해 beaglebone 보드로 전송하고 이를 다시 PC로 UART 통신하려고 합니다. 그전에 SPI_DEVICE 경로 및 UART_DEVICE 경로 모두 확인했고 spidev까지 존재함을 확인한 상태입니다. 이때 아래와 같이 코드를 완성했는데, 실제로 실행해보면 태그 감지나 정보가 통신되지 않습니다.. 안되는 이유를 조금 생각해보자면 그나마 유력한 용의자가 데이터 패턴 값 부분일 것 같은데, AVR과제 도어락 : 네이버 카페 ( naver.com ) 위 카페의 내용(URL 접속이 안되므로 "네이버 검색: RFID 0x52 0x93" 으로 찾을 수 있습니다.)과 MFRC522(RFID RC522) datasheet를 보고 넣었는데 무엇이 잘못작성되었을까요? #define SPI_DEVICE "/dev/spidev9.0" // SPI 장치 경로(X: 버스 번호, Y: 장치 번호) #define UART_DEVICE "/dev/ttyS0" // UART 장치 경로 #define SS_PIN 328 // SPI SS(Chip Select) GPIO 핀 번호 #define MOSI_PIN 339 #define MISO_PIN 340 #define SCK_PIN 338 #define MFRC522_PICC_TYPE_MIFARE_MINI 0x09 #define MFRC522_PICC_TYPE_MIFARE_1K 0x04 #define MFRC522_PICC_TYPE_MIFARE_4K 0x02 int spi_fd; int uart_fd; // UART 파일 디스크립터 추가 // SPI 통신 초기화 int SpiInit() { spi_fd = open(SPI_DEVICE, O_RDWR); // SPI 모드 설정 uint8_t mode = SPI_MODE_0; ioctl(spi_fd, SPI_IOC_WR_MODE, &mode); // 최대 전송 속도 설정 (1MHz) uint32_t speed = 1000000; ioctl(spi_fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed); return 0; } // SPI 데이터 송수신 int SpiTransfer(uint8_t* tx_data, uint8_t* rx_data, int len) { struct spi_ioc_transfer spi_transfer = { .tx_buf = (unsigned long)tx_data, // 송신할 데이터가 저장된 버퍼 주소 지정 .rx_buf = (unsigned long)rx_data, // 수신된 데이터를 저장할 버퍼 주소 지정 .len = len, // 송수신할 데이터의 길이 지정 .delay_usecs = 0, .speed_hz = 1000000, .bits_per_word = 8, }; if (ioctl(spi_fd, SPI_IOC_MESSAGE(1), &spi_transfer) < 0) { printf("SPI transfer error\n"); return -1; } return 0; } // MFRC522 초기화 void MFRC522Init() { uint8_t tx_data[] = {0x0F}; // MFRC522에 softreset 명령어를 전송하기 위한 데이터 값 uint8_t rx_data[sizeof(tx_data)]; if (SpiTransfer(tx_data, rx_data, sizeof(tx_data)) < 0) { printf("Failed to send SPI message\n"); return; } usleep(5000); // 잠시 대기 } // 카드가 존재하는지 확인 int PiccIsNewCardPresent() { uint8_t tx_data[] = {0x52}; // MFRC522에 해당 함수를 전송하기 위한 데이터 패턴 값, 0x52 : find all the cards antenna area uint8_t rx_data[sizeof(tx_data)]; memset(rx_data, 0, sizeof(rx_data)); if (SpiTransfer(tx_data, rx_data, sizeof(tx_data)) < 0) { // SPI 통신 실패 시 카드 존재 여부 확인 불가를 판별하기 위함. printf("Failed to transfer data\n"); return -1; } return rx_data[1]; } // 카드 UID 정보 읽기 int PiccReadCardSerial(uint8_t* uid) { uint8_t tx_data[] = {0x93}; // MFRC522에 해당 함수를 전송하기 위한 데이터 패턴 값, 0x93 : election card uint8_t rx_data[sizeof(tx_data)]; memset(rx_data, 0, sizeof(rx_data)); if (SpiTransfer(tx_data, rx_data, sizeof(tx_data)) < 0) { printf("Failed to transfer data\n"); return -1; } memcpy(uid, &rx_data[1], 4); return 0; } // 카드 타입 가져오기 uint8_t PiccGetType(uint8_t sak) { // select Acknowledge, 카드 유형 정보를 나타내는 7비트 값 반환 return sak & 0x7F; } // 카드 타입명 가져오기 const char* PiccGetTypeName(uint8_t piccType) { switch (piccType) { case MFRC522_PICC_TYPE_MIFARE_MINI: return "MIFARE Mini"; case MFRC522_PICC_TYPE_MIFARE_1K: return "MIFARE 1K"; case MFRC522_PICC_TYPE_MIFARE_4K: return "MIFARE 4K"; default: return "Unknown"; } } // 16진수로 변환하여 출력 void printHex(uint8_t* data, uint8_t length) { for (uint8_t i = 0; i < length; i++) { printf("%02X", data[i]); } } // UART 초기화 int UartInit() { uart_fd = open(UART_DEVICE, O_RDWR | O_NOCTTY); if (uart_fd < 0) { printf("Failed to open UART\n"); return -1; } struct termios options; tcgetattr(uart_fd, &options); // import current setting // 전송 속도 설정 (9600 bps) cfsetispeed(&options, B9600); cfsetospeed(&options, B9600); // 데이터 비트, 패리티 비트, 정지 비트 설정 options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB; options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; // 제어 옵션 설정 // options.c_cflag &= ~CRTSCTS; options.c_cflag |= CREAD | CLOCAL; options.c_iflag &= ~(IXON | IXOFF | IXANY); options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); options.c_oflag &= ~OPOST; tcsetattr(uart_fd, TCSANOW, &options); // apply new settings to uart_fd return 0; } // UART로 데이터 전송 void WriteUidUart(const char* data) { write(uart_fd, data, strlen(data)); } void delay(int seconds) { struct timespec req, rem; req.tv_sec = seconds; req.tv_nsec = 0; while (nanosleep(&req, &rem) == -1) { req = rem; } } int main() { // SS 핀 설정 int ss_gpio_fd; // fd : 파일 디스크립터로, 특정 파일에 접근할 때 사용하는 추상적인 값 char ss_gpio_path[64]; // SS 핀 열기 snprintf(ss_gpio_path, sizeof(ss_gpio_path), "/sys/class/gpio/gpio%d/value", SS_PIN); ss_gpio_fd = open(ss_gpio_path, O_WRONLY); // O_WRONLY : 파일을 쓰기 전용으로 열기 플래그 // SS 핀을 출력으로 설정 write(ss_gpio_fd, "out", 3); // or "in" // 파일 디스크립터에 out 이라는 문자열을 쓰기 위해, 데이터 길이인 3만큼을 파일에 씀. // MOSI 핀 설정 int mosi_gpio_fd; char mosi_gpio_path[64]; // MOSI 핀 열기 snprintf(mosi_gpio_path, sizeof(mosi_gpio_path), "/sys/class/gpio/gpio%d/value", MOSI_PIN); mosi_gpio_fd = open(mosi_gpio_path, O_WRONLY); // MOSI 핀을 출력으로 설정 write(mosi_gpio_fd, "out", 3); // MOSI value high write(mosi_gpio_fd, "1", 1); // MOSI 핀 닫기 close(mosi_gpio_fd); // MISO 핀 설정 int miso_gpio_fd; char miso_gpio_path[64]; // MISO 핀 열기 snprintf(miso_gpio_path, sizeof(miso_gpio_path), "/sys/class/gpio/gpio%d/value", MISO_PIN); miso_gpio_fd = open(miso_gpio_path, O_WRONLY); // MISO 핀을 입력으로 설정 write(miso_gpio_fd, "in", 2); // MISO 핀 닫기 close(miso_gpio_fd); // SCK 핀 설정 int sck_gpio_fd; char sck_gpio_path[64]; // SCK 핀 열기 snprintf(sck_gpio_path, sizeof(sck_gpio_path), "/sys/class/gpio/gpio%d/value", SCK_PIN); sck_gpio_fd = open(sck_gpio_path, O_WRONLY); // SCK 핀을 출력으로 설정 write(sck_gpio_fd, "out", 3); // SCK value high write(sck_gpio_fd, "1", 1); // SCK 핀 닫기 close(sck_gpio_fd); // SPI 통신 초기화 if (SpiInit() != 0) { return -1; } // MFRC522 초기화 MFRC522Init(); // UART 통신 초기화 if (UartInit() != 0) { return -1; } uint8_t nuidPICC[4] = {0}; // 이전 카드 UID 저장 while (1) { // 카드가 인식되었다면 다음으로 넘어가고 아니면 더이상 실행하지 않음 if (!PiccIsNewCardPresent()) continue; // ID가 읽혀졌다면 다음으로 넘어가고 아니면 더이상 실행하지 않음 if (!PiccReadCardSerial(nuidPICC)) continue; // SS 핀에 값 쓰기 (1로 설정) write(ss_gpio_fd, "1", 1); // high printf("PICC type: "); // 카드의 타입을 읽어옴 uint8_t piccType = PiccGetType(nuidPICC[0]); // 모니터에 출력 printf("%s\n", PiccGetTypeName(piccType)); // MIFARE 방식인지 확인하고 아니면 리턴 if (piccType != MFRC522_PICC_TYPE_MIFARE_MINI && piccType != MFRC522_PICC_TYPE_MIFARE_1K && piccType != MFRC522_PICC_TYPE_MIFARE_4K) { printf("Your tag is not of type MIFARE Classic.\n"); continue; } // 만약 바로 전에 인식한 RF 카드와 다를 경우. 즉, 카드의 중복 감지를 방지하기 위함. if (nuidPICC[0] != nuidPICC[0] || nuidPICC[1] != nuidPICC[1] || nuidPICC[2] != nuidPICC[2] || nuidPICC[3] != nuidPICC[3]) { printf("A new card has been detected.\n"); // ID를 저장해둠 memcpy(nuidPICC, nuidPICC, sizeof(nuidPICC)); // 모니터 출력 printf("The NUID tag is:\n"); printf("In hex: "); // 16진수로 변환하여 출력 printHex(nuidPICC, sizeof(nuidPICC)); printf("\n"); // UART를 통해 카드 정보를 PC로 전송 char uartData[9]; snprintf(uartData, sizeof(uartData), "%02X%02X%02X%02X\n", nuidPICC[0], nuidPICC[1], nuidPICC[2], nuidPICC[3]); WriteUidUart(uartData); } // SS 핀에 값 쓰기 (0로 설정) write(ss_gpio_fd, "0", 1); // low // PICC 종료 // usleep(3000000); delay(3); if (piccType > 0) { break; } } close(spi_fd); close(uart_fd); // SS 핀 닫기 close(ss_gpio_fd); return 0; }
강사님 안녕하세요, 8주차 개념강의 중 질문입니다. [알고리즘 강의] 8주차. 펜윅트리와 최단거리.. : 네이버블로그 ( naver.com ) 강의 노트 웹페이지에 2번째 그림에서, "2~8 까지의 최소인덱스 3번째 4번째 6번째 인덱스만 비교해서 최소 인덱스를 반환" 이라는 말이 잘 이해가 안되어서요. 그림상 파란 화살표 표시한 것이 3,4,6 인덱스를 의미 하는 것인지 그리고, 3,4,6째 인덱스를 비교한다는 것이 왜 필요한 것인지 궁금합니다. 제가 이해한 것은 2~8 까지의 최소 인덱스는 Level 1 에 저장된 Index 3 만 확인하여 Index 3 에 위치한 "1" 이 최소값인 것으로 이해를 했거든요. 강의 노트 웹페이지에서 5번째 그림에서, 파랑 노드를 만들면 된다고 갑자기 설명을 하시는데, (강의 3:03 구간) 그림상 주황색 노드(3,4,10,11)의 의미, 파랑색 노드(1,2,3,4)의 의미에 대한 안내도 없고... 그림에 표시된 화살표도 어떤 연산이 수행되었고, 화살표로 연결된 두 노드의 관계에 대한 설명도 없어 이해가 되지 않습니다. 관련 내용 상세 설명 좀 다시 부탁드리겠습니다.
OpenGL 쉐이더 (2) shader 3D 그래픽스 - 프로그래머블 파이프라인, 기하학 기초, 삼각형 출력
안녕하세요. 질문이 한개 더 있습니다 ! fragment shader 역할이 헷갈리는데.. 이미 fixed hardware 단계에서 bi-linear interpolation을 통해서 색깔을 채워준다면 frament shader는 픽셀+관련정보를 저장만 하는 역할인가요? 이미 색에 관한 정보를 입력했으면 프래그먼트 셰이더는 생략해도 되는것인지 궁금합니다...