반응형
반응형

MSSQL(마이크로소프트 SQL Server)에서 ERD(Entity Relationship Diagram) 생성을 지원하는 오픈소스 프로그램 중에서 추천할 수 있는 도구들은 다음과 같습니다:


✅ 1. DBeaver 

  • 라이선스: Apache License 2.0 (Community Edition 기준)
  • 특징:
    • 다양한 DB(MSSQL 포함) 지원
    • ERD 자동 생성 및 편집 가능
    • SQL 스크립트와 구조 동시 확인
    • 플러그인 확장 가능
  • 장점:
    • 사용 편리
    • 오픈소스이지만 기능이 풍부
  • 웹사이트: https://dbeaver.io

✅ 2. DBDiagram.io (ERD 모델링 지원 웹 도구)

  • 라이선스: 무료 온라인 도구 (오픈소스는 아니지만, 무료이고 간단하게 사용 가능)
  • 특징:
    • 간단한 마크다운 형식으로 ERD 작성
    • SQL에서 가져오기/내보내기 가능
    • 협업 지원
  • 장점:
    • 웹 기반으로 설치 없이 사용
  • 웹사이트: https://dbdiagram.io

✅ 3. SQLPad

  • 라이선스: MIT License
  • 특징:
    • 쿼리 실행 + 시각화 + ERD 기능 지원 (약간 제한적)
    • MSSQL 포함 다양한 DB 연동
    • 웹 기반 SQL 편집기
  • 웹사이트: https://github.com/sqlpad/sqlpad

✅ 4. PgModeler (PostgreSQL 전용이나 일부 호환 시도 가능)

  • MSSQL 직접 지원은 아니나, ERD 기능 강력
  • 오픈소스 구조 파악, 커스텀 DB 작업용으로 참고 가능
  • https://pgmodeler.io/

💡 기타 유료이지만 강력한 대안 (참고용)

  • dbForge Studio for SQL Server (유료, ERD 생성 좋음)
  • DataGrip (JetBrains, 유료 IDE, 강력한 ERD 지원)

추천 정리:

도구오픈소스ERD 생성MSSQL 지원설치/웹
DBeaver 설치형
SQLPad 제한적 웹 기반
DBDiagram.io ❌ (무료) ✅ (SQL import) 웹 기반
 

🔧 추천 조합:

  • 정식 업무 및 ERD 필요: DBeaver
  • 간단한 ERD 또는 공유 목적: DBDiagram.io
  • 웹 기반 쿼리툴 + 시각화: SQLPad
반응형
반응형

Top 40 Open-source Developer Tools with the Most GitHub Stars

 

https://medium.com/@nocobase/top-40-open-source-developer-tools-with-the-most-github-stars-1d50674f21ba

 

Top 40 Open-source Developer Tools with the Most GitHub Stars

Discover the top 40 GitHub Star projects for developers, covering 7 key areas including low-code, AI assistants, and API development.

medium.com

GitHub에서 가장 많은 별점을 받은 상위 40개 오픈소스 개발자 도구

 

 

1.스트림릿(⭐38.7k)

GitHub: https://github.com/streamlit/streamlit

웹사이트: https://streamlit.io/

소개: 개발자가 데이터 처리 논리를 대화형 웹 애플리케이션으로 빠르게 변환할 수 있도록 하는 데이터 시각화에 중점을 둔 Python 웹 프레임워크입니다.

핵심 기능:

  • 미니멀리스트 스크립트 개발: 미니멀리스트 API를 사용하여 개발자는 단 몇 줄의 Python 코드만으로 웹 애플리케이션을 구축할 수 있습니다. 애플리케이션은 코드가 저장될 때마다 자동으로 새로 고쳐지고 업데이트되므로 빠른 반복 작업과 실험에 적합합니다.
  • 네이티브 상호작용 통합: 상호작용 구성 요소를 추가하는 것은 변수 정의만큼 간단합니다. 백엔드 코드 작성, 경로 설정, 요청 처리, HTML/CSS/JS 처리가 필요 없어 풀스택 개발의 문턱이 낮아집니다.
  • 즉각적인 배포: 애플리케이션을 Streamlit Community Cloud(무료), Snowflake(엔터프라이즈 수준) 또는 기타 플랫폼에 직접 배포하여 빠르게 실행하고 공유할 수 있습니다.

2. 앱스미스 (⭐36.6k)

GitHub: https://github.com/appsmithorg/appsmith

웹사이트: https://www.appsmith.com/

소개: Appsmith는 엔터프라이즈급 백엔드, 관리 패널, 내부 도구를 구축하기 위해 특별히 설계된 오픈소스 로우코드 플랫폼으로, AI 통합과 다중 데이터 소스 연결을 지원합니다.

