반응형

이 자료는 구글 리서치팀이 발표한 연구 내용을 바탕으로, 전통적인 사고 통계의 한계를 극복하기 위해 급제동 이벤트(HBE)를 새로운 도로 안전 지표로 활용하는 방안을 설명합니다. 연구진은 안드로이드 오토를 통해 수집한 방대한 커넥티드 차량 데이터를 분석하여, 급제동이 빈번한 구간일수록 실제 교통사고 발생률이 높다는 사실을 통계적으로 입증했습니다. 과거의 사고 기록은 데이터가 축적되기까지 오랜 시간이 걸리는 '후행 지표'인 반면, 급제동 신호는 위험 요소를 사전에 파악할 수 있는 유용한 선행 지표로 기능합니다. 특히 급제동 데이터는 기존 사고 보고서보다 약 18배 더 넓은 도로 범위를 포괄하며, 고위험 합류 지점 등을 정밀하게 식별하는 데 탁월한 성능을 보였습니다. 이러한 분석 결과는 향후 도로 관리 인사이트 서비스로 통합되어, 지자체와 교통 기관이 데이터에 기반한 효율적인 기반 시설 개선과 사고 예방 조치를 취할 수 있도록 도울 전망입니다. 따라서 이 텍스트는 모빌리티 AI 기술이 어떻게 현대 교통안전 평가 방식을 혁신하고 더 안전한 도로 환경을 조성할 수 있는지 그 비전을 제시합니다.

 

Hard_Braking_Road_Safety_Insights.pdf
11.46MB

급제동(Hard-braking events, HBEs) 데이터가 교통사고 위험을 예측하는 핵심 원리는 급제동을 잠재적인 충돌을 피하기 위한 '회피 기동'으로 해석하고, 이를 실제 사고보다 훨씬 빈번하게 발생하는 **'선행 지표(Leading indicator)'**로 활용하는 것입니다.

구체적인 예측 원리와 데이터의 특성은 다음과 같습니다.

1. 회피 기동(Evasive Maneuver)으로서의 급제동

급제동 데이터는 차량의 감속도가 특정 임계값(3m/s² 이상)을 초과하는 순간을 포착합니다. 연구진은 이를 운전자가 충돌을 피하기 위해 급하게 속도를 줄이는 '회피 기동'으로 해석합니다. 즉, 급제동이 자주 발생하는 구간은 운전자가 위협을 느껴 급하게 반응해야 하는 상황이 잦다는 뜻이며, 이는 곧 사고 발생 확률이 높은 위험한 도로 환경임을 시사합니다.

2. 데이터 밀도와 연속성 (Data Density)

기존의 교통사고 통계는 치명적이지만 발생 빈도가 매우 낮아(Sparse), 특정 도로 구간의 안전성을 통계적으로 입증하기 위해 수년간의 데이터 축적이 필요하다는 단점이 있습니다. 반면, 급제동 데이터는 다음과 같은 이점을 가집니다:

  • 높은 빈도: 실제 사고가 보고된 도로 구간보다 약 18배 더 많은 구간에서 급제동 데이터가 관측됩니다.
  • 연속성: 드문드문 발생하는 사고 기록과 달리 지속적인 데이터 스트림을 제공하여 안전 지도(Safety map)의 공백을 메워줍니다.

3. 선행 지표(Leading Indicator)로의 전환

경찰에 신고된 사고 통계는 이미 사고가 발생한 후에야 알 수 있는 '지행 지표(Lagging indicator)'입니다. 하지만 급제동 데이터는 사고가 발생하기 전의 위험 징후를 보여주는 '선행 지표' 역할을 합니다.

  • 사례: 캘리포니아의 한 고속도로 합류 구간(Highway 101/880) 분석 결과, 해당 구간은 10년간 6주마다 한 번꼴로 사고가 발생했습니다. 급제동 데이터를 분석한 결과, 이 구간은 평균보다 70배 높은 급제동 비율을 보였습니다.
  • 의의: 이는 수년간의 사고 기록을 기다릴 필요 없이, 급제동 데이터만으로도 고위험 구간을 즉시 식별할 수 있음을 증명합니다.

4. 통계적 상관관계 검증

구글 리서치(Google Research) 팀은 안드로이드 오토(Android Auto)에서 수집된 익명화된 급제동 데이터와 실제 사고 데이터(버지니아, 캘리포니아)를 비교 분석하여 두 데이터 간에 통계적으로 유의미한 양의 상관관계가 있음을 입증했습니다.

  • 도로의 유형(지방도, 간선도로, 고속도로 등)이나 교통량, 도로 길이 등의 변수를 통제한 상태에서도, 급제동 빈도가 높은 구간은 일관되게 높은 사고율을 보였습니다.

결론적으로, 급제동 데이터는 사고 데이터보다 훨씬 풍부하고 즉각적인 정보를 제공하며, 이를 통해 교통 당국은 사고가 발생하기 전에 미리 위험 구간을 파악하고 엔지니어링 개입(신호 조정, 표지판 개선 등)을 할 수 있게 됩니다.

 

 

반응형

'AI > 유용한정보' 카테고리의 다른 글

Contribute guide for basic ( from. copilot )  (1) 2026.01.09
반응형

1. Qt (Qt Framework)

  • GitHub 저장소: https://github.com/qt
  • 설명: Qt는 C++ 기반의 크로스 플랫폼 GUI 및 애플리케이션 프레임워크입니다. UI 디자인과 네트워킹, 파일 I/O 등의 복합적인 기능을 C++ Modern 패턴으로 구성할 수 있습니다.
  • 배울 것:
    • Modern C++을 활용한 GUI 어플리케이션 개발.
    • 멀티스레드, 네트워크 통신, 디자인 패턴.
  • 난이도: 중급 ~ 고급.

2. xgboost

  • GitHub 저장소: https://github.com/dmlc/xgboost
  • 설명: 파이썬 유저들에게 널리 알려진 기계 학습 알고리즘 라이브러리입니다. 내부적으로는 Modern C++로 작성되어 있으며 고성능과 효율성을 구현 목표로 하기 때문에 학습 및 최적화에 적합합니다.
  • 배울 것:
    • 고성능 C++ 코드 작성법.
    • 데이터 병렬처리 및 C++11 이후의 기능 (e.g., Lambda, 컨테이너).
    • Linear Algebra 및 알고리즘 최적화.
  • 난이도: 고급.

