안녕하세요! 강의 잘 보고 있습니다. 강의를 보는 중에 헷갈리는 개념이 있어서 질문드려요! 올려주신 강의 중 미들웨어 챕터 부분을 보고 있어요. 그런데 문득 미들웨어와 uvicorn, gunicorn, hypercorn 과 같은 WSGI, ASGI 서버 간의 관계에 대해서 궁금증이 들었습니다. 보통 언어에 상관없이 웹 통신을 한다라고 하면 아래와 같은 구조로 통신한다고 볼 수 있잖아요?(DB가 있다고 가정) """ Client(Web Browser) ---> Web Server ---> Web Application Server ---> DB """ 그리고 파이썬에서는 uvicorn, gunicorn 과 같은 WSGI, ASGI 서버들이 Web Server 역할을, Flask, FastAPI 와 같은 프레임워크 서버들이 Web Application Server의 역할을 한다고 알고 있습니다. 그리고 저 Web Server 요소가 미들웨어라고 정의한다고 알고 있었는데요! 그런데 FastAPI 공식문서 상 에서는 미들웨어라는 것을 소개할 때, "모든 요청 또는 응답에 대해서 사전 또는 사후 처리 로직을 추가할 때 사용하는 것" 이라고 소개를 하면서 문득 "그러면 여기서 이야기하는 미들웨어랑 uvicorn, gunicorn 과는 어떤 차이점이 있는거지?" 하면서 헷갈리더라구요. 자바에서는 미들웨어라는 개념이 JVM 위에서 동작하면서 DB 연결, TCP/IP 연결 등과 같이 다른 소프트웨어(ex.애플리케이션)가 잘 동작하도록 지원해주는 소프트웨어라고 알고 있는데요! 만약 이러한 관점에서 본다면 uvicorn, gunicorn 과 같은 WSGI 또는 ASGI 서버들도 미들웨어라고 볼 수는 없는 걸까요? ChatGPT 한테 물어보았을 때는 엄연히 다른 개념이라고 하는데.. 정확히 차이점을 잘 모르겠어서요. 답변 해주시면 감사하겠습니다! (참고로 저는 파이썬으로만 오랫동안 개발해와서 자바나 다른 언어 관련해서는 잘 모를 수도 있어서 다른 언어에 대한 비유로 답변 주시면 제가 잘 이해를 못할 수도 있습니다!)
안녕하세요, 영한님. 이번 강의 9분 10초쯤에 flag 와 count 변수에 volatile 키워드를 추가하셨는데, 저는 flag 변수에만 volatile 키워드를 사용해도 예제 코드가 정상적으로 동작할 것으로 예상했습니다. 실제로 flag 변수에만 volatile 키워드를 붙이고 실행해보니 main 스레드에서 가져온 task.count 와 work 스레드에서 가져온 count 의 값이 동일했습니다. 또한 volatile 키워드를 모두 사용하지 않았을 때를 기준으로 flag 변수에만 사용했을 때 약 2배, flag 와 count 변수 모두 사용했을 때 약 5배 정도 성능이 저하되는 것을 확인했습니다. 그럼에도 불구하고 count 에도 volatile 키워드를 사용하신 이유가 있을까요? 제가 생각하지 못한 예외 상황이 있을까요?
다른 분 질문의 답변을 봐도 이해가 잘 안되서 질문 남깁니다! 앞 포인터 강의에서 int *p = &n; printf("%d\n", p); 를 실행하면 n의 주소값이 출력된다고 이해했는데, char *str; printf("%s\n", str); 을 했을때는 왜 myString의 0번째 인덱스 주소값이 출력되는게 아니라 this is string 이 출력되는지 이해가 안되서요.. 설명해주시면 감사하겠습니다!
세션을 실행하고 있어 curl로 실행하려고 하는데 아래와 같은 에러 메세지가 뜨네요. Invoke-WebRequest : 매개 변수 이름 'c'이(가) 모호하므로 매개 변수를 처리할 수 없습니다. 일치하는 항목은 다음과 같습니다. -Credential -CertificateThumbprint -Certificate -ContentType. 위치 줄:1 문자:45 + curl -X POST http://127.0.0.1:8000/set/ -i -c cookies.txt + ~~실행하면 위와 같은 에러메시지가 나오는데 어떻게 해결할 수 있나요? from fastapi import FastAPI,Request from fastapi.security import HTTPBasic from starlette.middleware.sessions import SessionMiddleware app=FastAPI() app.add_middleware(SessionMiddleware,secret_key="your-secret-key") @app.post("/set/") async def set_session(request:Request): request.session["username"]='smith' return {"message":"Session value"} @app.get("/get/") async def get_session(request:Request): username=request.session.get("username","Guest") return {"username":username}
Waiting 상태의 쓰레드를 Runnable 상태로 만들기 위해선 두 가지 방법이 있다고 배웠습니다. LockSupport 기능 인터럽트 발생 2번 방법에 대해서 궁금한 것이 있습니다. 결과적으로 인터럽트를 발생시켜 쓰레드를 대기 상태에서 실행 가능한 상태로 전이시킨다는 것인데 인터럽트 상태가 정상(false)이 아닌 상태가 나오게 되는데 그럼 실무에서 1번 방법을 더 많이 사용하나요?
#include <stdio.h> void strcopy(char d[], const char s[]) { int i = 0; while (s[i] != '\0') { d[i] = s[i]; i++; } d[i] = '\0'; } int main() { char str1[] = "first"; char str2[50] = "teststring"; int result = 0; strcopy(str2, str1); for (int i = 0; str2[i] != '\0'; i++) { result += i; } printf("%d\n", result); for (int i = 0; i < 10; i++) { printf("%c", str2[i]); } } 출력값: 10 first ring printf("%c", str2[i]); // first ring 이렇게 출력되었는데 while (s[i] != '\0') { d[i] = s[i]; i++; } d[i] = '\0'; 여기서 while타고 s[i]에 first 마지막인 t 가 들어가면 다음 배열이 들어가지않으니 d[i] = '\0'; 들어가고 firist\0 담기는게 아닌가해서 질문드립니다. 그래서 출력값이 first ring 이렇게 나오는게 맞을까요?
3:37 근처에서 Select Kernel을 클릭했는데 myenv-finance-analysis가 드롭다운에 보이질 않습니다. 드롭다운에 Python Environments 만 떠서 그걸 선택했더니 가상머신을 끄고 다시 들어와도 Detecting Kernels만 계속 실행되는 모습입니다. 혹시 왜 이런건지 알 수 있을까요?
안녕하세요! 강의에서 배운 것을 바탕으로 데이터 분석 프로젝트를 진행하고, 분석 내용 및 코드를 노션 포트폴리오에 올리려 합니다. (개인 구직용으로만 사용합니다!) 배운 것을 바탕으로 하다 보니, 강의에서 배운 코드와 같은 부분이 있을 수밖에 없는데 포트폴리오에 사용해도 괜찮을까요?
프로그래밍 시작하기 : 도전! 45가지 파이썬 기초 문법 실습 (Inflearn Original)
안녕하세요 선생님 질문있습니다. 예제 내용 중, 아래 코드에서 프린트 파일리드를 한 다음에 file.close()로 open한 파일을 닫아줘야 하지 않나요? 물론 예제 코드가 잘 동작하는 것은 확인 했습니다. 다만 저는 append 모드로 파일을 open하기 전에 먼저 열었던 파일을 close 해줘야 하는게 아닌가 해서 질문드립니다~ ... if menu == 1: file = open(file path, 'r') print( file.read ()) # 이 부분에서 file.close() 해줘야 하는것 아닌가요?? file = open(file path, 'a+') print() ...
개발용 PC가 리눅스라면 괜찮은데, 윈도우에서 개발한다면 배포시에 보통 리눅스에 배포하게 될텐데.. 그 경우 개발환경과 배포환경이 다름으로 생기는 패키지 관리 문제가 생기는데 강사님은 어떻게 해결하시나요..? cookiecutter-django로 프로젝트 세팅을 간소화 하려고 하는데, 도커에서 서비스가 돌아가다보니 디버깅 하기가 까다롭네요.. pycharm에서는 보통 어떻게 하나요? vscode에서는 debugpy를 제가 수동으로 설정해서 디버깅 처리를 했는데, 이 방법은 너무 번거롭더라구요.. 요지는 윈도우 개발환경에서 도커 컨테이너에서 돌아가고 있는 코드를 어떻게 디버깅 하느냐에 대한 질문입니다.. 좋은 강의 제공해주셔서 감사드리며, 강의 주제와는 좀 벗어나지만 답변 주시면 개발하는데 많은 도움 될 것 같습니다.
1:57에서 '나눈 이후의 몫을 원할 때' 사용하는 연산자가 /라고 하셨습니다. c언어 기준으로 설명해 주신 걸로 이해했는데 (파이썬은 /을 쓸 시 나누어 떨어질 때까지 계산한 값, 혹은 무한소수를 끊어 출력하고 정수 몫을 원할 시 //을 써야 하니까요) 혹시 자바도 c언어와 연산자가 동일한가요? 코딩을 배우기는 하나 컴공만큼 깊게 들어가는 과는 아니라 자바를 배운 적이 없어 질문드립니다.