핵심 기능:

  • 시각적 인터페이스 구축: 드래그 앤 드롭 UI 편집기와 풍부한 구성 요소 라이브러리를 통해 완벽한 기능을 갖춘 백엔드 시스템과 비즈니스 패널을 빠르게 구축할 수 있습니다.
  • 다중 데이터 소스 통합: 기본적으로 25가지 이상의 데이터베이스 유형과 모든 REST 또는 GraphQL API를 지원하여 기존 엔터프라이즈 시스템에 원활하게 연결됩니다.
  • AI 및 자동화 기능: AI 기능과 워크플로 엔진이 내장되어 있어 지능형 에이전트(에이전트)와 자동화된 비즈니스 프로세스 구축을 지원하여 지능형 애플리케이션 개발을 가속화합니다.
반응형
반응형

https://www.data.go.kr/data/15044350/fileData.do

 

한국산업은행_금융 관련 용어_20151231

리스크 개요 및 유형별 측정 방법과 관련된 용어 정의, 퇴직연금 관련 용어 정의

www.data.go.kr

반응형
반응형

[python] 유튜브 자막 가져오기 

 

 

""" 유튜브 자막 가져오기 
    pip install youtube-transcript-api
    
    -- 최신 버전으로 업데이트
    pip install --upgrade youtube-transcript-api

    https://www.youtube.com/watch?v=XyljmT8dGA4
    
    자막있는 동영상 : https://www.youtube.com/watch?v=zRz9q8dPjC4
"""


from youtube_transcript_api import YouTubeTranscriptApi
# youtube_transcript_api._errors 에서 TooManyRequests를 제외하고 임포트합니다.
# TooManyRequests는 더 이상 직접 임포트할 수 없는 것으로 보입니다.
from youtube_transcript_api._errors import NoTranscriptFound, TranscriptsDisabled, VideoUnavailable

def get_youtube_transcript(video_id, languages=['ko', 'en']):
    """
    주어진 YouTube 동영상 ID와 언어 목록에 대해 자막을 가져옵니다.
    자동 생성 자막과 공식 자막을 모두 시도합니다.
    """
    try:
        # 우선 공식 자막을 시도
        transcript_list = YouTubeTranscriptApi.list_transcripts(video_id)

        # 사용 가능한 언어 목록에서 요청한 언어 중 하나를 찾아 가져옵니다.
        chosen_transcript = None
        for lang_code in languages:
            for transcript in transcript_list:
                if transcript.language_code == lang_code:
                    chosen_transcript = transcript
                    break
            if chosen_transcript:
                break

        if chosen_transcript:
            print(f"[{video_id}] {chosen_transcript.language} ({chosen_transcript.language_code}) 자막을 가져옵니다.")
            # fetch()는 이제 FetchedTranscript 객체를 반환하며, 이는 이터러블합니다.
            transcript_segments = chosen_transcript.fetch()
            return transcript_segments
        else:
            raise NoTranscriptFound(
                f"No suitable official transcript found for video {video_id} in languages {languages}.",
                video_id
            )

    except NoTranscriptFound:
        print(f"[{video_id}] 공식 자막을 찾을 수 없습니다. 자동 생성 자막을 시도합니다.")
        try:
            for lang_code in languages:
                try:
                    # get_transcript() 역시 이터러블한 객체를 반환하는 것으로 가정합니다.
                    transcript_segments = YouTubeTranscriptApi.get_transcript(video_id, languages=[lang_code], preserve_formatting=True)
                    print(f"[{video_id}] {lang_code} 자동 생성 자막을 가져왔습니다.")
                    return transcript_segments
                except NoTranscriptFound:
                    continue # 다음 언어로 시도
            print(f"[{video_id}] 요청된 언어 ({languages})로 자동 생성 자막도 찾을 수 없습니다.")
            return None # 적합한 자막을 찾지 못함
        except TranscriptsDisabled:
            print(f"[{video_id}] 이 동영상은 자막이 비활성화되어 있습니다.")
            return None
        except VideoUnavailable:
            print(f"[{video_id}] 동영상을 사용할 수 없거나 비공개/삭제되었습니다.")
            return None
        except Exception as e: # TooManyRequests를 포함한 모든 예외를 잡습니다.
            # 이 부분에서 TooManyRequests 에러를 포함하여 일반적인 오류를 처리합니다.
            print(f"[{video_id}] 자막을 가져오는 중 예기치 않은 오류가 발생했습니다: {e}")
            return None

    except TranscriptsDisabled:
        print(f"[{video_id}] 이 동영상은 자막이 비활성화되어 있습니다.")
        return None
    except VideoUnavailable:
        print(f"[{video_id}] 동영상을 사용할 수 없거나 비공개/삭제되었습니다.")
        return None
    except Exception as e: # TooManyRequests를 포함한 모든 예외를 잡습니다.
        # 이 부분에서 TooManyRequests 에러를 포함하여 일반적인 오류를 처리합니다.
        print(f"[{video_id}] 자막을 가져오는 중 예기치 않은 오류가 발생했습니다: {e}")
        return None