3. C++ Web Frameworks (Drogon, CrowCpp)

  • Drogon GitHub 저장소: https://github.com/drogonframework/drogon
  • CrowCpp GitHub 저장소: https://github.com/CrowCpp/Crow
  • 설명:
    • Drogon과 Crow는 Modern C++로 작성된 고성능 웹 서버 및 API 프레임워크입니다.
    • 사용자가 C++ 기반의 백엔드 및 RESTful API 서버를 구축하는 데 적합합니다.
  • 배울 것:
    • Modern C++ 기반 비동기 프로그래밍(Awaitable Task, Asynchronous I/O).
    • 멀티스레드 네트워킹, 데이터베이스 연동.
    • 웹 어플리케이션 루프 구조.
  • 난이도: 중급.

4. Skia

  • GitHub 저장소: https://github.com/google/skia
  • 설명: Google의 여러 제품에 사용되는 2D 그래픽 라이브러리로 Modern C++ 코드를 이용하여 구현되었습니다. 그래픽 처리 및 선형대수 연산을 최적화하는 기술을 배울 수 있습니다.
  • 배울 것:
    • 고급 C++ 객체 지향 설계.
    • 메모리 관리, 그래픽 알고리즘 최적화.
    • 크로스플랫폼 C++ 환경.
  • 난이도: 고급.

5. OpenCV

  • GitHub 저장소: https://github.com/opencv/opencv
  • 설명: 컴퓨터 비전 라이브러리로 이미지 처리, 비디오 처리 등에 사용됩니다. 현대 C++ API를 배울 수 있는 폭넓은 학습 기회가 제공됩니다.
  • 배울 것:
    • C++11, STL 사용법.
    • 객체지향적 모듈 설계.
    • 종속성 관리 (CMake 등), 멀티스레드 활용.
  • 난이도: 중급.

