지난시간에 STM32개발보드 제작에 관해서 말씀드렸는데, 이번에는 역시 비슷한 mcu인 ESP32에 대해서 얘기해 보려고 합니다.

 

ESP32는 Espressif사에서 제작하고 판매하는 microcontroller로 가장 큰 특징은 무선 통신 기능이 기본적으로 내장되어 있다는 것입니다. 모델에 따라 조금씩 다르지만 대부분의 모델들이 블루투스와 와이파이 통신기능을 내장하고 있으며, 소비전력을 아끼기위해서 잠자기(sleep) 기능이 있습니다. 따라서 ESP32는 사물인터넷(Internet of Things, IOT) 프로젝트에 아주 좋습니다. 아래의 두 링크는 Espressif사의 ESP32 소개 사이트 그리고 위키피디아의 관련 문서입니다.

 

https://www.espressif.com/en/products/socs/esp32

특히 위키피디아 문서에는 각 모델별 ESP32에 대한 소개와 특징이 모두 설명되어 있어, 각 모델별로 어떤 차이가 있는지 알 수 있습니다.

 

제가 생각하기에 다른 점보다 ESP32가 좋은 점은 아두이노 개발환경을 그대로 이용해서 ESP32의 firmware를 코딩하고 바로 보드에 다운로드할 수 있다는 점입니다. STM의 경우 전용 개발환경을 사용해야하지만, ESP32는 그럴 필요없이 아두이노 환경에서 바로 작업이 가능합니다. 이점은 아두이노에 익순한 분들은 바로 쉽게 ESP32 firmware 코딩도 가능하다는 이야기 입니다.

 

사용자 입장에서 ESP32를 사용하는 방법은 2가지가 있습니다. ESP32는 칩형태로, 모듈 형태로, 그리고 개발보드 형태로 구입해서 사용할 수 있습니다. 아래의 사진은 ESP32의 칩 사진입니다.

물론 이 상태로 구입해서 사용할수는 있지만 칩을 구동하는데 필요한 다른 요소 (안테나, 메모리 등등)들이 없어서 전문가가 아니면 쉽게 사용할 수 없습니다. 그래서 저처럼 초심자는 모듈을 사용하거나 이미 제품으로 나와있는 개발보드를 구매하면 됩니다. 아래는 어떤 한 종류의 모듈의 사진입니다.

위의 사진은 ESP32-WROOM-32-N4라는 모듈의 사진인데, chip이 메탈케이스에 들어 있으며, 작은 크기의 pcb에 납땜이 되어 있고, pcb의 윗부분에 구불구불한 형태의 pcb 안테나가 있는 것을 볼수 있습니다. 또한 pcb의 가장자리에는 다른 pcb에 납땜할 수 있도록 전극들이 나와있는 것을 볼수 있습니다. (잘 보면 KC인증마크도 있습니다.)

 

개발보드를 직접 제작하는 경우, 위의 모듈을 구입하여 제작하는 pcb에 납땝하여 보드를 제작합니다. 만일 직접 제작할 수 없으면, 이미 제품으로 판매하는 보드를 구입하여 사용할 수도 있습니다. 아래는 그런 보드 중 하나의 사진입니다.

위의 사진에서 보이듯이 각종 입출력핀들이 가장자리에 배치되어 필요시에 연결하여 사용할 수 있고, 전원은 보드 아래의 usb 단자로 제공하며, 역시 이 단자로 firmware를 다운로드 해 줄 수도 있습니다.

 

이제 그럼 모듈을 이용해서 직접 보드를 제작하는 동영상을 소개하겠습니다. 아래는 유튜브의 Robert Feranec 채널에서 업로드한 ESP32 개발보드를 제작하는 방법에 대해서 설명하는 동영상입니다. 동영상에서 하는 그대로 따라하시면서 제작방법을 배울 수 있습니다.

 

https://www.youtube.com/watch?v=S_p0YV-JlfU&list=PL-eoiE4G_DA7a8Fubnn4zBhd4_ik25HWU&index=138&t=10s

 

자 그럼 위의 동영상을 따라서 보드를 직접 제작해보고, 앱이나 서버에 직접 통신하는 IOT 기기를 만들어 보세요.

 

 

이번 시간에는 Microcontroller unit(줄여서 mcu)가 들어간 개발보드를 제작하는 방법에 대해서 소개하겠습니다.

 