if __name__ == "__main__":
    # 예시 동영상 ID (실제 존재하는 동영상 ID로 변경해야 합니다)
    # 제가 추천해 드렸던 URL에서 ID를 추출했습니다.
    video_id_with_subtitle = "XyljmT8dGA4" # "모바일 유튜브 자동번역 한글자막 보는 방법"
    video_id_auto_caption = "XyljmT8dGA4" # 짧은 영상 (자동 생성 자막 가능성)
    #video_id_invalid = "invalid_video_id_123"
    video_id_invalid = "XyljmT8dGA4"

    print("--- 예제 1: 자막이 있는 동영상 ---")
    transcript_data = get_youtube_transcript(video_id_with_subtitle, languages=['ko', 'en'])
    if transcript_data:
        # segment.start, segment.duration, segment.text와 같이 속성으로 접근합니다.
        for i, segment in enumerate(transcript_data[:5]): # 슬라이싱은 여전히 가능해야 합니다.
            print(f"[{segment.start:.2f}-{segment.start + segment.duration:.2f}] {segment.text}")
        print(f"... (총 {len(list(transcript_data))}개 세그먼트)") # len()을 위해 list로 변환

        # 전체 자막 텍스트만 추출하고 싶다면:
        full_text = " ".join([segment.text for segment in transcript_data])
        print("\n--- 전체 자막 텍스트 (예제 1) ---")
        print(full_text[:500] + "...")
    else:
        print("자막을 가져오지 못했습니다.")

    print("\n--- 예제 2: 자동 생성 자막을 시도할 수 있는 동영상 ---")
    transcript_data_auto = get_youtube_transcript(video_id_auto_caption, languages=['en', 'ko'])
    if transcript_data_auto:
        for i, segment in enumerate(transcript_data_auto[:5]):
            print(f"[{segment.start:.2f}-{segment.start + segment.duration:.2f}] {segment.text}")
        print(f"... (총 {len(list(transcript_data_auto))}개 세그먼트)")
    else:
        print("자막을 가져오지 못했습니다.")

    print("\n--- 예제 3: 존재하지 않는 동영상 ID ---")
    transcript_data_invalid = get_youtube_transcript(video_id_invalid)
    if transcript_data_invalid:
        print("자막을 가져왔습니다.")
    else:
        print("자막을 가져오지 못했습니다.")
반응형
반응형

당신의 '화목한' 팀이 실패하는 이유

Why Your ‘Harmonious’ Team Is Actually Failing

 

https://terriblesoftware.org/2025/03/12/why-your-harmonious-team-is-actually-failing/

 

🔹 심리적 안전감의 오해와 진짜 의미

  • 오해: 갈등이 없는 조용하고 화목한 분위기가 심리적 안전감이라 착각함.
  • 진짜 의미: 아이디어, 질문, 우려, 실수를 처벌 없이 표현할 수 있는 믿음이 있는 상태.
    (하버드대 Amy Edmondson 교수의 정의)

🔹 심리적 안전이 높은 팀의 특징

  • 발언이 자유롭고, 격렬한 논쟁도 환영됨.
  • 아이디어에 대한 도전이 신분과 상관없이 가능.
  • 실수를 학습의 기회로 삼음.
  • 문제에 대해 빠르게 인식하고 공유.
  • 사람보다 문제아이디어 내용에 집중.

🔹 생산적인 토론이 이루어지는 팀 문화

  • 문제를 조기에 드러냄 (예: 엔지니어가 사소한 문제도 먼저 언급)
  • 설계나 기술적 이견에 대해 격렬하게 토론하더라도 관계에 문제 없음.
  • Postmortem 회고 시 실수한 당사자가 주도적으로 나섬.

🔹 갈등 없는 '착한' 팀이 놓치는 것

  • 겉으론 평화로우나 비판적 사고 부족으로 평균적인 성과에 그침.
  • 회의에서는 동의했지만 실제 실행에서는 불일치 발생.
  • 의사소통 부족 → 숨은 갈등 → 성과 저하.

🔹 심리적 안전과 갈등의 균형을 위한 리더의 역할

  1. 취약성 드러내기: 리더 스스로 모르는 걸 인정.
  2. 토론 규칙 만들기: 사람 아닌 아이디어를 비판하고, 결정과 토론은 구분.
  3. 도전 장려: 어려운 질문을 던진 사람을 공식적으로 칭찬.

🔹 결론: 건강한 충돌이 팀을 성장시킨다

  • 갈등을 자유롭게 표현하는 팀은 오히려 갈등이 적고 신뢰가 높음.
  • 조용한 팀보다 다양한 시각과 기술적 논쟁이 있는 팀이 더 강함.
  • 검증 없는 아이디어는 실패의 원인이며, 논쟁 없는 팀도 실패를 부른다.
반응형
반응형

[PYTHON] Streamlit: 데이터 과학자의 쉬운 웹 제작 도구

 

vscode에서 streamlit 디버깅 하기

 

 

// conda env list
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "streamlit debug (p_ai env)",
            "type": "python",
            "request": "launch",
            "module": "streamlit",
            "args": ["run", "${file}"],
            "justMyCode": true,
            "python": "C:\\ProgramData\\anaconda3\\envs\\p_ai\\python.exe" // <--- 이 줄을 추가합니다. 
        }
    ]
}

 

 

https://github.com/ngio/py_ai/blob/main/README.md

반응형

+ Recent posts