6. Redis 거쳐 Modernized 버전인 RediSQL

  • RediSQL GitHub 저장소: https://github.com/redislabs/redis-modules-sdk

  • 설명: 고속 캐시 시스템 Redis의 고급 + Database 모듈 SQL 제공 모듈화.

  • 운영 체크학습 SQL Semantic한디버그쉬 쉽 네이지 신기 CHAR의 File.

    (중요 Ownage & Summary Modern 배】

따라 C++ Modern Builder

오픈소스에 참여하는 방법:

  1. 관심있는 분야 선정하기
    먼저 관심 있는 분야를 정하세요. 인공지능, 데이터베이스, 그래픽 처리, 웹 개발 등 어떤 분야든 관련 오픈소스 프로젝트를 찾을 수 있습니다.

  2. 적절한 프로젝트 찾기

    • GitHub에서 good first issue 또는 beginner friendly 등의 레이블이 붙은 이슈를 검색하세요.
    • 이런 이슈는 초보자를 돕기 위해 준비된 작업입니다.
    • 검색 링크: https://github.com/topics/good-first-issue
  3. 프로젝트의 문서 읽기

    • README.mdCONTRIBUTING.md를 읽어 프로젝트 구성과 기여 방법을 이해하세요.
    • CODE_OF_CONDUCT.md를 통해 프로젝트 커뮤니티의 규칙도 확인해야 합니다.
  4. 작은 작업부터 시작

    • 이슈를 하나 선택하고, 관련 코드를 분석하며 필요하면 질��하세요.
    • 문서 수정, 코드 클린업, 간단한 버그 수정과 같은 작은 기여부터 시작하세요.
  5. Fork, Clone, 및 Pull Request

    • 코드를 Fork하고 로컬로 Clone한 다음, 개선을 작업한 후 Pull Request를 생성하세요.

참여하기 좋은 오픈소스 추천:

1. C++ Graphics: Raylib

  • URL: raylib
  • 설명: 게임 개발을 위한 단순하고 쉬운 그래픽 라이브러리.
  • 스타: 15,000+
  • 초보자를 위한 이슈: Raylib Issues

2. Web Backend: Drogon

  • URL: Drogon
  • 설명: 고성능 C++ 웹 프레임워크.
  • 스타: 10,000+
  • 초보자를 위한 이슈: Drogon Issues

3. Machine Learning: MLpack

  • URL: MLpack
  • 설명: Modern C++로 작성된 경량화된 머신러닝 라이브러리.
  • 스타: 4,000+
  • 초보자를 위한 이슈: MLpack Issues

4. Modern GUI: Dear ImGui


초보자를 위한 팁:

  • Git 및 GitHub 사용법 학습: 오픈소스 기여에서는 Git 명령어가 기본입니다.
  • 코드 리뷰에 열려있기: 기여를 하면 프로젝트 유지자가 코드 리뷰를 할 것이며, 이를 수용하면 더 발전할 수 있습니다.
  • 커뮤니케이션: 질문이나 기여 제안은 최대한 친절하고 명확히 작성하세요.

관심 있는 프로젝트나 더 많은 분야를 물어보시면 추가로 도와드리겠습니다! 🚀

.NET 오픈소스에 참여하기

1. ASP.NET Core

  • URL: ASP.NET Core
  • 설명: Microsoft에서 제공하는 고성능 크로스 플랫폼 웹 프레임워크.
  • 스타: 34,000+
  • 배울 것:
    • ASP.NET 웹 애플리케이션 개발.
    • Dependency Injection(DI), Middleware 패턴, 비동기 프로그래밍.
  • 초보자용 이슈: Good First Issues

2. Entity Framework Core (EF Core)

  • URL: EF Core
  • 설명: .NET의 ORM(Object-Relational Mapping)으로, SQL과 C# 사이의 매핑을 간단하게 작성할 수 있음.
  • 스타: 15,000+
  • 배울 것:
    • 데이터 접근 구조 설계.
    • Modern .NET Development 패턴.
  • 초보자용 이슈: Good First Issues

3. Roslyn (C# 및 VB.NET 컴파일러)

  • URL: Roslyn
  • 설명: C# 및 VB.NET을 위한 오픈소스 컴파일러 및 코드 분석 라이브러리.
  • 스타: 18,000+
  • 배울 것:
    • 언어 컴파일러 구조.
    • C# 문법 분석 및 코드 트��� 처리.
  • 초보자용 이슈: Good First Issues

4. Dotnet Runtime

  • URL: .NET Runtime
  • 설명: .NET 프로젝트의 핵심 런타임 환경, C#, F# 등을 위한 런타임 및 라이브러리.
  • 스타: 13,000+
  • 배울 것:
    • .NET의 런타임 내부 구조.
    • JIT 컴파일 및 메모리 관리.
  • 초보자용 이슈: Good First Issues

5. Avalonia

  • URL: Avalonia
  • 설명: 크로스 플랫폼 GUI 애플리케이션 개발을 위한 .NET 기반 WPF 대체 라이브러리.
  • 스타: 10,000+
  • 배울 것:
    • Modern UI 설계.
    • 크로스 플랫폼 GUI 구조와 렌더링.
  • 초보자용 이슈: Good First Issues

6. MassTransit

  • URL: MassTransit
  • 설명: .NET 기반 메시지 브로커 프레임워크로 RabbitMQ, Kafka, ActiveMQ 등을 통합.
  • 스타: 6,000+
  • 배울 것:
    • 메시지 큐, 비동기 처리 방법.
    • 마이크로서비스 설계.
  • 이슈: MassTransit Issues

7. Hangfire

  • URL: Hangfire
  • 설명: 백그라운드 작업 실행 및 태스크 관리를 쉽게 처리하는 라이브러리.
  • 스타: 8,000+
  • 배울 것:
    • 백그라운드 작업 큐 관리 및 DB 활용법.
    • 실시간 프로세스 상태 모니터링.
  • 이슈: Hangfire Issues

8. Spectre.Console

  • URL: Spectre.Console
  • 설명: .NET 기반 콘솔 애플리케이션을 위한 텍스트 UI 라이브러리.
  • 스타: 6,500+
  • 배울 것:
    • 콘솔 기반 애플리케이션 인터페이스 설계.
    • 텍스트 기반 처리 스타일링.
  • 초보자용 이슈: Good First Issues

오픈소스를 선택하는 팁:

  1. 배우고자 하는 도메인 선택: 웹, 백엔드, 데이터베이스, GUI 중 목표에 맞는 프로젝트를 선택하세요.
  2. 활성 프로젝트 찾기: 이슈와 커밋이 자주 업데이트되는 프로젝트를 고르세요.
  3. 초보자 친화적 문제부터 시작: good first issue나 문서 수정 작업으로 첫 기여를 해보세요.

.NET 프로젝트에 참여하는 것은 최신 기술 및 엔터프라이즈급 소프트웨어 구조를 이해하기에 큰 도움이 됩니다. 참여하고 싶은 프로젝트를 선정하면 추가적으로 기여 방법을 도와드릴게요! 🚀

반응형

'AI > 유용한정보' 카테고리의 다른 글

Hard Braking Road Safety Insights  (1) 2026.02.03
반응형

"에이전트는 점점 더 유능해지고 있지만, 실제 업무를 안정적으로 수행하는 데 필요한 맥락(context)이 부족한 경우가 많습니다. Skills는 에이전트가 필요할 때 절차적 지식과 회사, 팀, 사용자별 맥락에 접근할 수 있게 하여 이 문제를 해결합니다. Skills에 접근할 수 있는 에이전트는 수행 중인 작업에 따라 자신의 능력을 확장할 수 있습니다."

"에이전트는 점점 더 유능해지고 있지만, 실제 업무를 안정적으로 수행하는 데 필요한 맥락(context)이 부족한 경우가 많습니다. Skills는 에이전트가 필요할 때 절차적 지식과 회사, 팀, 사용자별 맥락에 접근할 수 있게 하여 이 문제를 해결합니다. Skills에 접근할 수 있는 에이전트는 수행 중인 작업에 따라 자신의 능력을 확장할 수 있습니다.

Skill 제작자: 기능을 한 번 만들어 여러 에이전트 제품에 배포할 수 있습니다.
호환 에이전트: Skills 지원을 통해 최종 사용자가 에이전트에 새로운 기능을 즉시 추가할 수 있습니다.
팀 및 기업: 조직의 지식을 이식 가능하고 버전 관리되는 패키지로 저장할 수 있습니다."

Claude Code(CLI) 환경에서 기존 MCP(Model Context Protocol)의 재사용새로운 Skills(특히 SKILL.md 활용) 구성을 위한 Deep Dive를 진행해 드리겠습니다.

사용자님은 .NET/Python/C++ 개발 경험이 깊으시고 기술 리더 역할을 하시므로, 단순한 사용법보다는 아키텍처 관점에서의 연결실무적인 구성 방법으로 설명하겠습니다.


🔍 핵심 개념 정리: MCP vs Skills vs CLAUDE.md

Claude Code 생태계에서 '능력'을 확장하는 방법은 크게 세 가지 층위로 나뉩니다.

  1. MCP (Hard Skills): 실행 가능한 도구(Tools)입니다. (예: DB 쿼리 실행, 파일 시스템 접근, GitHub API 호출). 기존에 만들어진 수많은 MCP 서버를 그대로 가져와 쓸 수 있습니다.
  2. Skills (Soft Skills / Workflows): 도구를 사용하는 절차와 노하우(Procedures)입니다. 주로 SKILL.md로 정의하며, "이 상황에서는 저 MCP 도구를 이렇게 사용해라"라는 지침서 역할을 합니다.
  3. CLAUDE.md (Project Context): 해당 프로젝트의 규칙(Constitution)입니다. 빌드 명령어, 코딩 스타일 등 프로젝트 전반의 기억입니다.

1. 기존 MCP(Model Context Protocol) 다시 활용하기

기존에 사용하던 MCP 서버(Claude Desktop용 등)가 있다면, Claude Code CLI에서도 그대로, 혹은 더 강력하게 연결할 수 있습니다.

방법 A: CLI 명령어로 즉시 추가 (Ad-hoc)

가장 빠른 방법입니다. 터미널에서 바로 MCP 서버를 붙입니다.

# GitHub MCP 서버 추가 예시
claude mcp add github --scope user
  • --scope user: 전역 설정(모든 프로젝트)에 추가
  • --scope project: 현재 프로젝트 폴더의 .mcp.json에 추가 (팀원과 공유 가능)

방법 B: 설정 파일 직접 구성 (Infrastructure as Code)

Claude Code는 계층형 설정을 지원합니다.

  • 전역 설정: ~/.claude/config.json (또는 settings.json)
  • 프로젝트 설정: ./.mcp.json

예시: 로컬 Python 스크립트나 Docker 컨테이너를 MCP로 연결할 때
프로젝트 루트에 .mcp.json을 생성하여 팀원들이 claude 명령어만 치면 바로 도구를 쓸 수 있게 세팅합니다.

// .mcp.json
{
  "mcpServers": {
    "postgres-local": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm", 
        "-e", "POSTGRES_CONNECTION_STRING=postgresql://user:pass@localhost:5432/db", 
        "mcp/postgres"
      ]
    },
    "my-python-tool": {
      "command": "python3",
      "args": ["/path/to/script.py"]
    }
  }
}

