반응형
반응형

텃밭

반응형
반응형

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

 

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

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

www.data.go.kr

반응형
반응형

세상에 영원한 것은 없다.
변화 혹은 흐름만이 영속적이다.
유장하기 이를 데 없는 산도 바다도 변한다.
산은 계절에 따라 다른 옷을 입고 세상과 마주한다.
바다는 끊임없이 출렁임으로 싱싱함을 유지한다.
굳건해 보이는 바위가 허물어져 모래가 되고
그것이 변하여 토양이 되기도 한다.
늙은 바위는 자기 위에 떨어진
씨앗을 위해 자기 몸 일부를
열어준다.


- 김기석의 《최소한의 품격》 중에서 -  


* 세상의 모든 것은
지속적이지 않습니다. 늘 변합니다.
사람도 자연도 단단한 바위도 변합니다.
'영원히 변하지 않겠다'는 맹세도 변합니다.
조건 따라 상황 따라 모든 것은 있다가도 사라집니다.
놀라운 것은 그 과정에서 새로운 생명이 탄생하는
것입니다. 언젠가는 흙으로 돌아갈 늙은 바위는
자기 몸으로 씨앗을 키웁니다.
위대한 변화입니다.

반응형

'아침편지' 카테고리의 다른 글

단 한 표 차로 역사가 바뀌었다  (0) 2025.05.29
아버지를 이해할 수 있는 나이  (0) 2025.05.28
진짜 마법 같은 일  (0) 2025.05.26
공분  (0) 2025.05.26
94세 할머니 화가  (0) 2025.05.23
반응형

2025-05-26. 팔굽혀펴기 100개

반응형
반응형

[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. 도전 장려: 어려운 질문을 던진 사람을 공식적으로 칭찬.

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

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

+ Recent posts