보통 개발보드라고 하면 mcu가 포함이 되어 있어서, 어떤 입력 신호를 어떻게 처리하여 출력하는 firmware가 내장된 회로를 말합니다. 여기서 firmware는 제작자가 직접 개발환경을 이용해서 작성한 코드를 말하며, STM32와 같은 mcu를 사용할 경우, 전용 개발환경인 STMCubeIDE(https://www.st.com/en/development-tools/stm32cubeide.html)

같은 것을 설치하여 C언어로 작성합니다. firmware 작성이 다 되었으면 usb 선을 통해서 개발보드에 다운로드하여 보드를 동작합니다.

 

입력과 출력은 제작자가 원하는 대로 선택할 수 있습니다. 가장 간단하게는 디지털 입력(0또는 1)에서 부터 아날로그 입력(전압, 보통 0 ~ 5 V사이 혹은 0 ~ 3.3V사이)이거나 좀 더 복잡하게는 I2C, SPI와 같은 통신 규격을 이용하기도 합니다. I2C의 경우는 디지털로 출력하는 센서 등에서 사용하는 규격입니다.

 

유튜브에는 다양한 개발보드 제작 강의가 있는데 그 중 제가 선택하여 배운 것은 아래의 동영상입니다. 이 동영상은 Phil's Lab이라는 유튜브 채널에서 올린 것인데요, STM32라는 mcu를 포함하는 개발보드 제작에 관한 영상입니다.

 

KiCad STM32 + USB + Buck Converter PCB Design and JLCPCB Assembly (Update) - Phil's Lab #11

https://www.youtube.com/watch?v=C7-8nUU6e3E&list=PL-eoiE4G_DA7a8Fubnn4zBhd4_ik25HWU&index=187&t=7399s

 
 

동영상은 약 2시간반 정도로 상당히 길며, 초심자의 경우 동영상의 강의를 그대로 따라해서 배우면 됩니다. 사용한 pcb 개발을 위해서 사용한 소프트웨어는 KiCAD라는 무료 프로그램이며 동영상에서는 KiCAD7을 사용하였으나 현재 KiCAD의 버전은 9입니다.

 

동영상의 내용은 회로도(schematic)작성, pcb 배선(routing), 부품선정, 제작 등의 순서로 이어지며, 제작은 JLCPCB라는 pcb전문 제작업체에 맡깁니다. (JLCPCB 외주 제작방법에 대해서 다른 시간에 따로 설명하겠습니다.)

 

아래의 동영상은 역시 같은 채널의 동영상으로 STM32의 firmware 작성에 대해서 좀더 자세히 다루고 있습니다.

 

STM32 Programming Tutorial for Custom Hardware | SWD, PWM, USB, SPI - Phil's Lab #13

https://www.youtube.com/watch?v=x_5rYfAyqq0&list=PL-eoiE4G_DA7a8Fubnn4zBhd4_ik25HWU&index=183

 

이 외에도 다양한 주제에 대해서 많은 동영상이 있으니 아래의 채널에 한번 들려보시기 바랍니다.

https://www.youtube.com/@PhilsLab/videos

또한 저자인 Phil은 udemy와 fedevel에도 강의를 올려두었습니다.

https://www.udemy.com/course/learn-kicad-v6-and-stm32-hardware-design/learn/lecture/30606692?start=120#overview

 

 

 

오늘 소개드릴 강의는 본격적인 인공지능 강의입니다. 역시 같은 강사가 가르치는 강의로 2개가 있습니다.

 

첫번째는 이미지 인식 딥러닝 강의입니다. (https://www.udemy.com/course/computer-vision-a-z/learn/lecture/8127614?start=15#overview)

이 강의는 본격적인 딥러닝 강의로 지난 시간에 소개해드린 머신러닝 강의에서 설명한 딥러닝을 이미지 인식에 적용하는 것을 배우는 강의입니다. 강의 소개문을 보겠습니다.

--------------------------------------------------------------------------------------------------

AI와 딥러닝에 대해 들어본 적이 있을 것입니다. 하지만 이 새로운 산업 혁명에서 내 위치가 무엇인지, 소비자인지 창작자인지 고민해 본 적이 있을까요? 대부분의 사람들에게 그 답은 소비자일 것입니다. 하지만 만약 여러분도 창작자가 될 수 있다면 어떨까요? 여러분이 쉽게 인공지능 세계에 들어가, 최신 기술을 활용한 멋진 응용 프로그램을 만들어 세상을 더 나은 곳으로 바꿀 수 있다면요? 너무 좋은 이야기처럼 들릴 수도 있지만, 실제로 그 방법이 존재합니다.

 

그 방법 중 하나는 바로 "컴퓨터 비전"입니다. 컴퓨터 비전은 AI 분야 중 가장 쉽게 창작자가 될 수 있는 길입니다. 그리고 그것이 가장 쉬운 길일 뿐만 아니라, AI의 여러 분야 중 가장 많은 창작을 할 수 있는 분야이기도 합니다. 왜 그럴까요? 바로 컴퓨터 비전이 거의 모든 분야에 적용되기 때문입니다. 의료, 소매업, 엔터테인먼트 등 그 범위는 정말 광범위합니다. 이미 컴퓨터 비전 시장은 180억 달러 규모로, 급격히 성장하고 있습니다.

 

예를 들어, 환자의 MRI 뇌 스캔에서 종양을 탐지하는 기술을 생각해 보세요. 인간보다 10,000배 더 많은 이미지를 분석할 수 있기 때문에, 매일 더 많은 생명이 구해지고 있습니다. 그리고 만약 여러분이 컴퓨터 비전이 아직 적용되지 않은 산업을 찾았다면, 그보다 더 좋은 기회는 없습니다. 그건 바로 여러분이 그 산업에서 새로운 사업 기회를 잡을 수 있다는 뜻이니까요.

 

그렇다면 이제 어떻게 컴퓨터 비전의 세계에 들어갈 수 있을까요? 지금까지 컴퓨터 비전은 상당히 복잡하고, 그만큼 점점 더 복잡해져 가고 있었습니다. 코드, 라이브러리, 툴이 많아질수록 길을 잃기 쉬워졌습니다. 더욱이 컴퓨터 비전을 활용하려면 그것을 어떻게 사용하는지를 아는 것뿐만 아니라, 그 원리가 무엇인지도 이해해야 최대한 이점을 취할 수 있습니다.

이 문제를 해결하기 위해, 저희는 "컴퓨터 비전 A-Z"라는 강의를 준비했습니다. 이 강의를 통해, 여러분은 가장 인기 있는 컴퓨터 비전 방법들이 어떻게 작동하는지 배우고, 그것들을 실제로 적용하는 방법을 익힐 수 있습니다.

 

이 강의를 통해 배울 내용은 다음과 같습니다:

  • 강력한 컴퓨터 비전 모델들을 다룰 수 있는 도구 상자
  • 컴퓨터 비전의 이론 이해
  • OpenCV 마스터하기
  • 객체 탐지 마스터하기
  • 얼굴 인식 마스터하기
  • 강력한 컴퓨터 비전 응용 프로그램 만들기

강의에 필요한 조건은 매우 간단합니다. 고등학교 수학 지식과 기초적인 파이썬 프로그래밍 지식만 있으면 됩니다. 이 강의는 컴퓨터 비전이나 인공지능에 관심이 있는 모든 사람을 대상으로 합니다. 여러분도 창작자가 될 수 있는 기회를 놓치지 마세요!

-------------------------------------------------------------------------------------------------

두번째는 강화학습(Reinforcement Learning)과 대규모언어모델(Large Language Model)에 관한 강의입니다.

(https://www.udemy.com/course/artificial-intelligence-az/learn/lecture/12606408?start=1#overview)

강화학습이란 쉽게 말해서 어떤 상황에서 어떤 선택을 하느냐를 결정하는 모델을 학습시키는 것을 말합니다. 간단히 예를 들자면, 2차원 평면에서 일어나는 간단한 게임을 들 수 있습니다. 패크맨(Pacman)의 경우 2차원 미로에서 돌아다니면서 술래들을 피해서 콩을 먹으로 다닙니다. 이때 패크맨이 취할수 있는 행동은 위/아래/우측/좌측 이동 등 총 4가지의 움직임이 있습니다. 그리고 패크맨이 위치한 환경은 2차원 미로와 그 미로를 돌아다니는 술래들입니다.

 

그래서 패크맨 자신의 위치, 주변 미로의 생김새, 주변 술래의 위치 등을 입력으로하고, 방향선택을 출력으로하는 모델을 만들 필요가 있습니다. 학습을 할때 술래에게 잡히면 벌점, 콩을 먹으면 보상을 주는 방식으로 모델을 '학습'시킵니다. 처음 학습이 되지 않은 생태에서는 멋대로 다니다가 술래에게 잡혀서 벌점을 먹습니다. 하지만 학습이 반복되면, 주어진 상황에서 어떤 방향으로 가야 술래를 피해서 콩을 먹으러 갈수 있는지 스스로 판단하게 됩니다.

 

대규모 언어모델도 이와 비슷하게 동작합니다. 주어진 입력(주어진 문장)에 대해서 학습한 결과대로 가장 적절해 보이는 문장(응답 문장)을 출력합니다. 이 때 학습에 사용된 수많은 화자간의 대화가 바로 위에서 예를 든 미로, 술래 등에 해당합니다. 그럼 아래에 강의 소개문을 한번 보겠습니다.

--------------------------------------------------------------------------------------------------

인공지능(AI)에 대한 기본 개념을 직관적으로 배우고, 이를 실제로 8개의 다양한 AI를 구축하며 연습할 수 있는 기회를 제공합니다.

 

이 강좌에서는 다음과 같은 AI를 구축합니다:

  1. 비즈니스 지원을 위한 기초 모델(LLM)을 활용한 AI 에이전트 구축
  2. Q-러닝 모델을 사용하여 창고 흐름을 최적화하는 AI 구축
  3. 심층 Q-러닝 모델을 사용하여 달에 착륙하는 AI 구축
  4. 심층 컨볼루션 Q-러닝 모델을 사용하여 팩맨 게임을 플레이하는 AI 구축
  5. A3C(비동기적 이점 액터-크리틱) 모델을 사용하여 Kung Fu 전투 AI 구축
  6. PPO(근접 정책 최적화) 모델을 사용하여 자율 주행 자동차 AI 구축
  7. SAC(소프트 액터-크리틱) 모델을 사용하여 자율 주행 자동차 AI 구축
  8. 강력한 사전 훈련된 LLM(Llama 2 by Meta)을 미세 조정하여 의학 용어에 대해 대화할 수 있는 AI 의사 챗봇 구축

 

이것이 전부가 아닙니다. 강의를 완료하면 3개의 추가 AI도 받을 수 있습니다: DDPG, 풀 월드 모델, 진화 전략 및 유전자 알고리즘. 이 AI들은 자율 주행 자동차와 휴머노이드 애플리케이션을 위해 ChatGPT와 함께 구축됩니다. 각 AI에 대해 긴 동영상 강의와 함께 구현 설명서, 미니 PDF, 그리고 파이썬 코드가 제공됩니다. 또한 강의를 완료한 수료자에게는 "Generative AI와 LLMs을 클라우드 컴퓨팅과 함께 사용하는 3시간 추가 강의"를 무료로 제공합니다.

 

이 강좌에서 제공되는 내용은 다음과 같습니다:

  1. 초급에서 전문가까지 AI 기술 습득: 다양한 목적을 위한 자기 개선 AI를 코드로 작성하며 학습합니다. 모든 튜토리얼은 빈 페이지에서 코드 작성을 시작하고, 각 코드를 하나하나 작성하며 이해할 수 있도록 돕습니다.
  2. 간편한 코딩 및 코드 템플릿: 모든 AI는 구글 콜랩에서 구축되므로 라이브러리나 패키지를 설치하는 번거로움 없이 바로 시작할 수 있습니다. 각 AI마다 다운로드 가능한 파이썬 코드 템플릿(.py, .ipynb)을 제공합니다.
  3. 직관적인 튜토리얼: 복잡한 이론을 일방적으로 강의하는 대신, 왜 그렇게 하는지를 깊이 이해하도록 도와주는 직관적인 튜토리얼을 제공합니다. 이 과정에서는 수학적 복잡성보다는 직관을 중심으로 학습합니다.
  4. 실제 문제 해결: 5개의 AI 모델을 구축하며 실제 환경에 적합한 AI를 만들어내는 방법을 배우게 됩니다. 연습을 통해 AI를 실제 문제에 적용하는 능력을 기를 수 있습니다.
  5. 과정 내 지원: AI 분야 전문가들로 이루어진 지원팀이 여러분의 학습 여정을 돕기 위해 48시간 이내에 응답을 제공합니다.

 

이 강좌는 인공지능, 기계학습, 또는 딥러닝에 관심 있는 모든 사람을 대상으로 합니다. 여러분도 이 흥미로운 AI 세계에 발을 들여놓고, 계속 배우며 AI를 즐길 준비가 되셨나요? 지금 바로 함께 하세요!

 

배울 내용:

  • 7개의 다양한 AI 구축
  • 인공지능 이론 이해
  • 최신 AI 모델 마스터
  • 실제 문제 해결을 위한 AI 활용
  • Q-러닝, 심층 Q-러닝, 심층 컨볼루션 Q-러닝, A3C, PPO, SAC 모델 마스터
  • LLMs 및 트랜스포머, LoRA와 QLoRA, NLP 챗봇 기법 학습
  • LLM 미세 조정 및 지식 증강 학습
  • 추가 AI: DDPG, 풀 월드 모델, 진화 전략 및 유전자 알고리즘

 

강의 요구 사항:

  • 고등학교 수학
  • 기본 파이썬 지식

이 강의의 대상:

  • 인공지능, 기계학습, 딥러닝에 관심 있는 모든 사람

 

--------------------------------------------------------------------------------------------------

 

지난번 글에서 데이터 과학 강의를 소개했는데, 이번에는 이어서 기계학습 강의에 대해서 소개를 하겠습니다. Udemy에서 역시 같은 강사가 올린 강의입니다. 제목은 "Machine Learning A-Z: AI, Phython & R + ChatGPZ Prize [2025]"입니다.

강의 주소(https://www.udemy.com/course/machinelearning/learn/lecture/20015232?start=195#overview)

이 강의에서는 각종 기계학습 방법에 대해서 배울 수 있습니다. 기계학습이란, 어떤 데이터가 입력이 되었을 때, 데이터가 무엇을 의미하는지를 판정해주는 방법 혹은 모델이라고 할 수 있습니다. 기계학습의 대표적인 기법 중의 하나기 딥러닝입니다만, 딥러닝 이외에도 다양한 기법이 있습니다.

본 강의에서는 그러한 각 기법들의 개념을 먼저 설명하여, 수강자들이 먼저 개념을 이해하도록 돕고, 그런후 python을 이용하여 실습할 수 있도록 하고 있습니다. 따라서 강의에서 설명하는대로 코드를 직접 작성하여 실행해 볼 수 있습니다.

그럼 강의 설명을 요약해 올려보겠습니다.

----------------------------------------------------

이 강의는 머신러닝 분야에 관심이 있는 사람들을 위한 과정입니다. 데이터 과학자와 머신러닝 전문가가 설계한 이 강의는 복잡한 이론, 알고리즘, 코드 라이브러리를 간단하게 배우고 이해할 수 있도록 돕습니다. 전 세계 100만 명 이상의 학생들이 이 강의를 신뢰하고 있으며, 단계별로 머신러닝의 세계로 안내합니다. 각 튜토리얼을 통해 새로운 기술을 배우고 이 도전적이면서도 보람 있는 데이터 과학 분야를 깊이 이해하게 됩니다.

이 강의는 파이썬 또는 R 튜토리얼 중 하나를 선택하여 학습할 수 있으며, 둘 다 공부할 수도 있습니다. 여러분의 경력에 맞는 프로그래밍 언어를 선택하면 됩니다. 강의는 재미있고 흥미롭지만 동시에 머신러닝에 대해 깊이 탐구합니다. 강의는 다음과 같은 구조로 진행됩니다.

  1. 데이터 전처리
  2. 회귀 분석: 단순 선형 회귀, 다중 선형 회귀, 다항 회귀, 서포트 벡터 회귀, 결정 트리 회귀, 랜덤 포레스트 회귀
  3. 분류 분석: 로지스틱 회귀, K-NN, 서포트 벡터 머신(SVM), 커널 SVM, 나이브 베이즈, 결정 트리 분류, 랜덤 포레스트 분류
  4. 클러스터링: K-평균, 계층적 클러스터링
  5. 연관 규칙 학습: Apriori, Eclat
  6. 강화 학습: 상한 신뢰 구간, 톰프슨 샘플링
  7. 자연어 처리: Bag-of-words 모델과 NLP 알고리즘
  8. 딥러닝: 인공 신경망, 합성곱 신경망(CNN)
  9. 차원 축소: PCA, LDA, 커널 PCA
  10. 모델 선택 및 부스팅: k-겹 교차 검증, 파라미터 튜닝, 그리드 서치, XGBoost

각 파트 내의 섹션은 독립적으로 진행되므로, 전체 강의를 처음부터 끝까지 들을 수도 있고, 현재 자신에게 필요한 섹션만 선택하여 배울 수도 있습니다. 또한, 이 강의는 실제 사례를 바탕으로 한 실습을 포함하고 있어 이론뿐만 아니라 실제 모델을 구축하며 실습할 수 있습니다.

강의는 파이썬과 R 코드 템플릿도 제공하여, 학습한 내용을 실제 프로젝트에 적용할 수 있도록 돕습니다. 학습 후에는 머신러닝 모델을 선택하고, 예측을 정확하게 하며, 강력한 분석을 수행할 수 있게 됩니다. 또한, 강의는 강화 학습, 자연어 처리, 딥러닝, 차원 축소와 같은 고급 기술도 다룹니다. 머신러닝을 통해 비즈니스에 가치를 더하고, 데이터 과학 분야에서 경력을 쌓을 수 있는 능력을 키울 수 있습니다.

이 강의는 고등학교 수학 수준의 기초 지식만 있으면 누구나 수강할 수 있습니다. 머신러닝에 관심이 있는 사람, 기초 알고리즘을 아는 중급 수준의 사람, 코딩에 익숙하지 않지만 머신러닝을 배우고 싶어 하는 사람 등 누구나 수강 가능합니다. 데이터 과학에서 경력을 시작하고자 하는 대학생, 데이터 분석가 등에게도 적합한 강의입니다.

​---------------------------------------------------------------------------------------------------------------------------------

 

 

기계학습에는 다양한 학습기법이 존재합니다만, 그중 단연 성능이 좋은 기법은 딥러닝(Deep Learning)입니다. 이 방법은 사람의 뉴런을 모방해서 만든 방법입니다. 가장 중요한 기법이고 내용도 별로 어렵지 않아 여기서 간단히 설명해 보겠습니다.

 

아래는 인공 신경망을 그린 그림입니다.

오른쪽에는 단위 신경(셀: Cell)을 그린 그림이고, 왼쪽은 그런 셀(밝은 회색 셀들)이 여러개가 배치되어 입력과 출력을 하는 그림입니다.

 

먼저 왼쪽 그림을 설명해 보겠습니다.

위의 신경망은 어떤 이메일이 스팸인지 아닌지를 판정하는 모델이라고 해 보겠습니다. 여기서 x1부터 xn은 총 n개의 입력(어두운 회색 셀들)을 의미합니다. 여기서 x는 어떤 종류의 정보라도 됩니다. 예들 들어서 그럼 입력, x1 부터 xn은 메일안에 들어있는 특정 단어의 빈도 수라고 해 볼수 있겠습니다. 그리고 출력은 2개, 측 스팸메일(yes)인지 아닌지(no)가 됩니다. 그래서 그림의 맨 오른쪽에 출력(하얀색 셀)이 2개('그렇다'셀과 '아니다'셀)가 있습니다.

 

입력과 출력의 중간에 2줄로 배치된 셀들(밝은 회색 셀)이 판단하는 층(Layer)입니다. 입력과 출력의 사이에 있으므로 숨겨진 층(Hidden Layer)라고 부릅니다. 숨겨진 층은 그림처럼 2줄일수도, 1줄일수도, 그리고 여러 줄일수도 있습니다. 딥러닝이라는 이름은 숨겨진 층때문에 붙은 이름입니다. 말그대로 깊이(Deep) 숨겨져있기 때문입니다.

 

만일 어떤 메일이 스팸메일이라면, 수신인에게 어떤 것을 권하는 내용이 들어 있을 수 밖에 없고, 그렇다면 관현하여 특정 단어(예를 들어서 특정 상품의 이름 등)가 많이 등장하게 됩니다.

 

우측 그림을 설명하면, 셀이 하는 역할은 단순하게 더하기 입니다. 그림에서 빨간색 상자로 표신된 셀을 예로 들어 설명해 보겠습니다. 이 셀은 위에서부터 j번째 셀입니다. 이 셀은 x1로 부터 xn까지의 모든 입력을 취합합니다. 이때 단순히 모득 값을 더하는 것이 아니라 각 값에 가중치(weight factor)를 곱한 후 합쳐줍니다. 그러니까 x1의 값에 가중치w1j를 곱하고, x2에 w2j를 곱하고, x3에 w3j를 곱하고, ..., xn에 wnj를 곱한 후, 이 값들을 모두 더합니다. 셀 내부에 있는 시그마 기호가 이것을 표시합니다.

 

그러나 j번째 셀만 합산을 하는 것이 아니라, 숨겨진 층에 있는 모든 셀들이 동시에 합산을 합니다. 또한 숨겨진 층의 두번째 줄의 셀들은 x가 아니라 첫번째 줄의 셀들의 합산값을 입력으로 받습니다.

 

그럼 각 셀이 합산한 값은 어떻게 출력으로 결정될까요? 이것은 바로 전달함수(activation function)에 의해서 결정됩니다. 셀안에 f가 그것을 의미합니다. 전달함수에는 여러 종류가 있지만 대표적으로 많이 사용되는 것은 ReLu함수 입니다. 아래는 ReLu함수의 모양입니다.

위 그래프의 의미는, 합산 결과가 0이하의 음수이면 0을 출력하고, 그 외의 경우에는 합산값의 결과에 비례하게 커지는 어떤 값을 출력한다 입니다. 그러니까, 합산의 결과가 클 수록 다음 단, 첫번째 숨겨진층은 두번째 숨겨진 층으로, 그리고 두번째 숨겨진 층은 출력으로 크게 전달합니다.

 

그래서 최종적으로 출력에서는 메일이 스팸에 가까울 수록 '그렇다'에 가까운 결과가 나옵니다. 만약 출력을 0에서 1사이의 실수로 표시할 경우, 1에 가까운 결과가 나오고, '아니다'에 가까울 경우, 0에 가까운 결과가 나옵니다.

 

그렇다면 각 가중치는 어떻게 결정될까요? 바로 이 가중치를 결정하는 과정이 '학습'입니다. 위 신경망에서 출력값은 셀의 가중치 합산으로 결정된다고 말씀드렸습니다. 이 출력값은 입력 데이터(메일 내의 각 종 단어들의 빈도(x값들) + 학습 데이터(스팸이다 혹은 아니다)) 중 학습 데이터(스팸 여부)과 비교합니다. 이 때, 학습 데이터는 학습 전에 미리 사람이 판단하여 신경망에게 알려줍니다. 따라서 각 메일마다 사람이 일일이 스팸인지 아닌지 여부를 정해 놓아야 하며, 메일의 개수(즉 입력 데이터)가 많을 수록 신경망의 판정 능력이 좋아집니다.

 

위의 비교하고 학습하는 방법은 경사하강법이라는 방법입니다. 출력값을 학습데이터값과 비교하여 차이가 클 경우(측 신경망이 판단한 결과와 실제 스펨여부가 차이가 클 경우) 각 가중치를 수정합니다. 아래에 경사하강법을 설명하는 그림이 있습니다.

 

위 그림에서 가로축은 어느 하나의 가중치 wij의 값이며, 세로축은 출력값과 학습데이터값 사이의 차이라고 할 수 있습니다. 즉 세로축의 값이 클 수록 판정 결과가 잘못되었다는 의미입니다. 거꾸로 판정이 정확하다는 것은 그래프에서 아래로 향해야 한다는 의미입니다. 그래서 처음 빨간 점에서 시작해서, wij의 값을 조금씩 감소시켜서 그래프의 가장 바닥에 도달할때까지 wij의 수정을 반복합니다. 경사하강법은 여기서 유래합니다. 그래프의 기울기가 큰 부분에서 기울기가 0이 될때까지 wij를 수정합니다.

 

물론 wij 하나의 값에 대해서만 경사하강을 하는 것이 아니며 다른 가중치에 대해서도 동시에 경사하강법을 실시합니다. 그 아래의 그림은 두개의 가중치에 대해서 그린 것이며 검은색 선은 경사하강법에 의해서 결정되는 경로를 의미합니다. 가중치의 개수는 위의 신경망 그림에서 총 2*j 개수만큼 있으니, 실제로 경사하강법을 실시하는 차원은 총 2*j개의 차원입니다. 우리는 3차원에서 살고 있으니 위 그림처럼 가중치를 최대 2개까지 밖에 그릴 수 없습니다만, 계산 상으로는 얼마든지 높은 차원에서 경사하강법을 실시할 수 있습니다.

 

위처럼 경사하강법에 의해서 세로축의 값이 최소가 되는 가중치값들이 결정되면 비로소 학습이 끝난 것입니다. 이때부터 입력이 들어오면 신경망은 스팸여부를 판단할 수 있습니다.

 

 

 

이번 시간부터 제가 직접 수강했던 데이터 과학, 기계학습, 인공지능에 관한 온라인 강의들 소개하고자 합니다.

 

기계학습 혹은 인공지능에 대해서 배우고 싶은데 어떻게 시작할지 모르는 분들을 위해서 좋은 강의라 생각하여 소개드립니다. Udemy라는 온라인 학습 사이트에 올려져 있는 유료 강의들 입니다. 가격도 수만원 정도로 그렇게 부담스럽지 않습니다. 저는 기계학습, 인공지능에 대해서 온라인 학습과정을 통해서 배웠고, 학교의 정규과목을 통해서 배우지 않았습니다. 하지만 강의의 내용이 충실하고, 강의를 따라서 실습도 해볼 수 있어서, 강의를 배운 후에는 직접 사용할 수 있을 정도입니다.

 

그럼 이번글부터 하나씩 소개해 보겠습니다.

 

데이터 과학 강의:

Udemy에 가셔서 강의 검색창에서 'Data Science A-Z: Hands-on Excersizes & ChatGPT Prize [2025]'로 검색하시면 됩니다.

요렇게 생긴 아저씨가 보이는 강의를 찾으시면 이 강의가 맞습니다.

강의는 영어로 진행되지만 한글자막도 지원됩니다. 다만 자막의 한극번역이 좀 어색한 부분도 있어서 동영상과 자막을 같이 보면서 맥락을 파악하면 될듯합니다.

 

해당 페이지의 강의 설명에 가서 설명을 chatgpt로 요약하면 아래와 같습니다.

 

데이터 사이언스 과정 소개

이 강의는 단순히 이론에만 의존하지 않고 실습 중심으로 진행됩니다. 완벽하게 모든 것이 잘 맞춰지는 수업이 아니라, 실제 데이터 사이언티스트가 매일 겪는 어려움과 고통을 생생히 체험하게 될 것입니다. 잘못된 데이터, 이상치, 불규칙성 등 수많은 문제들을 다루며, 이 과정을 통해 데이터 분석의 진짜 모습을 경험하게 됩니다.

이 과정이 특별한 이유는, 여러분이 데이터 사이언스의 모든 단계를 직접 경험하게 된다는 점입니다. 이 과정이 끝난 후, 여러분은 다음과 같은 기술들을 마스터하게 될 것입니다:

  • 데이터를 분석을 위한 형태로 정리하고 준비하는 방법
  • 기본적인 데이터 시각화 방법
  • 데이터 모델링 기술
  • 곡선 맞추기 (Curve Fitting) 방법
  • 분석 결과를 효과적으로 발표하는 기술

이 과정에서는 실제 업무 환경에서 겪을 수 있는 도전적이고 현실적인 문제들을 해결할 수 있는 능력을 키울 수 있습니다. 과제는 고난도로 생각을 자극하며, 그만큼 성취감도 클 것입니다. 여러분은 SQL, SSIS, Tableau, Gretl 등의 도구를 다루는 데 능숙해지며, 이 과정에서 배운 모든 것을 실제 업무에 바로 적용할 수 있습니다.

 

주요 학습 내용

  • 복잡한 데이터 사이언스 프로젝트의 전체 단계를 성공적으로 수행하는 방법
  • Tableau를 이용한 기본 시각화 및 데이터 마이닝 기술
  • 회귀 분석 (Linear Regression)로지스틱 회귀 분석 (Logistic Regression) 수행
  • 모델 평가 (R-squared, Adjusted R-squared 등)
  • 다중공선성을 확인하고 다루는 방법
  • SQL ServerSQL 스크립트 작성
  • 데이터 준비 및 이상치 처리 방법
  • 모델의 유지보수 및 개선 방법

 

강의 대상

  • 데이터 사이언스에 관심 있는 누구나
  • 데이터 마이닝 및 통계 모델링 기술을 향상시키고 싶은 사람
  • 데이터 준비 및 발표 기술을 향상시키고 싶은 사람

이 과정은 단순히 데이터를 다루는 기술만을 배우는 것이 아닙니다. 여러분은 실제 데이터를 가지고 문제를 해결하는 과정을 통해, 실제 업무에서 겪을 수 있는 상황들을 대비하게 될 것입니다. 이 강의를 통해 데이터 사이언스의 세계로 한 걸음 더 나아가세요!

지금 바로 수업에 참여하여 실제 업무에서 유용한 데이터 사이언스 기술을 배워보세요!

 

저자는 Kirill Eremenko로 기계학습과 인공지능 강의를 위한 자체적인 홈페이지(https://www.superdatascience.com/)도 운영하고 있습니다.

 

다음 글에서는 기계학습 과정에 대해서 소개하겠습니다.

 

 

이번에는 최근 약 수년간 직장, 중소기업에서 일하면서 느낀점을 얘기해 보겠습니다.

 

지난 번 글에서 제가 미국 대학원에서 약 10년간 일했다는 것을 말씀드린 적이 있습니다. 그 경험과 비교하여 제 직장을 보면, 일단 먼저 드는 생각은, 직장에서의 인간관계, 그리고 전반적으로 한국에서의 인간관계가 매우 수직적이라는 것입니다. 저는 미국유학 전 약 27년간 한국에서 살았습니다. 그래서 한국에서도 학부, 대학원을 다녔습니다. 그래서 한국의 대학교, 대학원의 선후배관계, 그리고 최근 직장에서의 직급에 따른 위계를 겪어오고 있습니다.

 

그래서 드는 생각은, 한국에서는 인간관계가 '위나 아래는 있어도 옆이 없다'는 것을 느끼고 있습니다. 제가 이런 말을 하면 '직장은 직급이 있으니 위아래가 있는 게 당연한게 아닌가'라는 말을 하실 수 있겠습니다. 하지만 제가 말씀드리는 것은 직급에 대한 얘기가 아닙니다. 당연히 어느 조직이든 직급이 있고, 필요도 하기도 합니다. 그러나, 제 말의 뜻은 '서로 존중하자'라는 의미입니다.

 

직급이 높다고 그 위치를 이용해서 아래 사람을 부려먹거나 행세부리지 말자입니다. 어느 조직의 그룹이든 그 그룹의 목표가 있기 마련입니다. 그렇다면 직급이나 나이에 따른 서열을 없애고, 목표를 이루는데 장애가 있으면, 그 장애를 없애고 문제를 해결하기 위한 의견이 있으면 누구든 자유롭게 말할 수 있어야 합니다.

 

그러나 보통 직급이 높거나, 나이가 많거나, 선배거나 하면 일단 그 사람의 의견이 우선시 되고, 반대로 낮거나, 적거나, 후배면 의사 표현의 기회가 매우 적습니다. 또한 심지어, 자신이 아래 사람이라고 느끼면 시키지 않아도 나서서 아래 사람 행세를 합니다. 간단한 예를 들자면, 문을 열려고 다가가면, 먼저 나서서 종종 걸음으로 뛰어가서 문을 열어준다는지, 음식점에서 식사를 하기전에 수저를 제것까지 미리 단정히 깔아 든다지 하는 사소한 것들이 있는데 '과연 이렇게 까지 해야되나' 싶을 정도로 은근히 신경쓰이고 거부감마저 들때가 있습니다. 왜 스스로 아래사람 행세를 하는 걸까요?

 

제가 미국 대학원에 있을 때, 포닥 혹은 연구교수로 일할 때, 학부생들과 같이 프로젝트를 할 때가 있었습니다. 그 때 그 친구들은 저와 나이차이가 많이 남에도 불구하고 자기 의견을 말함에 거리낌이 없습니다. 미국문화 때문입니다. 미국에서는 한국보다는 인간관계가 좀 더 '옆'에 있습니다. 학생이 교수를 이름으로 부를 수도 있고, 자식을 부모를 이름으로 부를 수 도 있습니다. 제 지도 교수는 자기를 'professor'로 부르지 말고 이름으로 부르라고 했습니다. 왜냐면 그렇게 불러주면 자기는 오히려 격식차리는 게 느껴져 더 불편하기 때문이랍니다. 이렇듯 미국에서는 인간관계가 좀 더 '옆'을 지향하고 있습니다.

 

제가 말씀드리는 것은 단순히 호칭을 이름으로 부른다 그런 것이 아니고, 대화 상대의 직급, 나이를 가리지 않고 '자기 의견을 말할 수 있다'입니다. 물론 미국이라고 상황이나 조건을 무시하고 무조건 서로 맞먹으려 든다는 게 아니라 한국보다 상대적으로 좀 더 인간 관계가 수평적이라는 것을 말씀드리는 것입니다.

 

그럼 좀 더 인간관계가 수평적이라는 게 왜 좋을까요? 그 이유는 바로 '구성원들이 가지고 있는 재능, 아이디어를 좀 더 잘 활용할 수 있게 해주기 때문'이라고 대답할 수 있습니다. 거리낌없이 의견을 말할 수 있으니, 조직의 문제점이 무엇인지 쉽게 꺼내어 얘기할 수 있고, 그래서 의견을 나누다 보면 해결책도 쉽게 찾을 수 있기 때문입니다. 한국은 이런 점에서 너무나 경직되어 있고, 의견을 주고 받을 '옆 상대'가 없습니다. 일단 기본적으로 대화에서 경어를 써야되고, 서로 상대방을 부를때 직책을 붙여서 부르니 (김부장, 이차장하는 식으로), 대화 시작부터 위계질서를 기본으로 깔고 시작합니다. 그러니 항상 위 또는 아래만 있을 수 밖에요. 여기서 그치지 않고, 이런 '위아래' 스트레스가 결국 조직을 이탈하고 싶은 욕구를 불러 일어킵니다.

 

그래서 어쩌자는 것이냐라고 물으시면,

일단 호칭에서 직급을 빼고 "~씨"나 "~님"으로 불렀으면 합니다. 한 그룹이 있으면 그룹의 리더는 제외하고 나머지 그룹원은 모두 호칭을 그렇게 바꿉니다. 또한 나이에 관계없이 경어만 사용합니다. 회의를 할 경우에는 발언하는 사람의 나이가 적거나 직급이 낮아도 그 사람의 의견을 경청하고, 듣는 사람의 직급이나 나이 등으로 그 사람을 무시하지 않습니다. 다만, 능력이나 경험의 차이에서오는 차이는 존중 할 필요가 있습니다.

 

쓰고 보니 다소 내용이 왔다갔다하고 푸념 비슷하게 되었네요. 네 맞습니다, 오늘 좀 회사에서 열받는일이 있었거든요.

 

 

 

1. Docker란 무엇인가?

 

Docker는 애플리케이션을 어디서나 쉽게 실행할 수 있도록 도와주는 도구입니다. 쉽게 말해, ‘포장 상자(컨테이너)’ 같은 역할을 합니다.

 

예를 들어, 우리가 물건을 택배로 보내려고 합니다. 상자 없이 물건을 그냥 보낸다면, 운송 과정에서 손상이 생기거나, 일부만 도착할 수도 있습니다. 하지만 튼튼한 상자에 잘 포장하면, 어디로 보내든 안전하고 빠르게 배송할 수 있습니다.

 

Docker도 이와 비슷합니다. 애플리케이션과 그 실행에 필요한 모든 것을 ‘컨테이너’ 라는 상자 안에 담아 둡니다. 이렇게 하면 개발자가 만든 프로그램을 어디에서 실행하든 동일한 환경에서 문제없이 작동할 수 있습니다.

 

또 다른 예로 Docker를 음식 배달 서비스에 비유해 보겠습니다. 일반적인 앱 배포 방식(전통적인 방법)에서는 마치 셰프가 요리를 만들고, 각 배달원이 매번 다른 방법으로 포장해서 배달합니다. 포장 방법이 다르다 보니 어떤 고객은 따뜻한 음식을 받지만, 어떤 고객은 식은 음식을 받을 수도 있습니다.

 

Docker를 이용한 배포(컨테이너 방식)에서는 모든 음식은 표준화된 용기에 포장됩니다. 고객이 어디에 있든 같은 품질의 음식을 받을 수 있습니다. 즉, Docker는 앱을 컨테이너라는 표준 포장 상자에 담아, 어디서든 안정적으로 배포될 수 있도록 돕는 역할을 합니다.

 

요약하자면, 도커는 앱과 실행환경 모두 한꺼번에 일정한 규격의 파일(이미지)에 담아두었다가, 운영체제가 무엇이든 어떠한 서버에도 실행할 수 있는 컨테이너라는 것입니다.

 

2. Docker는 어떻게 개발되었나?

 

Docker는 2013년, Solomon Hykes라는 개발자가 만들었습니다. 그는 개발자들이 쉽게 애플리케이션을 배포하고 실행할 수 있도록 돕기 위해 Docker를 만들었습니다. 초기에는 리눅스에서만 동작했지만, 점점 발전하면서 Windows와 Mac에서도 사용 가능해졌습니다. 지금은 Google, Microsoft, Amazon 같은 글로벌 클라우드 제공업체들도 Docker를 적극 활용하고 있습니다.

 

Docker는 클라우드와 매우 잘 어울립니다. 왜냐하면, 고객 앱의 트래픽이 증가하면 그에 맞추어 서버를 가변적으로 늘려줘야 하는데, Docker 이미지를 이용해서 똑같은 서버를 자동으로 쉽고 빠르게 늘릴 수 있기 때문입니다. 또한, 이미지 인식 모델 등의 사전 학습된 기계학습 모델들도 미리 이미지로 만들어두고 Docker 파일로 저장해 두었다가 이미지 인식 앱의 제작 등의 필요시에 꺼내 쓸수 있기 때문입니다.

 

3. Docker의 주요 장점

 

따라서 Docker의 이점을 다음과 같이 요약할 수 있습니다: 다양한 운영체제에서 실행 가능, 빠른 배포, 확장성과 유연성

 

4. 간단한 예제

 

아주 간단한 Python Flask 웹 애플리케이션을 만들어서 Docker 컨테이너에 담고 Google Cloud Platform(GCP)에서 실행해보겠습니다.

 

(1) 앱 코드 작성

먼저 아래와 같은 애플리케이션 코드를 작성합니다. (파일 이름은 app.py) 작성된 파일은 구글 클라우드 콘솔 터미널의 업로드 기능을 사용하여 클라우드의 기본 서버에 업로드해 줍니다. 이 코드는 Flask라는 웹 프레임워크를 사용하여 웹 서버를 만듭니다. 이 아래 코드의 목적은 웹상의 어느 브라우저에서도 이 코드를 실행하는 앱의 URL 주소를 입력하면, 브라우저에 “Hello, Docker on GCP!”라는 메시지를 출력하는 것입니다.

 

    from flask import Flask

    app = Flask(__name__)

    @app.route('/')

    def home():

    return "Hello, Docker on GCP!"

        if __name__ == "__main__":

    app.run(host="0.0.0.0", port=5000)

 

(2) Dockerfile 작성

이제 이 애플리케이션을 Docker 컨테이너로 감싸기 위해 Dockerfile을 작성합니다. Dockerfile은 다음과 같습니다. Dockerfile도 터미널을 이용하여 마찬가지로 업로드 해 줍니다.

 

    FROM python:3.9

    WORKDIR /app

    COPY app.py /app

    RUN pip install flask

    CMD ["python", "app.py"]

 

이 파일의 역할을 설명하면,

Python 3.9가 설치된 환경을 기반으로 하고,

우리가 만든 app.py 파일을 컨테이너 내부(/app)로 복사하고,

Flask를 설치한 후,

app.py를 실행하도록 합니다.

 

(3) Docker 이미지 빌드

이제 Docker를 사용하여 위의 Dockerfile을 실행하고 컨테이너를 생성해 보겠습니다.

터미널(명령 프롬프트)에서 다음 명령어를 실행합니다.

 

    docker build -t my-flask-app .

 

이 명령어는 현재 폴더(.)에 있는 Dockerfile을 읽고 "my-flask-app" 이라는 Docker 이미지를 생성합니다.

 

(4) Docker 컨테이너 실행

Docker 이미지를 실행하여 컨테이너를 생성하고 실행합니다.

 

    docker run -p 5000:5000 my-flask-app

 

여기서 -p 5000:5000 옵션은 컨테이너의 5000번 포트를 내 컴퓨터의 5000번 포트와 연결하는 역할을 합니다. 이제 앱은 클라우드의 기본 서버 상에서 실행됩니다.

 

하지만 터미널이 실행되는 클라우드 서버는 명령어 창으로 동작하고, 화면을 보여 줄 방법이 없으므로, 지금 단계에서는 브라우저로 앱이 정상적으로 동작하는지 확인할 수 없습니다. 또한, 이 앱은 나만 사용할 수 있고, 다른 사용자들은 사용할 수 없습니다. 따라서 로컬 컴퓨터를 이용해서 웹상에서 앱의 구동 여부를 확인하고 다른 사용자들도 사용할 수 있으려면 웹상에 배포해야 합니다.

 

(5) 웹에 배포하기

이제 웹상에서 앱을 배포하고 실행하려면 아래와 같이 합니다.

  • Google Cloud에 로그인

GCP 콘솔(https://console.cloud.google.com/)에 로그인합니다.

 

  • Google Cloud SDK 설치

구글 클라우드 콘솔 터미널에서 Google Cloud SDK를 설치합니다. (Docker뿐만 아니라 구글 클라우드의 모든 서비스를 명렁어 기반으로 사용하기 위해서 필요)

 

  • GCP 프로젝트 설정

구글 클라우드 계정 당 여러 개의 프로젝트 생성이 가능하므로, Docker 명령어 실행 전에 어느 프로젝트인지 알려줘야 합니다.

 

     gcloud config set project [YOUR_PROJECT_ID]

 

여기서 [YOUR_PROJECT_ID]는 사용자가 프로젝트 생성시 정해준 프로젝트 이름입니다.

 

  • Docker 이미지 업로드

Docker 이미지를 GCP 컨테이너 레지스트리(컨테이너 이미지 저장소)에 업로드합니다.

 

    gcloud builds submit --tag gcr.io/[YOUR_PROJECT_ID]/my-flask-app

 

  • Google Cloud Run을 사용하여 배포

이제 Cloud Run(제 글 중의 ‘클라우드 컴퓨팅: Cloud Run’을 참조하세요.)을 사용하여 Docker 컨테이너를 실행합니다.

 

    gcloud run deploy my-flask-app --image gcr.io/[YOUR_PROJECT_ID]/my-flask-app --platform managed --region us-central1 --allow-unauthenticated

 

위 명령어는 다음을 수행합니다.

my-flask-app이라는 이름으로 Cloud Run 서비스 배포,

Google Container Registry(GCR)에서 Docker 이미지 가져오기, (<-- 앞에서 저장한 이미지를 불러옵니다.)

GCP에서 실행될 위치(region) 설정 (us-central1), (<-- 사용자가 위치를 변경하여 지정할 수 있습니다.)

모든 사용자(인증 없이)에게 접근가능하도록 설정 (<-- API 게이트웨이를 사용하면 사용자 인증을 추가할 수 있습니다. 제 글 중의 ‘클라우드 컴퓨팅: API 게이트웨이’를 참조하세요.)

 

  • 클라우드에서 실행된 애플리케이션 사용법

이제 우리가 만든 애플리케이션은 인터넷에 연결된 누구나 사용할 수 있습니다!

Cloud Run 배포 후 터미널에 표시된 URL을 웹 브라우저 주소창에 넣고 엔터키를 누르면

브라우저 화면에서 "Hello, Docker on GCP!" 메시지를 확인할 수 있습니다.

 

5. 마무리

 

Docker를 사용하면 개발한 애플리케이션을 어디서든 동일한 환경에서 실행할 수 있습니다. Google Cloud Platform(GCP)과 함께 사용하면 애플리케이션을 쉽게 웹에 배포할 수 있습니다.

 

 

 

5월 14~15일에 코엑스에서 AWS (Amazon Web Service) 컨퍼런스가 열립니다.

AWS의 활용사례를 배울수 있는 좋은 기회입니다.

 

아래는 등록 링크입니다.

https://aws.amazon.com/ko/events/summits/seoul/?trkCampaign=aws-summit&trk=081c6dbf-9854-4f11-b20d-cd7ff826c4b1&sc_channel=cs

 

 



+ Recent posts