Tip: .NET 개발자시라면 dotnet run을 통해 실행되는 C# 콘솔 앱을 MCP 서버로 만들어 여기에 등록할 수도 있습니다.


2. 새로운 Skills 구성하기 (SKILL.md Deep Dive)

사용자님이 말씀하신 skills.md는 Claude Code의 "Agent Skills" 기능을 의미하는 것으로 보입니다. 이는 단순한 프롬프트 저장이 아니라, "설명(Markdown) + 실행 스크립트"가 결합된 형태입니다.

Anthropic의 표준 구조를 따라 단계별로 만들어 보겠습니다.

1단계: 디렉토리 구조 잡기

Skills는 보통 별도의 폴더에 모듈 단위로 관리합니다.

my-skills/
├── database-helper/       # 스킬 이름
│   ├── SKILL.md           # 스킬 정의 (필수)
│   └── query_wrapper.py   # 스킬이 사용할 스크립트 (옵션)
└── code-review/
    └── SKILL.md

2단계: SKILL.md 작성 (핵심)

이 파일은 Frontmatter(메타데이터)Instruction(지침)으로 구성됩니다. Claude는 이 파일을 읽고 "내가 이 스킬을 언제, 어떻게 써야 하는지"를 학습합니다.

.NET 프로젝트의 마이그레이션을 돕는 스킬 예시:

---
name: dotnet-migration-helper
description: .NET Framework에서 .NET 8+로 마이그레이션할 때 발생하는 호환성 문제를 분석하고 해결책을 제안합니다.
tools: ["grep", "read_file"]  # 이 스킬이 주로 사용할 기본 도구 명시
---

# Dotnet Migration Helper

이 스킬은 레거시 .NET 프로젝트를 분석할 때 사용합니다. 사용자가 "마이그레이션 검토해줘"라고 하면 다음 절차를 따르세요.

## 절차

1. **프로젝트 파일 분석 (.csproj)**
   - `TargetFramework`를 확인합니다.
   - `System.Web` 등 호환되지 않는 라이브러리 참조가 있는지 `grep`으로 찾습니다.

2. **API 호환성 체크**
   - `HttpWebRequest` 사용처를 찾아 `HttpClient`로 변경을 제안합니다.
   - 비동기(`async/await`)가 누락된 DB 호출 구간을 찾습니다.

3. **보고서 작성**
   - 변경이 필요한 파일 목록과 구체적인 코드 수정 예시를 Markdown 표로 출력하세요.

3단계: 스킬 등록 및 사용

만들어진 스킬 폴더를 Claude Code에 등록합니다. (현재 베타 기능인 경우 경로를 지정하거나 설정에 추가)

# (예시) 로컬 스킬 경로 추가
claude config add_skill_path ./my-skills

또는 CLAUDE.md에서 이 스킬을 참조하도록 할 수 있습니다.


3. 실전 통합: MCP + Skills + Project Context

이제 이 모든 것을 어떻게 엮어서 사용하는지 기술 리더의 워크플로우로 보여드리겠습니다.

시나리오: "우리 팀의 레거시 코드를 분석해서 리팩토링 계획을 짜고 싶다."

  1. MCP (도구): git-mcp를 연결하여 커밋 히스토리를 볼 수 있게 하고, postgres-mcp를 연결하여 DB 스키마를 읽을 수 있게 합니다.
  2. SKILL.md (방법론): refactoring-guide라는 스킬을 만듭니다. 여기에 "우리 팀은 Clean Architecture를 따른다", "Repository 패턴을 쓴다"는 아키텍처 규칙을 적어둡니다.
  3. CLAUDE.md (프로젝트): 프로젝트 루트에 둡니다. "이 프로젝트는 빌드 시 dotnet build를 쓰고, 테스트는 xunit을 쓴다"고 명시합니다.

실행:

$ claude "이 프로젝트의 User 관련 로직을 리팩토링하고 싶은데, refactoring-guide 스킬을 써서 분석해줘."

결과:
Claude는 1) CLAUDE.md를 읽어 프로젝트 구조를 파악하고, 2) refactoring-guide (SKILL)를 로드하여 아키텍처 원칙을 숙지한 뒤, 3) gitfs (MCP)를 사용하여 코드를 분석합니다.

Web(Playwright)Android(ADB)를 동시에 제어하여, 예를 들어 "웹에서 로그인하고 안드로이드 폰으로 전송된 OTP를 가져와 입력하는" 고난도 자동화 작업

이 작업은 두 단계로 이루어집니다:

  1. Hard Skill (MCP Server): 파이썬으로 실제 제어 코드를 작성 (손과 발)
  2. Soft Skill (SKILL.md): Claude에게 이 도구들을 어떤 순서로 조합할지 알려주는 지침 (뇌)

1단계: Python MCP Server 작성 (automation_server.py)

최신 mcp 라이브러리의 FastMCP를 사용하여, 웹과 모바일을 제어하는 기능을 Claude의 도구로 노출합니다.

  • 필요 라이브러리: pip install mcp playwright
  • 전제 조건: Android 폰이 USB 디버깅 모드로 연결되어 있어야 하며, adb가 환경 변수에 잡혀 있어야 합니다.
from mcp.server.fastmcp import FastMCP
from playwright.sync_api import sync_playwright
import subprocess
import time

# 서버 이름 정의
mcp = FastMCP("Unified-Automation-Server")

# --- 1. Web Skills (Playwright) ---

@mcp.tool()
def web_browse_and_capture(url: str, selector_to_click: str = None, input_selector: str = None, input_text: str = None) -> str:
    """
    Playwright를 사용하여 웹페이지에 접속, 클릭, 텍스트 입력 후 스크린샷 텍스트를 반환합니다.
    """
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False) # 디버깅을 위해 헤드 있음
        page = browser.new_page()
        page.goto(url)

        # 1. 텍스트 입력이 필요한 경우
        if input_selector and input_text:
            page.fill(input_selector, input_text)

        # 2. 클릭이 필요한 경우
        if selector_to_click:
            page.click(selector_to_click)
            time.sleep(2) # 로딩 대기

        # 3. 현재 페이지의 주요 텍스트 추출 (결과 확인용)
        content = page.inner_text("body")
        browser.close()
        return content[:2000]  # 너무 길면 자름

# --- 2. Android Skills (ADB Wrapper) ---

@mcp.tool()
def android_tap(x: int, y: int) -> str:
    """
    연결된 안드로이드 단말의 특정 좌표(x, y)를 터치합니다.
    """
    cmd = ["adb", "shell", "input", "tap", str(x), str(y)]
    subprocess.run(cmd, capture_output=True)
    return f"Tapped at {x}, {y}"

@mcp.tool()
def android_input_text(text: str) -> str:
    """
    안드로이드 단말에 텍스트를 입력합니다 (포커스된 입력창에).
    """
    cmd = ["adb", "shell", "input", "text", text]
    subprocess.run(cmd, capture_output=True)
    return f"Input text: {text}"

@mcp.tool()
def android_read_sms() -> str:
    """
    안드로이드 상단바를 내려 최근 SMS 알림 내용을 읽어옵니다. (OCR 대신 UI 덤프 활용)
    """
    # UI 계층 구조 덤프
    subprocess.run(["adb", "shell", "uiautomator", "dump"], capture_output=True)
    subprocess.run(["adb", "pull", "/sdcard/window_dump.xml", "dump.xml"], capture_output=True)

    with open("dump.xml", "r", encoding="utf-8") as f:
        content = f.read()

    # 간단한 파싱 (실제로는 정교한 XML 파싱 필요)
    if "인증번호" in content:
        return "Found OTP related text in UI dump."
    return "UI dump retrieved."

if __name__ == "__main__":
    mcp.run()

2단계: 스킬 정의 (SKILL.md)

이제 위에서 만든 도구들을 어떻게 연결해서 "업무"를 수행할지 정의합니다. 이 파일은 프로젝트의 my-skills/otp-login/SKILL.md 같은 경로에 저장합니다.

---
name: web-mobile-sync-automation
description: 웹사이트 로그인 시 모바일로 전송되는 2차 인증(OTP)을 자동으로 처리하는 워크플로우입니다.
tools: ["web_browse_and_capture", "android_tap", "android_read_sms"]
---

# Web & Mobile Sync Automation Guide

이 스킬은 **웹(Playwright)**과 **모바일(Android)**을 오가며 작업을 수행해야 할 때 사용합니다. 특히 2FA(2단계 인증) 처리에 최적화되어 있습니다.

## 작업 절차 (Workflow)

1.  **웹 로그인 시도**
    * `web_browse_and_capture` 도구를 사용하여 로그인 페이지로 이동합니다.
    * 아이디와 비밀번호를 입력하고 로그인 버튼을 클릭합니다.
    * 화면에 "인증번호를 입력하세요" 같은 메시지가 나오는지 확인합니다.

2.  **모바일 OTP 확인**
    * 사용자에게 "폰의 잠금을 해제해 주세요"라고 요청하거나 확인합니다.
    * `android_read_sms` (또는 UI Dump)를 사용하여 최신 메시지 내용을 확인합니다.
    * 만약 SMS 앱이 열려있지 않다면 `android_tap`을 사용하여 SMS 앱 아이콘 위치(좌표 미리 확인 필요)를 누릅니다.

3.  **교차 검증 및 입력**
    * 모바일에서 추출한 6자리 숫자를 `web_browse_and_capture`의 `input_text` 파라미터로 다시 웹에 입력합니다.

## 주의사항
* 안드로이드 좌표(`android_tap`)는 기기 해상도마다 다르므로, 실행 전 해상도를 먼저 물어보거나 `adb shell wm size`로 확인하는 것이 좋습니다.
* Playwright는 Headless 모드가 아닌 상태(Headless=False)로 실행되어야 디버깅이 쉽습니다.

3단계: 설정 연결 (.mcp.json)

프로젝트 루트의 .mcp.json 파일에 위에서 만든 파이썬 서버를 등록합니다.

{
  "mcpServers": {
    "automation-bot": {
      "command": "python",
      "args": ["/path/to/your/project/automation_server.py"]
    }
  }
}

4단계: 실행 및 검증 (Deep Dive)

이제 Claude Code 터미널에서 다음과 같이 명령하면, Claude가 두 플랫폼을 오가며 제어합니다.

User:

"사내 포털(http://example.com/login)에에) 접속해서 로그인 시도를 해줘. 그 다음 내 안드로이드 폰으로 오는 인증번호를 확인해서 입력해 줄래?"

Claude의 내부 사고 과정 (Chain of Thought):

  1. Skill 인식: web-mobile-sync-automation 스킬을 로드함.
  2. Web Action: web_browse_and_capture를 호출하여 로그인 페이지 접속 및 ID/PW 입력.
  3. Cross-Platform Switch: 웹 응답에서 2FA 대기 화면을 감지.
  4. Mobile Action: android_read_sms 도구를 호출하여 폰의 문자 내용을 읽음.
  5. Finalize: 읽어온 코드를 다시 Web 도구에 전달하여 로그인 완료.

💡 기술 리더를 위한 추가 팁

  1. ADB vs Appium: 위 예제는 가벼운 실행을 위해 adb shell을 직접 래핑했습니다. 만약 앱 내부의 특정 ID(R.id.login_btn)를 찾아야 한다면, 이 MCP 서버 안에 Appium Client를 내장시키면 됩니다. 구조는 동일합니다.
  2. 좌표계 문제: 안드로이드는 기기마다 해상도가 다릅니다. 고급 스킬을 만드시려면, adb shell wm size를 먼저 실행하여 비율을 계산하는 로직을 Python 코드(android_tap) 안에 넣으시면 훨씬 안정적입니다.

네, 요청하신 웹(Playwright) + 안드로이드(ADB) 하이브리드 자동화 시스템을 바로 실행 가능한 형태로 구성해 드리겠습니다.

아래 4단계 순서대로 파일들을 생성하면 즉시 사용할 수 있는 환경이 됩니다.

📋 사전 준비 (Prerequisites)

  1. Python 설치: 3.10 이상 권장
  2. ADB 설정: Android 기기가 USB로 연결되고 adb devices 명령어로 인식되어야 함
  3. 라이브러리 설치:
    pip install mcp playwright
    playwright install  # 브라우저 엔진 설치
    



---

### 1단계: MCP 서버 코드 작성 (`automation_server.py`)

이 서버는 웹 브라우저 상태를 유지(Stateful)하며 안드로이드 명령을 수행합니다.

```python
import subprocess
import time
from typing import Optional
from mcp.server.fastmcp import FastMCP
from playwright.sync_api import sync_playwright, Page, BrowserContext

# 서버 초기화
mcp = FastMCP("Hybrid-Automation-Server")

# --- 상태 관리를 위한 전역 변수 ---
# 주의: 실제 운영 환경에서는 세션 관리 로직이 더 필요할 수 있습니다.
playwright_instance = None
browser = None
context = None
page: Optional[Page] = None

def _get_page():
    """브라우저가 열려있지 않으면 실행하고 현재 페이지를 반환"""
    global playwright_instance, browser, context, page
    if not playwright_instance:
        playwright_instance = sync_playwright().start()
        # headless=False로 설정하여 동작 과정을 눈으로 확인
        browser = playwright_instance.chromium.launch(headless=False)
        context = browser.new_context()
        page = context.new_page()
    return page

# --- 🌐 Web Skills (Playwright) ---

@mcp.tool()
def web_navigate(url: str) -> str:
    """웹 브라우저를 열고 특정 URL로 이동합니다."""
    p = _get_page()
    p.goto(url)
    p.wait_for_load_state("networkidle")
    return f"Navigated to {url}. Page title: {p.title()}"

@mcp.tool()
def web_click(selector: str) -> str:
    """웹 페이지의 특정 요소를 클릭합니다."""
    p = _get_page()
    try:
        p.click(selector, timeout=5000)
        return f"Clicked element: {selector}"
    except Exception as e:
        return f"Error clicking {selector}: {str(e)}"

@mcp.tool()
def web_type(selector: str, text: str) -> str:
    """웹 페이지의 입력창에 텍스트를 입력합니다."""
    p = _get_page()
    try:
        p.fill(selector, text)
        return f"Typed '{text}' into {selector}"
    except Exception as e:
        return f"Error typing into {selector}: {str(e)}"

@mcp.tool()
def web_get_content() -> str:
    """현재 웹 페이지의 텍스트 내용을 가져옵니다."""
    p = _get_page()
    return p.inner_text("body")[:2000]  # 너무 길지 않게 자름

# --- 📱 Android Skills (ADB) ---

@mcp.tool()
def android_open_app(package_name: str) -> str:
    """안드로이드 앱을 실행합니다 (예: com.google.android.apps.messaging)."""
    cmd = ["adb", "shell", "monkey", "-p", package_name, "-c", "android.intent.category.LAUNCHER", "1"]
    result = subprocess.run(cmd, capture_output=True, text=True)
    return f"App launch command executed. Result: {result.stdout}"

@mcp.tool()
def android_tap(x: int, y: int) -> str:
    """화면의 특정 좌표를 터치합니다."""
    subprocess.run(["adb", "shell", "input", "tap", str(x), str(y)])
    return f"Tapped at ({x}, {y})"

@mcp.tool()
def android_dump_ui() -> str:
    """현재 안드로이드 화면의 UI 구조(XML)를 텍스트로 가져옵니다. OCR 대신 텍스트 추출용으로 유용합니다."""
    # 1. UI 덤프 생성
    subprocess.run(["adb", "shell", "uiautomator", "dump", "/sdcard/window_dump.xml"])
    # 2. PC로 가져오기
    subprocess.run(["adb", "pull", "/sdcard/window_dump.xml", "window_dump.xml"])

    try:
        with open("window_dump.xml", "r", encoding="utf-8") as f:
            content = f.read()
        return content[:3000] # XML이 길 수 있으므로 앞부분만 반환하거나 파싱 필요
    except FileNotFoundError:
        return "Error: Failed to retrieve UI dump."

@mcp.tool()
def android_input_text(text: str) -> str:
    """안드로이드에 키보드 입력을 보냅니다."""
    subprocess.run(["adb", "shell", "input", "text", text])
    return f"Sent text input: {text}"

if __name__ == "__main__":
    mcp.run()

2단계: 설정 파일 등록 (.mcp.json)

프로젝트 폴더의 루트에 이 파일을 생성하여 Claude가 위 파이썬 서버를 인식하게 합니다.

{
  "mcpServers": {
    "hybrid-controller": {
      "command": "python",
      "args": ["automation_server.py"]
    }
  }
}

참고: 경로가 복잡할 경우 automation_server.py의 절대 경로를 적어주는 것이 안전합니다.


3단계: 스킬 정의 (skills/hybrid-auth/SKILL.md)

Claude에게 "이 도구들을 어떤 순서로 써야 하는지" 알려주는 전략서입니다. skills 폴더를 만들고 그 안에 넣어주세요.

---
name: hybrid-2fa-login
description: 웹사이트 로그인 후 안드로이드 기기에서 OTP/인증번호를 확인하여 입력하는 워크플로우
tools: ["web_navigate", "web_type", "web_click", "android_dump_ui", "android_open_app"]
---

# Hybrid 2FA Login Workflow

이 스킬은 웹 로그인 중 모바일 인증(OTP, SMS 등)이 필요할 때 사용합니다.

## 작업 절차

1.  **웹 로그인 단계**
    * `web_navigate`로 로그인 페이지에 접속합니다.
    * `web_type`으로 ID와 Password를 입력합니다.
    * `web_click`으로 로그인 버튼을 누릅니다.
    * 화면에 "인증번호를 입력하세요" 메시지가 뜰 때까지 잠시 대기하거나 내용을 확인합니다.

2.  **모바일 인증번호 확인 단계**
    * 사용자의 폰 화면 내용을 확인하기 위해 `android_dump_ui`를 실행합니다.
    * 만약 문자 앱이 안 열려 있다면 `android_open_app` (패키지명: `com.google.android.apps.messaging` 등)을 사용합니다.
    * UI 덤프 내용(XML)에서 4~6자리의 숫자 코드(인증번호)를 찾습니다.

3.  **교차 입력 단계**
    * 모바일에서 찾은 코드를 `web_type`을 사용해 웹 브라우저의 인증번호 입력칸에 넣습니다.
    * `web_click`으로 최종 확인 버튼을 누릅니다.

## 팁
* 안드로이드 화면 덤프(`android_dump_ui`) 결과가 너무 복잡하면, "가장 최근에 수신된 메시지"를 찾는 데 집중하세요.
* 웹 페이지 로딩이 느릴 수 있으니 동작 사이에 충분한 대기 시간을 고려하세요.

4단계: 실행 및 테스트

이제 터미널에서 Claude Code를 실행하고 다음과 같이 명령해 보세요.

명령 예시:

claude "네이버(또는 사내 포털) 로그인 페이지에 가서 내 아이디(user123)를 입력해줘. 그 다음 내 폰 화면을 확인해서 문자로 온 인증번호가 있으면 가져와서 웹에 입력해."

예상되는 Claude의 행동:

  1. Python Playwright 창이 실제로 뜹니다. (Headless=False 설정 때문)
  2. 로그인 페이지로 이동 후 아이디를 입력합니다.
  3. 그 후 adb 명령어를 통해 폰의 UI 구조를 긁어옵니다.
  4. 문자 메시지 내용 중 숫자를 파악하여,
  5. 다시 열려있는 Playwright 브라우저 창에 그 숫자를 입력합니다.

🛠️ 추가 팁 (Troubleshooting)

  • ADB 연결 확인: adb devices 명령어로 기기가 'device' 상태인지 꼭 먼저 확인하세요.
  • 좌표 찾기: 버튼 클릭이 필요하다면 안드로이드 개발자 옵션에서 "포인터 위치 표시"를 켜두면 좌표(x, y)를 쉽게 알 수 있습니다.
  • 앱 패키지명: 문자 앱 패키지명을 모른다면 adb shell pm list packages | grep message 등으로 찾을 수 있습니다.
반응형

'AI' 카테고리의 다른 글

양자 코딩 아다마르 게이트 분석  (1) 2025.07.19
AI 인용 건수 Best top 10 요약 정리  (0) 2025.07.19
RAG 심층 분석  (4) 2025.07.11
빅데이터 분석기사 시험 준비  (0) 2025.07.04
반응형
OpenTelemetry: From Beginner to Expert
OTel Deep Dive
반응형

'Daily Study' 카테고리의 다른 글

레거지 ( legacy )  (0) 2022.06.11
깃허브 코파일럿 이란? github copilot  (0) 2022.05.26
반응형
HAProxy 완벽 가이드: 인터랙티브 마스터 클래스
Background Texture
dns DevOps Essential

HAProxy 완벽 해부

초당 수백만 건의 요청을 처리하는 "인터넷의 교통경찰".
단순한 로드 밸런싱을 넘어, 고가용성(High Availability) 아키텍처의 핵심 원리를 인터랙티브하게 학습하세요.

Traffic Cop Metaphor

로드 밸런싱 알고리즘 실험실

알고리즘을 바꾸고 트래픽을 발생시켜 서버 부하가 어떻게 분산되는지 확인하세요.

요청(Request)
서버(Server)

tune 설정

서버 상태 (Active Conn)

Server 1
0 Active / 0 Total
Server 2
2 Active / 15 Total
Server 3
0 Active / 0 Total
HAProxy Traffic Simulator v2.0

Interactive Learning Experience

Designed with Tailwind CSS & HTML Canvas

반응형
반응형
C++ Thread Deep Dive: CPU Interaction
C++20 KERNEL MODE

std::thread의 심층 분석:
CPU와의 상호작용

C++의 std::thread는 단순한 라이브러리가 아닙니다. 이것이 OS 커널의 스케줄러(Scheduler), 레지스터(Register), 그리고 캐시(L1/L2 Cache)와 어떻게 물리적으로 상호작용하는지 시각적으로 탐구합니다.

1 추상화의 비용 (From C++ to Assembly)

우리가 작성하는 std::thread t(func); 한 줄은 컴파일러와 OS를 거치며 물리적인 명령어로 변환됩니다.

  • User Space: C++ 런타임이 pthread_create (Linux) 혹은 CreateThread (Windows)를 호출합니다.
  • System Call: OS 커널 모드로 진입합니다 (clone syscall).
  • Kernel Space: OS는 TCB (Thread Control Block)라는 데이터 구조를 생성하여 이 스레드의 상태를 추적합니다.
SOURCE VIEW
void worker() {
  int x = 0;
  x++; // C++ Code
}
mov eax, DWORD PTR [rbp-4] // Register Load
add eax, 1 // ALU Operation
mov DWORD PTR [rbp-4], eax // Memory Store

2 컨텍스트 스위칭 (Context Switch) 시뮬레이터

CPU 코어는 한 번에 하나의 스레드만 실행할 수 있습니다(싱글 코어 가정). OS 스케줄러는 타임 슬라이스(Time Slice)가 끝나면 현재 스레드를 멈추고, 레지스터 상태를 TCB에 저장(Save)한 뒤, 다음 스레드의 상태를 복원(Restore)합니다. 이 과정은 "비용"이 듭니다.

CPU STATUS: INTERRUPT
CYCLE: 380

Thread A

PID: 1001
PC (Saved): 0x0360
SP (Saved): 0xFF00
STACK MEMORY
memory

CORE #0

RIP (Inst Ptr) 0x0360
RSP (Stack Ptr) 0xFF00
RAX (Accum) 200
CONTEXT SWITCHING...
Restoring Thread B from TCB...

Thread B

PID: 1002
PC (Saved): 0x0350
SP (Saved): 0xEE00
STACK MEMORY

3 하드웨어의 저주: False Sharing (거짓 공유)

멀티 코어 환경에서 각 코어는 자신만의 L1/L2 캐시를 가집니다. 캐시는 바이트 단위가 아닌 캐시 라인(Cache Line, 보통 64 Bytes) 단위로 데이터를 가져옵니다.

만약 Thread AThread B가 서로 다른 변수(X, Y)를 수정하더라도, 이 두 변수가 같은 캐시 라인에 인접해 있다면, 하드웨어는 이를 "공유 데이터 수정"으로 오인하여 서로의 캐시를 계속 무효화(Invalidate)시킵니다. 이를 False Sharing이라 하며 성능을 100배 이상 저하시킬 수 있습니다.

SOLUTION (C++17)
struct AlignedData {
  alignas(64) int x; // 독립된 캐시 라인 보장
  alignas(64) int y;
};
MAIN MEMORY (RAM) - 64 Byte Block
X
Y
Padding...
L1 CACHE
X
Y
CORE 1 (Write X)
INVALIDATE! sync_alt
L1 CACHE
X
Y
CORE 2 (Write Y)

Interactive C++ Architecture Explainer
Designed with Tailwind CSS & Vanilla JS

반응형

'Language > C++' 카테고리의 다른 글

데일리 C++ 탐구 생활 atomic  (7) 2025.07.16
cpp reference site 정보 업데이트 1  (2) 2025.07.15
Boost.di 탐구생활  (7) 2025.07.10
C++ for_each ( C++20 )  (0) 2022.06.23
C++ array class definition  (0) 2022.06.22
반응형

옛날 옛적, 사람들은 생각하는 기계를 꿈꿨어요. 마치 우리랑 이야기하고, 글도 쓸 수 있는 똑똑한 친구 말이에요. '앨런 튜링'이라는 천재 수학자는 이런 상상을 현실로 만들 수 있는 첫걸음을 내디뎠죠. "기계가 사람처럼 생각할 수 있을까?" 이 질문이 모든 것의 시작이었답니다.

튜링의 꿈을 이어받아, '조셉 와이젠바움'이라는 컴퓨터 과학자가 '엘리자'라는 프로그램을 만들었어요. 엘리자는 마치 심리 상담사처럼 사람들의 말을 따라 하며 대화를 나누는 최초의 '채팅 로봇'이었죠. 사람들은 정말 기계와 대화하는 것 같다며 깜짝 놀랐답니다.

시간이 흘러, 과학자들은 인간의 뇌가 작동하는 방식에서 영감을 얻었어요. 수많은 뇌세포(뉴런)들이 서로 연결되어 정보를 처리하는 것처럼, 컴퓨터에도 인공적인 신경망을 만들기 시작했죠. '제프리 힌튼'이라는 과학자는 이 '신경망' 연구에 평생을 바치며, 기계가 스스로 학습하는 길을 열었답니다.

2017년, 구글의 연구원들이 놀라운 논문을 발표했어요. 바로 '트랜스포머'라는 새로운 모델에 대한 이야기였죠. 이 모델은 문장에서 어떤 단어가 더 중요한지 '주의(Attention)'를 기울여 파악하는 특별한 능력이 있었어요. 덕분에 기계는 훨씬 더 자연스럽고 맥락에 맞는 문장을 만들어낼 수 있게 되었답니다.

트랜스포머 기술을 바탕으로, 'OpenAI'의 연구원들은 어마어마하게 큰 언어 모델, 즉 LLM(Large Language Model)을 만들기 시작했어요. 이 모델들은 인터넷에 있는 수많은 책과 글을 읽고 학습하며, 사람처럼 글을 쓰고, 질문에 답하고, 심지어 시를 짓는 능력까지 갖추게 되었죠.

마침내, 이 똑똑한 인공지능 친구들이 세상 밖으로 나왔어요! 사람들은 인공지능과 대화하며 숙제를 도와달라고 하거나, 재미있는 이야기를 만들어달라고 부탁했죠. 세상은 인공지능이 우리 생활을 얼마나 편리하고 즐겁게 만들어줄 수 있는지 알게 되며 큰 놀라움에 빠졌습니다.

이 놀라운 기술 뒤에는 수많은 사람들의 땀과 노력이 숨어있어요. 앞서 말한 제프리 힌튼과 함께, '얀 르쿤', '요슈아 벤지오'는 '인공지능의 대부들'이라 불리며 이 분야를 이끌었죠. 이들 덕분에 기계가 학습하고 생각하는 시대가 활짝 열렸답니다.

이제 인공지능은 우리 삶의 일부가 되었어요. 마치 스마트폰처럼, 우리는 인공지능과 대화하며 새로운 아이디어를 얻고, 어려운 문제를 함께 해결해 나갈 거예요. 앨런 튜링의 작은 질문에서 시작된 꿈이, 이제는 우리 모두의 미래를 만들어가고 있습니다.

반응형
반응형
  • docker compose 실행 ( 데몬 - 백그라운드 ) 
docker-compose up -d

 

  • docker compose 중단
docker-compose down
  • 고아 상태 모두 정리 
docker compose down --remove-orphans

 

반응형

+ Recent posts