<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개미는 오늘도 열심히 일을하네</title>
    <link>https://geunuk.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 15 Apr 2026 01:10:00 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>욱근욱</managingEditor>
    <image>
      <title>개미는 오늘도 열심히 일을하네</title>
      <url>https://tistory1.daumcdn.net/tistory/5030926/attach/7bba6766b41440fbb639a9078b714d47</url>
      <link>https://geunuk.tistory.com</link>
    </image>
    <item>
      <title>wsl 자동 실행 &amp;amp; 백그라운드 실행</title>
      <link>https://geunuk.tistory.com/685</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. cmd 에서 wsl 동작 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;STATE : Stopped&lt;/p&gt;
&lt;pre id=&quot;code_1764135208408&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wsl -l -v&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. cmd 에서 명령어 실행 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;win + r 을 누르고 다음을 입력&lt;/p&gt;
&lt;pre id=&quot;code_1764135271678&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;powershell -Command &quot;start-process wsl.exe&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. cmd 에서 다시 wsl 동작 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;STATE : Running&lt;/p&gt;
&lt;pre id=&quot;code_1764135397700&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wsl -l -v&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 작업 스케줄러 등록&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;win + r 을 누르고 taskschd.msc 입력&lt;/li&gt;
&lt;li&gt;일반
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이름 : wsl_start&lt;/li&gt;
&lt;li&gt;사용자 또는 그룹 변경
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고급 &amp;gt; 지금 찾기 &amp;gt; Administrators 선택 ( &quot;&quot;&quot; s &quot;&quot;&quot; ) &amp;gt; 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;보안 옵션
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 로그온할 때만 실행&lt;/li&gt;
&lt;li&gt;가장 높은 수준의 권한으로 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;트리거
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업 시작 : 시작할 때&lt;/li&gt;
&lt;li&gt;고급 설정
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업 지연 시간 : 30초&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;동작
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동작 : 프로그램 시작&lt;/li&gt;
&lt;li&gt;설정
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램/스크립트 : powershell&lt;/li&gt;
&lt;li&gt;인수 추가 : -Command&amp;nbsp;&quot;start-process&amp;nbsp;wsl.exe&amp;nbsp;-WindowStyle&amp;nbsp;Hidden&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설정
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다음 시간 이상 작업이 실행되면 중지 : 해제&lt;/li&gt;
&lt;li&gt;요청할 때 실행중인 작업이 끝나지 않으면 강제로 작업 중지 : 해제&lt;/li&gt;
&lt;li&gt;작업이 이미 실행 중이면 다음 규칙 적용 : 새 인스턴스 실행 안함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 백그라운드로 실행된 wsl 종료&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Powershell에서 다음을 입력하여 ProcessName이 wsl인 Id 숫자 확인&lt;/p&gt;
&lt;pre id=&quot;code_1764135786558&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Get-Process | Where-Object { $_.Name -like '*wsl*' }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stop 수행&lt;/p&gt;
&lt;pre id=&quot;code_1764135829033&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Stop-Process -ID 5122&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Develop/Windows</category>
      <category>PowerShell</category>
      <category>restart</category>
      <category>Running</category>
      <category>stopped</category>
      <category>WSL</category>
      <category>백그라운드</category>
      <category>실행</category>
      <category>자동</category>
      <category>자동실행</category>
      <category>작업 스케줄러</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/685</guid>
      <comments>https://geunuk.tistory.com/685#entry685comment</comments>
      <pubDate>Wed, 26 Nov 2025 14:45:30 +0900</pubDate>
    </item>
    <item>
      <title>선택적 기능 (WMIC, .NET Framework 3.5)</title>
      <link>https://geunuk.tistory.com/684</link>
      <description>&lt;pre id=&quot;code_1763964870573&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Dism /Online /Add-Capability /CapabilityName:WMIC~~~~ /Source:E:\LanguagesAndOptionalFeatures&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ISO File&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.microsoft.com/en-us/evalcenter/evaluate-windows-server-2025&quot;&gt;https://www.microsoft.com/en-us/evalcenter/evaluate-windows-server-2025&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1763964715563&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Windows Server 2025 | Microsoft Evaluation Center&quot; data-og-description=&quot;Windows Server 2025 delivers next-generation security improvements, and hybrid cloud capabilities into a modernized and future ready platform.&quot; data-og-host=&quot;www.microsoft.com&quot; data-og-source-url=&quot;https://www.microsoft.com/en-us/evalcenter/evaluate-windows-server-2025&quot; data-og-url=&quot;https://www.microsoft.com/en-us/evalcenter/evaluate-windows-server-2025&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.microsoft.com/en-us/evalcenter/evaluate-windows-server-2025&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.microsoft.com/en-us/evalcenter/evaluate-windows-server-2025&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Windows Server 2025 | Microsoft Evaluation Center&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Windows Server 2025 delivers next-generation security improvements, and hybrid cloud capabilities into a modernized and future ready platform.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LINK &amp;gt; Download this ISO &amp;gt; Unzip&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;WMIC&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Powershell 관리자 권환으로 열기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 선택적 기능 설치&lt;/p&gt;
&lt;pre id=&quot;code_1763965025709&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Dism /Online /Add-Capability /CapabilityName:WMIC~~~~ /Source:E:\LanguagesAndOptionalFeatures&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. WMIC 설치&lt;/p&gt;
&lt;pre id=&quot;code_1763965032759&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Get-WindowsCapability -Online | Where-Object Name -like &quot;*wmic*&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 3.1. State : Installed 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;.Net Framework 3.5&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. .Net Framework 3.5 설치&lt;/p&gt;
&lt;pre id=&quot;code_1763965118849&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Dism /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:E:\LanguagesAndOptionalFeatures&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Develop/Windows</category>
      <category>.NET Framework 3.5</category>
      <category>windows10</category>
      <category>windows11</category>
      <category>wmic</category>
      <category>선택적 기능</category>
      <category>설치</category>
      <category>오프라인</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/684</guid>
      <comments>https://geunuk.tistory.com/684#entry684comment</comments>
      <pubDate>Mon, 24 Nov 2025 15:16:12 +0900</pubDate>
    </item>
    <item>
      <title>Pyinstaller cupy 관련 ModuleNotFound 에러</title>
      <link>https://geunuk.tistory.com/683</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[filename].spec에 다음을 추가&lt;/p&gt;
&lt;pre id=&quot;code_1763616282070&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
import cupy

...

    hiddenimports=[
    ...
    ] + [x for x in sys.modules.keys() if x.startswith('cupy.') or x.startswith('cupyx.') or x.startswith('cupy_backends.')] + ['fastrlock', 'fastrlock.rlock'],
    
...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Develop/Python</category>
      <category>cupy</category>
      <category>cupy_backends.cuda._softlink</category>
      <category>fastrlock</category>
      <category>ModuleNotFound</category>
      <category>pyinstaller</category>
      <category>python</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/683</guid>
      <comments>https://geunuk.tistory.com/683#entry683comment</comments>
      <pubDate>Thu, 20 Nov 2025 14:25:48 +0900</pubDate>
    </item>
    <item>
      <title>Python EXE Decompile</title>
      <link>https://geunuk.tistory.com/682</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;0. 준비물&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[필수] Microsoft C++ Build Tools&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python 3.10+ 버전을 지원하는 최신 디컴파일러(pycdc)는 C++로 작성되어 있습니다. 따라서 소스 코드를 직접 컴파일하여 실행 파일을 만들어야 합니다. 아래 링크에서 'Visual Studio Build Tools'를 다운로드하고, 설치 시 &lt;b&gt;'C++를 사용한 데스크톱 개발'&lt;/b&gt; 워크로드를 체크하여 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://visualstudio.microsoft.com/ko/visual-cpp-build-tools/&quot;&gt;Microsoft C++ Build Tools - Visual Studio&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1759291456389&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Microsoft C++ Build Tools - Visual Studio&quot; data-og-description=&quot;&quot; data-og-host=&quot;visualstudio.microsoft.com&quot; data-og-source-url=&quot;https://visualstudio.microsoft.com/ko/visual-cpp-build-tools/&quot; data-og-url=&quot;https://visualstudio.microsoft.com/ko/visual-cpp-build-tools/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/5j0uL/hyZKAfgZVg/HVLXkJLvTfvzemY082FpZK/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/Wzwsc/hyZJSPm1OI/f8E3mhFTi8dQK3TEDQWvq1/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/bIk0Lu/hyZJ0mkjdY/WIgT624fWgDXlEwKhWqZ0k/img.png?width=1&amp;amp;height=1&amp;amp;face=0_0_1_1&quot;&gt;&lt;a href=&quot;https://visualstudio.microsoft.com/ko/visual-cpp-build-tools/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://visualstudio.microsoft.com/ko/visual-cpp-build-tools/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/5j0uL/hyZKAfgZVg/HVLXkJLvTfvzemY082FpZK/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/Wzwsc/hyZJSPm1OI/f8E3mhFTi8dQK3TEDQWvq1/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/bIk0Lu/hyZJ0mkjdY/WIgT624fWgDXlEwKhWqZ0k/img.png?width=1&amp;amp;height=1&amp;amp;face=0_0_1_1');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Microsoft C++ Build Tools - Visual Studio&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;visualstudio.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[선택] HxD&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가끔 .exe에서 추출한 .pyc 파일의 헤더(파일 정보가 담긴 앞부분)가 손상되는 경우가 있습니다. 이럴 때 파일의 내용을 16진수 값으로 직접 보고 수정하기 위해 헥스 에디터가 필요할 수 있습니다. 필수는 아니지만, 문제가 발생했을 때 해결할 수 있는 요소입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mh-nexus.de/en/hxd/&quot;&gt;HxD - Freeware Hex Editor and Disk Editor | mh-nexus&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1759291510136&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;HxD - Freeware Hex Editor and Disk Editor | mh-nexus&quot; data-og-description=&quot;HxD - Freeware Hex Editor and Disk Editor HxD is a carefully designed and fast hex editor which, additionally to raw disk editing and modifying of main memory (RAM), handles files of any size. The easy to use interface offers features such as searching and&quot; data-og-host=&quot;mh-nexus.de&quot; data-og-source-url=&quot;https://mh-nexus.de/en/hxd/&quot; data-og-url=&quot;https://mh-nexus.de/en/hxd/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://mh-nexus.de/en/hxd/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mh-nexus.de/en/hxd/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;HxD - Freeware Hex Editor and Disk Editor | mh-nexus&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HxD - Freeware Hex Editor and Disk Editor HxD is a carefully designed and fast hex editor which, additionally to raw disk editing and modifying of main memory (RAM), handles files of any size. The easy to use interface offers features such as searching and&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mh-nexus.de&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. .exe \(\rightarrow\) .pyc&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 단계는 .exe 실행 파일이라는 압축 패키지에서 파이썬 바이트코드 파일(.pyc)들을 꺼내는 것입니다. 이 작업에는 pyinstxtractor 스크립트가 가장 효과적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;&lt;a href=&quot;https://github.com/extremecoders-re/pyinstxtractor&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;pyinstxtractor&lt;/a&gt; &amp;nbsp;다운로드&lt;/p&gt;
&lt;figure id=&quot;og_1759291573020&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - extremecoders-re/pyinstxtractor: PyInstaller Extractor&quot; data-og-description=&quot;PyInstaller Extractor. Contribute to extremecoders-re/pyinstxtractor development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/extremecoders-re/pyinstxtractor&quot; data-og-url=&quot;https://github.com/extremecoders-re/pyinstxtractor&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bcbiyB/hyZJYB4ibX/ayIkHtLk8GhNroPZVgYoX0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/BKYS1/hyZKfJfhQh/oIq61dnEhgc62GaSrkSsjk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/extremecoders-re/pyinstxtractor&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/extremecoders-re/pyinstxtractor&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bcbiyB/hyZJYB4ibX/ayIkHtLk8GhNroPZVgYoX0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/BKYS1/hyZKfJfhQh/oIq61dnEhgc62GaSrkSsjk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - extremecoders-re/pyinstxtractor: PyInstaller Extractor&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;PyInstaller Extractor. Contribute to extremecoders-re/pyinstxtractor development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 스크립트 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디컴파일하려는 .exe 파일과 다운로드한 pyinstxtractor.py를 &lt;b&gt;같은 폴더&lt;/b&gt;에 위치시킵니다. 그리고 해당 폴더에서 터미널(CMD 또는 PowerShell)을 열어 아래 명령어를 실행하세요.&lt;/p&gt;
&lt;pre id=&quot;code_1759291591326&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python pyinstxtractor.py &amp;lt;filename&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 결과 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령이 성공적으로 실행되면 &amp;lt;filename&amp;gt;.exe_extracted라는 이름의 폴더가 생성됩니다. 이 폴더 안에 들어가 보면 프로그램 실행에 필요했던 각종 라이브러리 파일과 함께 찾던 &lt;b&gt;.pyc 파일들&lt;/b&gt;이 들어있는 것을 확인할 수 있습니다. 보통 메인 스크립트는 원본 파일명과 같거나 main.pyc라는 이름을 가집니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. .pyc \(\rightarrow\) .py&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추출한 바이트코드(.pyc)를 사람이 읽을 수 있는 파이썬 소스 코드(.py)로 변환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;&lt;a href=&quot;https://github.com/zrax/pycdc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;pycdc&lt;/a&gt; &amp;nbsp;다운로드&lt;/p&gt;
&lt;figure id=&quot;og_1759291672942&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - zrax/pycdc: C++ python bytecode disassembler and decompiler&quot; data-og-description=&quot;C++ python bytecode disassembler and decompiler. Contribute to zrax/pycdc development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/zrax/pycdc&quot; data-og-url=&quot;https://github.com/zrax/pycdc&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/R2rhS/hyZJZOu2t4/fnw8zwlKcfQ3gcPHl3AWzk/img.png?width=1200&amp;amp;height=600&amp;amp;face=986_112_1068_202,https://scrap.kakaocdn.net/dn/ea12lK/hyZJUsUq91/gxQggz5YgrFVr3NQkvgRsk/img.png?width=1200&amp;amp;height=600&amp;amp;face=986_112_1068_202&quot;&gt;&lt;a href=&quot;https://github.com/zrax/pycdc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/zrax/pycdc&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/R2rhS/hyZJZOu2t4/fnw8zwlKcfQ3gcPHl3AWzk/img.png?width=1200&amp;amp;height=600&amp;amp;face=986_112_1068_202,https://scrap.kakaocdn.net/dn/ea12lK/hyZJUsUq91/gxQggz5YgrFVr3NQkvgRsk/img.png?width=1200&amp;amp;height=600&amp;amp;face=986_112_1068_202');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - zrax/pycdc: C++ python bytecode disassembler and decompiler&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;C++ python bytecode disassembler and decompiler. Contribute to zrax/pycdc development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. x86_x64 Cross Tools Command Prompt for VS 2022 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시작 메뉴에서 ** &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;x86_x64&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Cross Tools Command Prompt for VS 2022 **를 찾아 실행합니다. 일반 CMD가 아닌 이 개발자용 명령 프롬프트를 사용해야 C++ 컴파일러(cl.exe)가 정상적으로 동작합니다. (MS Build Tools을 설치하면 사용할 수 있습니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 컴파일 진행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자 명령 프롬프트에서 pycdc 소스 코드를 다운로드한 폴더로 이동한 뒤, 아래 명령어를 차례대로 입력합니다. cmake는 프로젝트 빌드 설정을 생성하고, MSBuild는 해당 설정을 바탕으로 실제 컴파일을 수행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1759292284036&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cmake .
MSBuild pycdc.sln&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. pycdc 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일을 완료하였으면, Debug 폴더에 pycdc.exe 파일이 생성된 것을 확인할 수 있습니다. 이 컴파일된 pycdc.exe를 이용해 .pyc 파일을 디컴파일합니다. 터미널에서 아래 형식의 명령어를 사용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1759292363669&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pycdc.exe &amp;lt;변환할_pyc_파일&amp;gt; &amp;gt; &amp;lt;저장할_py_파일명&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가끔 pyinstxtractor가 .pyc 파일의 헤더를 제대로 복원하지 못해 pycdc가 오류를 일으킬 수 있습니다. 이럴 때 헥스 에디터(HxD)를 사용합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;HxD로 문제가 되는 .pyc 파일을 엽니다.&lt;/li&gt;
&lt;li&gt;파일의 가장 앞부분이 파이썬 버전에 맞는 **매직 넘버(Magic Number)**로 시작하는지 확인합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Python 3.10의 매직 넘버&lt;/b&gt;: 61 0D 0D 0A&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;파이썬 .pyc 파일은 보통 &lt;b&gt;16바이트&lt;/b&gt;의 헤더를 가집니다. pyinstxtractor는 이 헤더 없이 바이트코드만 추출하는 경우가 있는데, 이 경우 다른 정상적인 .pyc 파일(같은 파이썬 버전으로 만든)의 헤더 16바이트를 복사하여 붙여넣으면 문제가 해결될 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>Develop/Python</category>
      <category>decompile</category>
      <category>exe</category>
      <category>pyinstaller</category>
      <category>python</category>
      <category>python 3.10</category>
      <category>디컴파일</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/682</guid>
      <comments>https://geunuk.tistory.com/682#entry682comment</comments>
      <pubDate>Wed, 1 Oct 2025 13:21:46 +0900</pubDate>
    </item>
    <item>
      <title>[Dockerfile] From ubuntu, Python with Node.js</title>
      <link>https://geunuk.tistory.com/681</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;shell은 zsh 사용&lt;/p&gt;
&lt;pre id=&quot;code_1752652724674&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM ubuntu:latest

RUN apt-get update &amp;amp;&amp;amp; apt-get install -y \
    git gcc build-essential curl zsh \
    zlib1g-dev libffi-dev libssl-dev liblzma-dev \
    libbz2-dev libreadline-dev libsqlite3-dev

SHELL [&quot;/usr/bin/zsh&quot;, &quot;-c&quot;]

WORKDIR /home/user
ENV SHELL=/usr/bin/zsh

# nvm 설치
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash &amp;amp;&amp;amp; \
    export NVM_DIR=&quot;$HOME/.nvm&quot; &amp;amp;&amp;amp; \
    [ -s &quot;$NVM_DIR/nvm.sh&quot; ] &amp;amp;&amp;amp; source &quot;$NVM_DIR/nvm.sh&quot; &amp;amp;&amp;amp; \
    nvm install 22

RUN echo 'export NVM_DIR=&quot;$HOME/.nvm&quot;' &amp;gt;&amp;gt; ~/.zshrc &amp;amp;&amp;amp; \
    echo '[ -s &quot;$NVM_DIR/nvm.sh&quot; ] &amp;amp;&amp;amp; source &quot;$NVM_DIR/nvm.sh&quot;' &amp;gt;&amp;gt; ~/.zshrc

# pyenv 설치
RUN curl -fsSL https://pyenv.run | bash &amp;amp;&amp;amp; \
    export PYENV_ROOT=&quot;$HOME/.pyenv&quot; &amp;amp;&amp;amp; \
    export PATH=&quot;$PYENV_ROOT/bin:$PATH&quot; &amp;amp;&amp;amp; \
    eval &quot;$(pyenv init -)&quot; &amp;amp;&amp;amp; \
    pyenv install 3.10 &amp;amp;&amp;amp; \
    pyenv global 3.10

RUN echo 'export PYENV_ROOT=&quot;$HOME/.pyenv&quot;' &amp;gt;&amp;gt; ~/.zshrc &amp;amp;&amp;amp; \
    echo 'export PATH=&quot;$PYENV_ROOT/bin:$PATH&quot;' &amp;gt;&amp;gt; ~/.zshrc &amp;amp;&amp;amp; \
    echo 'eval &quot;$(pyenv init -)&quot;' &amp;gt;&amp;gt; ~/.zshrc

ENV PYENV_ROOT=&quot;/home/user/.pyenv&quot;
ENV PATH=&quot;$PYENV_ROOT/bin:$PATH&quot;

CMD [&quot;/usr/bin/zsh&quot;]

# docker run -it -d --name dev --ipc host --gpus all --hostname dev dev&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Develop/Docker</category>
      <category>docker</category>
      <category>Dockerfile</category>
      <category>Node</category>
      <category>python</category>
      <category>python with node</category>
      <category>ubuntu</category>
      <category>zsh</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/681</guid>
      <comments>https://geunuk.tistory.com/681#entry681comment</comments>
      <pubDate>Wed, 16 Jul 2025 16:59:50 +0900</pubDate>
    </item>
    <item>
      <title>[React] 8 vulnerabilities (2 moderate, 6 high)</title>
      <link>https://geunuk.tistory.com/680</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;npm install 시 다음과 같은 문구 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 설치시 라이브러리 충돌로 인한 것으로 판단.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색하였을 때 &lt;b&gt;react-scripts&lt;/b&gt; 라이브러리에서 발생.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;8 vulnerabilities (2 moderate, 6 high) &lt;br /&gt;&lt;br /&gt;To address all issues (including breaking changes), run: &lt;br /&gt;&amp;nbsp; &amp;nbsp; npm audit fix --force&lt;br /&gt;&lt;br /&gt;Run `npm audit` for details.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[관련 이슈] &lt;a href=&quot;https://github.com/facebook/create-react-app/issues/13607&quot;&gt;Npx create-react-app: 8 vulnerabilities (2 moderate, 6 high) &amp;middot; Issue #13607 &amp;middot; facebook/create-react-app&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743384438542&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Npx create-react-app: 8 vulnerabilities (2 moderate, 6 high) &amp;middot; Issue #13607 &amp;middot; facebook/create-react-app&quot; data-og-description=&quot;Describe the bug When I create a new npx create-react-app application and install any dependencies I receive the message: 8 vulnerabilities (2 moderate, 6 high) Did you try recovering your dependen...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/facebook/create-react-app/issues/13607&quot; data-og-url=&quot;https://github.com/facebook/create-react-app/issues/13607&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bnL4Tv/hyYxKj8LxQ/nXiWbtp2rbbCAUTGjzayD0/img.png?width=1200&amp;amp;height=600&amp;amp;face=990_123_1046_184,https://scrap.kakaocdn.net/dn/oeTxp/hyYxDFjG8c/14mbIFIVjkIKFGqZGS7ri1/img.png?width=1200&amp;amp;height=600&amp;amp;face=990_123_1046_184&quot;&gt;&lt;a href=&quot;https://github.com/facebook/create-react-app/issues/13607&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/facebook/create-react-app/issues/13607&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bnL4Tv/hyYxKj8LxQ/nXiWbtp2rbbCAUTGjzayD0/img.png?width=1200&amp;amp;height=600&amp;amp;face=990_123_1046_184,https://scrap.kakaocdn.net/dn/oeTxp/hyYxDFjG8c/14mbIFIVjkIKFGqZGS7ri1/img.png?width=1200&amp;amp;height=600&amp;amp;face=990_123_1046_184');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Npx create-react-app: 8 vulnerabilities (2 moderate, 6 high) &amp;middot; Issue #13607 &amp;middot; facebook/create-react-app&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Describe the bug When I create a new npx create-react-app application and install any dependencies I receive the message: 8 vulnerabilities (2 moderate, 6 high) Did you try recovering your dependen...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해결 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;package.json에 다음을 추가&lt;/p&gt;
&lt;pre id=&quot;code_1743384570588&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  &quot;overrides&quot;: {
    &quot;react-scripts&quot;: {
    &quot;@svgr/webpack&quot;: &quot;8.1.0&quot;,
    &quot;typescript&quot;: &quot;4.9.5&quot;,
    &quot;postcss&quot;: &quot;8.4.38&quot;
    }
  }&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Develop/JavaScript</category>
      <category>High</category>
      <category>moderate</category>
      <category>React</category>
      <category>react-scripts</category>
      <category>vulnerabilities</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/680</guid>
      <comments>https://geunuk.tistory.com/680#entry680comment</comments>
      <pubDate>Mon, 31 Mar 2025 10:32:51 +0900</pubDate>
    </item>
    <item>
      <title>[React] WSL에 Dockerfile로 React 환경 구축</title>
      <link>https://geunuk.tistory.com/679</link>
      <description>&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;React 프로젝트 생성&lt;/h4&gt;
&lt;pre id=&quot;code_1742966908650&quot; class=&quot;dsconfig&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx create-react-app frontend&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;Dockerfile로 Image Build&lt;/h4&gt;
&lt;pre id=&quot;code_1742966908651&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM node:18-alpine

# 유저 설정
USER root

# 작업 디렉토리를 /usr/src/app으로 설정
WORKDIR /usr/src/app/frontend

# 호스트의 package.json, package-lock.json 파일을 작업 디렉토리에 복사
COPY package*.json .

# 필요 패키지 설치
RUN npm install

# 컨테이너 외부로 노출할 포트 설정 (React dev server 기본값: 3000)
EXPOSE 3000

# 컨테이너 실행 시 npm start 명령 수행
CMD [&quot;npm&quot;, &quot;start&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1742966908651&quot; class=&quot;arduino&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker build -t react-image .&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;Container 생성&lt;/h4&gt;
&lt;pre id=&quot;code_1742966908651&quot; class=&quot;elixir&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run -dit --name [CONTAINER NAME] -p [HOST PORT]:[CONTAINER PORT] -v [HOST DIR]:[PROJECT DIR] [IMAGE NAME]
docker run -dit --name web_server -p 3000:3000 -v ${PWD}:/usr/src/app/frontend react-image&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Develop/JavaScript</category>
      <category>Dockerfile</category>
      <category>Node</category>
      <category>React</category>
      <category>환경</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/679</guid>
      <comments>https://geunuk.tistory.com/679#entry679comment</comments>
      <pubDate>Tue, 25 Mar 2025 17:48:53 +0900</pubDate>
    </item>
    <item>
      <title>[DiPE-Linear] Disentangled Interpretable Representation for Efficient Long-term Time Series Forecasting</title>
      <link>https://geunuk.tistory.com/678</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[&lt;a href=&quot;https://arxiv.org/pdf/2411.17257&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Paper&lt;/a&gt;] [&lt;a href=&quot;https://github.com/wintertee/DiPE-Linear&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Github&lt;/a&gt;]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 논문은 장기 시계열 예측(Long-term Time Series Forecasting, LTSF)을 위한 효율적이고 해석 가능한 DiPE-Linear(Disentangled interpretable-Parameter-Efficient Linear network)를 제안합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Introduction&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딥러닝 모델들은 높은 정확도를 제공하지만, 블랙박스(Black Box) 특성으로 인해 사용자 신뢰를 떨어뜨립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 기존의 시계열 예측 방법(또는 기법)들은 다음과 같은 한계점을 가지고 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RNN : 병렬화가 어렵습니다.&lt;/li&gt;
&lt;li&gt;CNN : 높은 계산 비용을 요구합니다.&lt;/li&gt;
&lt;li&gt;Transformer : 여러 개선에도 불구하고 많은 수의 파라미터를 가지, 긴 입력 시퀀스에 쉽게 과적합됩니다.&lt;/li&gt;
&lt;li&gt;FC(Fully Connected) : 이차 복잡도(Quadratic Complexity)로 인한 파라미터 중복 ? 복제 ?(Parameter Redundancy) 문제가 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 이차 복잡도 (Quadratic Complexity) [&lt;a style=&quot;color: #0070d1; text-align: start;&quot; href=&quot;https://wandb.ai/wandb_fc/tips/reports/The-Problem-with-Quadratic-Attention-in-Transformer-Architectures--Vmlldzo3MDE0Mzcz#:~:text=%EF%BB%BFReformer%20(The%20Efficient%20Transformer):%20This%20method%20aims,reducing%20the%20quadratic%20attention%20to%20almost%20linear!&quot;&gt;참고&lt;/a&gt;]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 데이터 크기를 \(L\)이라고 할 때, 계산량이나 메모리 사용량이 \(L^2\)에 비례하여 증가하는 현상.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 파라미터 중복 (Parameter Redundancy) [GPT 답변]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델이 필요 이상으로 많은 파라미터를 가지면서 실제로 유의미하지 않거나 중복된 정보를 학습하는 현상.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\(\rightarrow\) LTSF의 경우, 긴 시퀀스을 예측해야 하기 때문에 입력 데이터 긴 시퀀스를 필요로 함. FC는 모든 입력마다 모든 출력으로 연결을 유지하므로 파라미터 수가 제곱에 비례함. 따라서, 과도하게 많은 파라미터가 존재하고 이는 비용 증가, 과적합 문제 등이 발생과 동시에 많은 파라미터들 중 중복된 파라미터들로 인해 모델 성능 향상에 기여하지 않으면서 계산 비용만 증가시키고, 최적점을 찾아가는데 방해됨.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;DiPE-Linear&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kIiC1/btsMTfw4FU5/xJJEOIKSb3NOKJMkGclWF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kIiC1/btsMTfw4FU5/xJJEOIKSb3NOKJMkGclWF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kIiC1/btsMTfw4FU5/xJJEOIKSb3NOKJMkGclWF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkIiC1%2FbtsMTfw4FU5%2FxJJEOIKSb3NOKJMkGclWF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;760&quot; height=&quot;319&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;319&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DiPE-Linear 모델은 다음 세 가지 모듈로 구성됩니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Static Frequential Attention (SFA)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실수 푸리에 변환(Real Fast Fourier Transform, rFFT)을 통해 시간 도메인 데이터를 주파수 도메인 데이터로 변환 후 이 영역에서 학습된 필터 중 중요한 신호만 선택적으로 증폭하거나 억제.&lt;/li&gt;
&lt;li&gt;역 실수 푸리에 변환(inverse rFFT)을 사용하여 필터링된 데이터를 다시 시간 영역으로 변환&lt;/li&gt;
&lt;li&gt;필터는 시계열의 시간적 구조를 보존하고, 이어지는 시간적 특징 추출에 영향을 주지 않기 위해 zero-phase filter로 제한&lt;/li&gt;
&lt;li&gt;주파수 분석을 통해 잡음(noise)을 줄이고 유의미한 정보를 더 강조&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ zero-phase filter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신호의 진폭(amplitude)만을 수정하며 원본의 위상(phase) 정보는 유지&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pFil0/btsMTLbbSRO/cM5C83OK7NHBVbq9W5P5d0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pFil0/btsMTLbbSRO/cM5C83OK7NHBVbq9W5P5d0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pFil0/btsMTLbbSRO/cM5C83OK7NHBVbq9W5P5d0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpFil0%2FbtsMTLbbSRO%2FcM5C83OK7NHBVbq9W5P5d0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;467&quot; height=&quot;92&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\(x\)는 입력 단변량 시계열(univariate series), \(F\)는 rFFT를, \(\theta_{SFA}\)는 학습 가능한 정적 주파수 어텐션 맵, \(\odot\)는 원소 단위 곱셈(element-wise multiplication)를 의미합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Static Temporal Attention (STA)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시간 영역에서 중요한 시점만을 선별하여 중요한 시점에 높은 가중치를 부여하는 모듈&lt;/li&gt;
&lt;li&gt;최근 데이터가 더 중요하다는 사실 등 시간적 중요도를 반영해 학습 효율성을 높임&lt;/li&gt;
&lt;li&gt;입력 시계열에 대해 학습된 시간 어텐션 맵(temporal attention map)과 입력 데이터(\(Z_{SFA}\)의 원소 단위 곱셈(element-wise multiplication)을 수행하여 관련된 과거 시간 포인트에 적절한 중요도를 할당하여 시간적 의존성을 잘 반영&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3PqLA/btsMVHyjRxv/JlkzwbZxT6PdIHNcz0DgHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3PqLA/btsMVHyjRxv/JlkzwbZxT6PdIHNcz0DgHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3PqLA/btsMVHyjRxv/JlkzwbZxT6PdIHNcz0DgHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3PqLA%2FbtsMVHyjRxv%2FJlkzwbZxT6PdIHNcz0DgHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;336&quot; height=&quot;78&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;78&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\(\theta_{STA}\)는 학습 가능한 시간 영역 어텐션 맵을 의미합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. Idependent Frequential Mapping (IFM)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/VEWOXIC/FITS?tab=readme-ov-file&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;FITS&lt;/a&gt;에 사용된 2차원 스펙트럼 행렬은 대각선만 중요한 가중치를 가지며, 이는 시계열의 서로 다른 주파수 간의 독립성이 상대적으로 강하다는 것을 시사합니다. 이러한 배경에서 각 주파수를 독립적으로 처리하기 위한 IFM 모듈을 제안합니다.&lt;/li&gt;
&lt;li&gt;구체적으로 입력 시계열(STA와 SFA를 통해 처리된)이 주파수 영역으로 변환된 후, 독립적 주파수 매핑을 사용하여 각 주파수 성분을 직접 대응되는 출력 주파수 성분으로 매핑합니다.&lt;/li&gt;
&lt;li&gt;독립적인 주파수별 가중치를 사용하여 효율적인 예측 수행 후, 최종 출력을 시간 영역으로 다시 변환(inverse rFFT)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;정리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SFA는 주파수 영역에서 중요한 신호를 선택적으로 강조하여 노이즈를 감소&lt;/li&gt;
&lt;li&gt;STA는 시간 영역에서 중요한 입력 시점의 가중치를 높어 시간적 의존성을 효과적으로 학습&lt;/li&gt;
&lt;li&gt;SFA와 STA는 FC의 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;파라미터 중복(Parameter Redundancy)&lt;span&gt; 문제를 해결하는 과정중 하나&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;IFM는 각 주파수를 독립적으로 매핑하여 효율성과 해석 가능성을 동시에 높임&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;Low-Rank Weight Sharing&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cC52ZW/btsMVzggxuP/cKLd68RdGKiDw7kZG5xUJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cC52ZW/btsMVzggxuP/cKLd68RdGKiDw7kZG5xUJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cC52ZW/btsMVzggxuP/cKLd68RdGKiDw7kZG5xUJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcC52ZW%2FbtsMVzggxuP%2FcKLd68RdGKiDw7kZG5xUJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;309&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;441&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;설명한 SFA, STA, IFM는 단변량(Uni Variate)를 초점으로 설계한 모듈이고, 다변량(Multi Variate)를 위해서 Low-Rank Weight Sharing을 모듈을 제안합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;해당 모듈은 다변량 시계열에서 각 변수 간의 상관성을 효율적으로 모델링하기 위해 사용되며, 변수들을 의미 있게 클러스터링하여 파라미터를 공유하고, 모델 복잡성을 크게 줄입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;구체적으로, 가중치 행렬을 저랭크(Low-Rank) 행렬로 표현하여 변수 간의 공통적인 정보(shared patterns)과 변수 고유의 특성(individual-specific patterns)을 동시에 모델링하여, 모델의 파라미터 수를 현저히 줄입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SFALoss&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xwy7E/btsMVclpm3M/7eOaxwtJ2mPb5bU3KHMPek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xwy7E/btsMVclpm3M/7eOaxwtJ2mPb5bU3KHMPek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xwy7E/btsMVclpm3M/7eOaxwtJ2mPb5bU3KHMPek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxwy7E%2FbtsMVclpm3M%2F7eOaxwtJ2mPb5bU3KHMPek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;100&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pHdiK/btsMT4Iqqg2/KRuYGAcht5vYk6j7ATvkzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pHdiK/btsMT4Iqqg2/KRuYGAcht5vYk6j7ATvkzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pHdiK/btsMT4Iqqg2/KRuYGAcht5vYk6j7ATvkzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpHdiK%2FbtsMT4Iqqg2%2FKRuYGAcht5vYk6j7ATvkzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;114&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;139&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;348&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pQfiG/btsMVBkIR9U/NG18WLoqf0fOjODblQpxek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pQfiG/btsMVBkIR9U/NG18WLoqf0fOjODblQpxek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pQfiG/btsMVBkIR9U/NG18WLoqf0fOjODblQpxek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpQfiG%2FbtsMVBkIR9U%2FNG18WLoqf0fOjODblQpxek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;106&quot; data-origin-width=&quot;348&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 LTSF 모델들은 시간 영역에서만 손실 함수를 정의하고 사용합니다. 시간 영역 손실만으로는 주파수 영역에서의 중요한 신호 패턴을 충분히 반영하지 못할 수 있습니다. 이러한 문제를 해결하기 위해 본 논문은 시간 영역 손실과 주파수 영역 손실을 동시에 고려하는 새로운 손실 함수인 SFALoss를 제안합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\(L_{T}\)는 시간 영역에서의 표준 손실 함수(ex. MSE)를 의미하며, \(L_{F}\)는 SFA모듈에서 학습된 주파수 어텐션 맵(\(\theta_{SFA}\))을 사용하여 학습된 가중치의 주파수 영역의 손실입니다. 이 손실 \(L\)은 중요한 주파수 성분에 더 많은 가중치를 부여하여 주파수 영역을 더욱 집중적으로 학습하도록 유도합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Results&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;FCs (완전 연결 모델들)과의 비교&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/npidb/btsMUpeu9tQ/1KE3emd8TslSfi8dm4z0Wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/npidb/btsMUpeu9tQ/1KE3emd8TslSfi8dm4z0Wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/npidb/btsMUpeu9tQ/1KE3emd8TslSfi8dm4z0Wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnpidb%2FbtsMUpeu9tQ%2F1KE3emd8TslSfi8dm4z0Wk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;877&quot; height=&quot;806&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FCs가 아닌 모델들과의 비교&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vwh6F/btsMVWWojzf/EDgRRL8z4rzZyWYUzRG1Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vwh6F/btsMVWWojzf/EDgRRL8z4rzZyWYUzRG1Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vwh6F/btsMVWWojzf/EDgRRL8z4rzZyWYUzRG1Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvwh6F%2FbtsMVWWojzf%2FEDgRRL8z4rzZyWYUzRG1Kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;874&quot; height=&quot;618&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;618&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 데이터셋들과의 비교&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Owxc7/btsMTFvBDd7/IpVjl4PJGaXb1K3BY3hR91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Owxc7/btsMTFvBDd7/IpVjl4PJGaXb1K3BY3hR91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Owxc7/btsMTFvBDd7/IpVjl4PJGaXb1K3BY3hR91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOwxc7%2FbtsMTFvBDd7%2FIpVjl4PJGaXb1K3BY3hR91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;896&quot; height=&quot;267&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Code&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[&lt;a href=&quot;https://github.com/wintertee/DiPE-Linear/tree/main&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Github&lt;/a&gt;]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;num_experts&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델의 가중치를 몇 개의 전문가(experts)로 나누어 관리할지 결정하는 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 전문가는 시계열 데이터를 서로 다른 방식(독립적)으로 처리하며, 전체적인 예측은 이 전문가들의 조합으로 도출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;rank_experts&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 전문가(experts)들의 상대적 중요도를 결정하는 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 값들로 전문가들의 출력을 가중 평균하여 최종 결과를 도출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;STA(Static Temporal Attention)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습 가능한 시간 어텐션 맵(self.weight)을 통해 각 시간 포인트의 중요도를 반영&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\(\rightarrow\) 입력 데이터에 원소 단위 곱(element-wise multiplication)을 수행하여 중요 시점에 높은 가중치를 부여&lt;/p&gt;
&lt;pre id=&quot;code_1742861114384&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class StaticTimeWeight(nn.Module):

    def __init__(self, input_len, num_experts):
        super().__init__()
        self.input_len = input_len
        self.num_experts = num_experts
        self.weight = nn.Parameter(
            torch.ones(1, self.num_experts, 1, self.input_len))

    def forward(self, x, rank_experts=None):
        # x: N, 1, c, input_len
        # if rank_experts provided, output is N, 1, c, input_len//2+1
        # if not, output is N, num_experts, c, input_len//2+1

        if rank_experts is not None:
            weight = self.weight * rank_experts  # 1, num_experts, c, input_len//2+1
            weight = weight.sum(dim=1, keepdim=True)  # 1, 1, c, input_len//2+1
        else:
            weight = self.weight
        x = x * weight
        return x&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;SFW(Static Frequential Attention)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 데이터를 주파수 영역으로 변환하여 주파수 어텐션 맵(self.weight)를 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\(\rightarrow\) 중요한 주파수를 학습하여 선택적으로 강조하거나 불필요한 주파수를 억제하여 노이즈를 줄임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후, 다시 시간 영역으로 역변환하여 주파수 어텐션이 반영된 데이터 출력&lt;/p&gt;
&lt;pre id=&quot;code_1742861348923&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class StaticFreqWeight(nn.Module):
    # we do not use window function since it is a linear operation

    def __init__(self, input_len, num_experts):
        super().__init__()
        self.input_len = input_len
        self.num_experts = num_experts
        self.weight = nn.Parameter(
            torch.ones(1, self.num_experts, 1, self.input_len // 2 + 1))

    def get_weight_channel(self, rank_experts):

        if rank_experts is not None:
            weight = self.weight * rank_experts  # 1, num_experts, c, input_len//2+1
            weight = weight.sum(dim=1, keepdim=True)  # 1, 1, c, input_len//2+1
        else:
            weight = self.weight
        return weight

    def forward(self, x, rank_experts=None, windowing=False):
        # x: N, 1, c, input_len
        # if rank_experts provided, output is N, 1, c, input_len//2+1
        # if not, output is N, num_experts, c, input_len//2+1

        weight = self.get_weight_channel(rank_experts)

        # x = F.pad(x, [self.input_len // 2, self.input_len // 2])
        if windowing:
            window = torch.hamming_window(self.input_len,
                                          dtype=x.dtype,
                                          device=x.device)
            x = x * window
        x = torch.fft.rfft(x)
        x = x * weight
        x = torch.fft.irfft(x, n=self.input_len)
        if windowing:
            x = x / window
        # x = x[:, :, :, self.input_len // 2:-self.input_len // 2]

        return x&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;IFM(Independent Frequential Mapping)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 데이터( 주파수 어텐션이 반영된 시간 데이터 )를 패딩하여 주파수 영역으로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주파수 영역에서 각 주파수 성분을 독립적으로 처리&lt;/p&gt;
&lt;pre id=&quot;code_1742862901525&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class FFTExpandBigConv1d(nn.Module):
    # 专为小输入大卷积核设计
    # 输入：N, 1, l_in
    # 输出：N, num_experts, l_out
    def __init__(
        self,
        num_experts: int,
        input_len: int,
        output_len: int,
    ):
        super().__init__()
        self.num_experts = num_experts
        self.input_len = input_len
        self.output_len = output_len

        # we pad x 1% of length on each end... for bizzare reasons..
        self.pad_len = math.floor((self.input_len + self.output_len - 1) / 100)
        self.pad_len = max(self.pad_len, 1)

        self.time_len = self.input_len + self.output_len - 1 + 2 * self.pad_len
        self.freq_len = self.time_len // 2 + 1

        # Initialized as Average filter
        self.weight = nn.Parameter(
            torch.zeros((1, self.num_experts, 1, self.freq_len),
                        dtype=torch.cfloat))
        self.weight.data[..., 0] = 1
        self.bias = nn.Parameter(
            torch.zeros(1,
                        self.num_experts,
                        1,
                        self.freq_len,
                        dtype=torch.cfloat))

    def forward(self, x: torch.Tensor, rank_experts=None):
        if rank_experts is not None:
            weight = self.weight * rank_experts  # 1, num_experts, input_len//2+1
            weight = weight.sum(dim=1, keepdim=True)  # 1, 1, input_len//2+1

            bias = self.bias * rank_experts
            bias = bias.sum(dim=1, keepdim=True)
        else:
            weight = self.weight
            bias = self.bias

        # input: N, 1, l_in
        # depth-wise convolution
        # pad x to match kernel

        x = F.pad(x, [self.pad_len, self.output_len - 1 + self.pad_len])

        # calculate FFT
        x = torch.fft.rfft(x)
        # weight = torch.fft.rfft(weight)

        # frequency production
        x = x * weight

        # bias
        x = x + bias

        # invert FFT
        x = torch.fft.irfft(x, n=self.time_len)

        x = x[..., -self.output_len - self.pad_len:-self.pad_len]

        # output: N, experts, l_out if rank is None else N, 1, l_out
        return x&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Identity&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 기능(모듈)을 비활성화하여 입력 데이터를 그대로 출&lt;/p&gt;
&lt;pre id=&quot;code_1742863308579&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Identity(nn.Module):

    def __init__(self, *args: Any, **kwargs: Any) -&amp;gt; None:
        super().__init__()

    def forward(self, x: Tensor, *args: Any, **kwargs: Any) -&amp;gt; Tensor:
        return x&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DiPE&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간 모듈 (self.time_w) : STA 모듈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주파수 모듈 (self.freq_w) : SFA 모듈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주파수 매핑 모듈 (self.expert) : IFM 모듈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;low-rank weight sharing (self.route) : 전체 가중치를 독립적으로 구성하는 것이 아니라, 소수의 전문가(num_experts)를 정의하여, 각 변수(features)가 이 전문가의 가중치를 공유함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reversible Instance Normalization (RevIN) 방식의 전처리를 통해 입력 데이터를 정규화하고 예측 값을 다시 원래 척도로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1742863935438&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class DiPE(nn.Module):

    def __init__(
        self,
        input_len: int,
        output_len: int,
        input_features: int,
        output_features: int,
        individual_f: bool = False,
        individual_t: bool = False,
        individual_c: bool = False,
        num_experts: int = 1,
        use_revin: bool = True,
        use_time_w: bool = True,
        use_freq_w: bool = True,
        loss_alpha: float = 0.,
        t_loss: Literal['mse', 'mae'] = 'mse',
    ):
        super().__init__()
        self.input_len = input_len
        self.output_len = output_len
        self.num_features = input_features
        self.individual_f = individual_f
        self.individual_t = individual_t
        self.individual_c = individual_c
        self.num_experts = num_experts
        assert input_features == output_features

        self.use_revin = use_revin
        self.use_time_w = use_time_w
        self.use_freq_w = use_freq_w
        self.loss_alpha = loss_alpha
        self.t_loss = t_loss

        self.example_input_array = torch.Tensor(32, input_len, input_features)

        if self.num_experts &amp;gt; 1:
            self.route = nn.Parameter(
                torch.randn(1, num_experts, self.num_features, 1))
            self.temperature = 114514
            self.temperature = float('nan')
            self.router_softmax = nn.Softmax(dim=1)
        # self.static_route = torch.eye(self.num_experts).unsqueeze(0).unsqueeze(-1)
        self.static_route = torch.eye(
            self.num_features).unsqueeze(0).unsqueeze(-1)

        if self.use_time_w:
            if self.individual_t:
                self.time_w = StaticTimeWeight(self.input_len,
                                               self.num_features)
            else:
                self.time_w = StaticTimeWeight(self.input_len, self.num_experts)
        else:
            self.time_w = Identity()

        if self.use_freq_w:
            if self.individual_f:
                self.freq_w = StaticFreqWeight(self.input_len,
                                               self.num_features)
            else:
                self.freq_w = StaticFreqWeight(self.input_len, self.num_experts)
        else:
            self.freq_w = Identity()

        if self.individual_c:
            self.expert = FFTExpandBigConv1d(self.num_features, self.input_len,
                                             self.output_len)
        else:
            self.expert = FFTExpandBigConv1d(self.num_experts, self.input_len,
                                             self.output_len)

        self.dropout = nn.Dropout(0.1)

    def forward(self, x):
        batch_size = x.shape[0]

        x = rearrange(x, 'n l c -&amp;gt; n 1 c l')

        if self.use_revin:

            x_mean = x.mean(dim=-1, keepdim=True).detach()
            x_std = x.std(dim=-1, keepdim=True).detach().clamp(min=1e-7)
            x = (x - x_mean) / x_std

        if self.num_experts &amp;gt; 1:

            rank_experts = self.router_softmax(self.route /
                                               self.temperature)  # 1, h, c, 1

        else:
            rank_experts = None

        if self.individual_f:
            x = self.freq_w(x, self.static_route.to(x.device))
        else:
            x = self.freq_w(x, rank_experts)
        x = self.dropout(x)

        if self.individual_t:
            x = self.time_w(x, self.static_route.to(x.device))
        else:
            x = self.time_w(x, rank_experts)

        if self.individual_c:
            x = self.expert(x, self.static_route.to(x.device))
        else:
            x = self.expert(x, rank_experts)

        if self.use_revin:
            x = x * x_std
            x = x + x_mean

        x = rearrange(x, 'n 1 c l -&amp;gt; n l c')

        return x
        
        ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;SFALoss&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논문에서 제안된 SFALoss&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간 영역 손실(time_loss) : MSE 또는 MAE를 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주파수 영역 손실(freq_loss) : 주파수 영역에서 SFA 모듈의 주파수 어텐션 가중치를 이용하여 중요한 주파수 손실 강조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 손실의 가중 합으로 최종 손실을 계산하며, 이로 인해 주파수 성분을 더 집중적으로 학습&lt;/p&gt;
&lt;pre id=&quot;code_1742863435504&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class DiPE(nn.Module):

    ...
    
    def loss(self, y, y_hat):
        y = rearrange(y, 'n l c -&amp;gt; n c l')
        y_hat = rearrange(y_hat, 'n l c -&amp;gt; n c l')

        if self.t_loss == 'mse':
            time_loss = F.mse_loss(y, y_hat)
        else:
            time_loss = F.l1_loss(y, y_hat)

        if self.use_freq_w:

            if self.num_experts &amp;gt; 1:
                rank_experts = self.router_softmax(
                    self.route / self.temperature)  # 1, h, c, 1
            else:
                rank_experts = None

            if self.individual_f:
                rank_experts = self.static_route.to(y.device)

            freq_w = self.freq_w.get_weight_channel(rank_experts)
            freq_w = freq_w.detach()
            freq_w = freq_w / freq_w.mean(dim=-1, keepdim=True)

            if freq_w.shape[-1] != y.shape[-1] // 2 + 1:
                with torch.no_grad():
                    freq_w = torch.fft.irfft(freq_w, n=y.shape[-1])
                    freq_w = torch.fft.rfft(freq_w)

        else:
            freq_w = 1

        fft_y = torch.fft.rfft(y, norm='ortho')
        fft_y_hat = torch.fft.rfft(y_hat, norm='ortho')

        freq_loss = F.l1_loss(fft_y * freq_w, fft_y_hat * freq_w)

        return (1 - self.loss_alpha) * time_loss + self.loss_alpha * freq_loss&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Paper Review</category>
      <category>dipe</category>
      <category>dipe linear</category>
      <category>dipe 구현</category>
      <category>ltsf</category>
      <category>Timeseries forecasting</category>
      <category>논문</category>
      <category>리뷰</category>
      <category>시계열 예측</category>
      <category>예측</category>
      <category>장기 시계열</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/678</guid>
      <comments>https://geunuk.tistory.com/678#entry678comment</comments>
      <pubDate>Mon, 24 Mar 2025 15:40:39 +0900</pubDate>
    </item>
    <item>
      <title>[LTSF-Linear] / [DLinear, NLinear] Are Transformers Effective for Time Series Forecasting ?</title>
      <link>https://geunuk.tistory.com/677</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[&lt;a href=&quot;https://arxiv.org/pdf/2205.13504&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;paper&lt;/a&gt;] [&lt;a href=&quot;https://arxiv.org/pdf/2205.13504v2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;paper2&lt;/a&gt;] [&lt;a href=&quot;https://github.com/cure-lab/LTSF-Linear&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Github&lt;/a&gt;]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Transformer 기반 시계열 예측 모델의 문제점&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yAawO/btsMTFPmOEU/V3TkCxGZTI6i3uZ2ZTk3C0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yAawO/btsMTFPmOEU/V3TkCxGZTI6i3uZ2ZTk3C0/img.png&quot; data-alt=&quot;https://arxiv.org/pdf/2205.13504&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yAawO/btsMTFPmOEU/V3TkCxGZTI6i3uZ2ZTk3C0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyAawO%2FbtsMTFPmOEU%2FV3TkCxGZTI6i3uZ2ZTk3C0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;203&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://arxiv.org/pdf/2205.13504&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LTSF(Long-term Time Series Forecasting) 분야에서 Transformer 구조를 적용한 모델이 큰 주목을 받으면서 해당 논문 저자들은 다음과 같은 가설들로 &quot;Transformer는 정말 시계열 예측 문제에서 효과적일까?&quot; 하는 근본적인 의문을 가졌습니다. 그리고 여러 실험을 통해 Transformer 기반 모델들의 성능이 다소 과장되었다고 판단했습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 순서 정보의 상실&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LTSF에서 시간의 순서 정보는 예측에 있어 매우 중요합니다. Transformer는 이 순서 정보를 보존하기 위해 포지셔널 인코딩(Position Encoding) 같은 기법이 있지만, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Self-Attention과정에서 순서 불변(&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: left;&quot;&gt;permutation-invariant) 특성으로 인해&lt;/span&gt; &lt;/span&gt;결국 순서 정보 손실은 불가피합니다. NLP의 경우, 문장 순서가 달라져도 문장의 의미는 대부분 유지 되기 때문에 크게 문제가 되지 않지만, TSF에서는 큰 영향을 미칩니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 복잡한 모델 구조&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transformer 기반 모델(Informer, Autoformer, FEDformer 등)은 복잡한 구조로 인해 계산량과 메모리 사용량이 많고, 종종 과적합 문제에 직면합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 장기 예측 한계&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 Transformer 기반 시계열 모델들이 실제로는 시계열의 근본적 특징(추세, 주기성)을 제대로 학습하지 못하고, 오히려 잡음(노이즈)에 과적합되어 있습니다. 실제로 Look-back window sizes를 증가시켜도 loss가 감소하지 않는 현상을 관찰할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;LTSF-Linear&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;229&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lv6y5/btsMUZMXYEY/oDkFsiZPg85reDz4Nuyp10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lv6y5/btsMUZMXYEY/oDkFsiZPg85reDz4Nuyp10/img.png&quot; data-alt=&quot;https://arxiv.org/pdf/2205.13504v2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lv6y5/btsMUZMXYEY/oDkFsiZPg85reDz4Nuyp10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLv6y5%2FbtsMUZMXYEY%2FoDkFsiZPg85reDz4Nuyp10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;788&quot; height=&quot;229&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;229&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://arxiv.org/pdf/2205.13504v2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시계열 예측 방법은 다단계(Multi-Step) 예측을 위해 단일 단계 예측기를 학습하고 반복적으로 적용하는 IMS(Iterated Multi-Step) 방법과, 한 번에 다단계 예측을 수행하는 DMS(Diret Multi-Step) 예측 방법이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LSTF-Linear는 가장 간단한 DMS 모델로, 기본적인 구조는 간단한 one-layer linear 구조를 사용하여 시계열에 대한 회귀를 수행 후 미래를 예측합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LSTF-Linear는 시계열을 처리하기 위해 Decomposition, Normalization 전처리 방법을 도입한 DLinear, Nlinear 모델을 제안합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DLinear [&lt;a href=&quot;https://github.com/cure-lab/LTSF-Linear/blob/main/models/DLinear.py&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Code&lt;/a&gt;]&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터에서 추세(Trend)와 계절성(Seasonality)를 분해(Decomposition)하여 각각 간단한 선형 모델로 예측한 후 합하는 방법. Autoformer와 FEDformer에서 사용된 방법.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[&lt;a href=&quot;https://otch80.tistory.com/46&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;블로그&lt;/a&gt;]에서 DLinear 과정을 잘 설명해두었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;NLinear [&lt;a href=&quot;https://github.com/cure-lab/LTSF-Linear/blob/main/models/NLinear.py&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Code&lt;/a&gt;]&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터의 마지막 값을 기준으로 간단한 정규화(Normalization)를 진행한 후 예측하는 방법.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실험 결과&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pZKGz/btsMS6GC0nJ/tGiWyLDg5ViAVmudUIfQHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pZKGz/btsMS6GC0nJ/tGiWyLDg5ViAVmudUIfQHK/img.png&quot; data-alt=&quot;https://arxiv.org/pdf/2205.13504&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pZKGz/btsMS6GC0nJ/tGiWyLDg5ViAVmudUIfQHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpZKGz%2FbtsMS6GC0nJ%2FtGiWyLDg5ViAVmudUIfQHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;320&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;407&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://arxiv.org/pdf/2205.13504&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 Transformer 기반 모델보다 LTSF-Linear가 다양한 데이터셋에서 대부분 좋은 성능을 보였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주목할 점으로, Transfomer 기반 모델들은 입력 구간(look back window) 또는 예측 구간이 길어질수록 성능이 급격히 나빠지거나 불안정해지지만, LTSF-Linear 모델은 비교적 안정적인 성능을 유지합니다.&lt;/p&gt;</description>
      <category>Paper Review</category>
      <category>dlinear</category>
      <category>dlinear 구현</category>
      <category>long-term time series forecasting</category>
      <category>ltsf</category>
      <category>nlinear</category>
      <category>nlinear 구현</category>
      <category>Paper</category>
      <category>review</category>
      <category>논문</category>
      <category>리뷰</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/677</guid>
      <comments>https://geunuk.tistory.com/677#entry677comment</comments>
      <pubDate>Mon, 24 Mar 2025 13:11:30 +0900</pubDate>
    </item>
    <item>
      <title>[Python] win32api Error - ImportError: DLL load failed while importing win32api: 지정된 모듈을 찾을 수 없습니다.</title>
      <link>https://geunuk.tistory.com/676</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/mhammond/pywin32/issues/1431&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/mhammond/pywin32/issues/1431&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741677616359&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;ImportError: DLL load failed while importing win32event: The specified module could not be found. &amp;middot; Issue #1431 &amp;middot; mhammond/pyw&quot; data-og-description=&quot;I just installed Python 3.8.0 32-bit, then installed a few modules including pywin32 using pip. When I try &amp;quot;import win32event&amp;quot;, I get the following error: Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 ...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/mhammond/pywin32/issues/1431&quot; data-og-url=&quot;https://github.com/mhammond/pywin32/issues/1431&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bb88XN/hyYmOHM0l9/nqEJnrz2k78v5ukpsP5klk/img.png?width=1200&amp;amp;height=600&amp;amp;face=990_91_1035_139,https://scrap.kakaocdn.net/dn/fE7ap/hyYnc2TTEf/LcUJH8DD6DuFLnH9G9TW21/img.png?width=1200&amp;amp;height=600&amp;amp;face=990_91_1035_139&quot;&gt;&lt;a href=&quot;https://github.com/mhammond/pywin32/issues/1431&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/mhammond/pywin32/issues/1431&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bb88XN/hyYmOHM0l9/nqEJnrz2k78v5ukpsP5klk/img.png?width=1200&amp;amp;height=600&amp;amp;face=990_91_1035_139,https://scrap.kakaocdn.net/dn/fE7ap/hyYnc2TTEf/LcUJH8DD6DuFLnH9G9TW21/img.png?width=1200&amp;amp;height=600&amp;amp;face=990_91_1035_139');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ImportError: DLL load failed while importing win32event: The specified module could not be found. &amp;middot; Issue #1431 &amp;middot; mhammond/pyw&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I just installed Python 3.8.0 32-bit, then installed a few modules including pywin32 using pip. When I try &quot;import win32event&quot;, I get the following error: Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 이전 버전 설치&lt;/p&gt;
&lt;pre id=&quot;code_1741677631362&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install pywin32==225&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. postinstall 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pywin32를 설치하였다면, [python (가상)환경]\Scripts\pywin32_postinstall.py 파일이 생성되어 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1741677709019&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python Scripts\pywin32_postinstall.py -install&lt;/code&gt;&lt;/pre&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pywin32_postinstall.py&lt;/p&gt;
&lt;pre id=&quot;code_1741677756094&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# postinstall script for pywin32
#
# copies PyWinTypesxx.dll and PythonCOMxx.dll into the system directory,
# and creates a pth file
import os
import sys
import glob
import shutil
import time
import distutils.sysconfig
try:
    import winreg as winreg
except:
    import winreg

# Send output somewhere so it can be found if necessary...
import tempfile
tee_f = open(os.path.join(tempfile.gettempdir(), 'pywin32_postinstall.log'), &quot;w&quot;)
class Tee:
    def __init__(self, file):
        self.f = file
    def write(self, what):
        if self.f is not None:
            try:
                self.f.write(what.replace(&quot;\n&quot;, &quot;\r\n&quot;))
            except IOError:
                pass
        tee_f.write(what)
    def flush(self):
        if self.f is not None:
            try:
                self.f.flush()
            except IOError:
                pass
        tee_f.flush()

# For some unknown reason, when running under bdist_wininst we will start up
# with sys.stdout as None but stderr is hooked up. This work-around allows
# bdist_wininst to see the output we write and display it at the end of
# the install.
if sys.stdout is None:
    sys.stdout = sys.stderr

sys.stderr = Tee(sys.stderr)
sys.stdout = Tee(sys.stdout)

com_modules = [
    # module_name,                      class_names
    (&quot;win32com.servers.interp&quot;,         &quot;Interpreter&quot;),
    (&quot;win32com.servers.dictionary&quot;,     &quot;DictionaryPolicy&quot;),
    (&quot;win32com.axscript.client.pyscript&quot;,&quot;PyScript&quot;),
]

# Is this a 'silent' install - ie, avoid all dialogs.
# Different than 'verbose'
silent = 0

# Verbosity of output messages.
verbose = 1

ver_string = &quot;%d.%d&quot; % (sys.version_info[0], sys.version_info[1])
root_key_name = &quot;Software\\Python\\PythonCore\\&quot; + ver_string

try:
    # When this script is run from inside the bdist_wininst installer,
    # file_created() and directory_created() are additional builtin
    # functions which write lines to Python23\pywin32-install.log. This is
    # a list of actions for the uninstaller, the format is inspired by what
    # the Wise installer also creates.
    file_created
    is_bdist_wininst = True
except NameError:
    is_bdist_wininst = False # we know what it is not - but not what it is :)
    def file_created(file):
        pass
    def directory_created(directory):
        pass
    def get_root_hkey():
        try:
            winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,
                           root_key_name, 0, winreg.KEY_CREATE_SUB_KEY)
            return winreg.HKEY_LOCAL_MACHINE
        except OSError as details:
            # Either not exist, or no permissions to create subkey means
            # must be HKCU
            return winreg.HKEY_CURRENT_USER

try:
    create_shortcut
except NameError:
    # Create a function with the same signature as create_shortcut provided
    # by bdist_wininst
    def create_shortcut(path, description, filename,
                        arguments=&quot;&quot;, workdir=&quot;&quot;, iconpath=&quot;&quot;, iconindex=0):
        import pythoncom
        from win32com.shell import shell, shellcon

        ilink = pythoncom.CoCreateInstance(shell.CLSID_ShellLink, None,
                                           pythoncom.CLSCTX_INPROC_SERVER,
                                           shell.IID_IShellLink)
        ilink.SetPath(path)
        ilink.SetDescription(description)
        if arguments:
            ilink.SetArguments(arguments)
        if workdir:
            ilink.SetWorkingDirectory(workdir)
        if iconpath or iconindex:
            ilink.SetIconLocation(iconpath, iconindex)
        # now save it.
        ipf = ilink.QueryInterface(pythoncom.IID_IPersistFile)
        ipf.Save(filename, 0)

    # Support the same list of &quot;path names&quot; as bdist_wininst.
    def get_special_folder_path(path_name):
        import pythoncom
        from win32com.shell import shell, shellcon

        for maybe in &quot;&quot;&quot;
            CSIDL_COMMON_STARTMENU CSIDL_STARTMENU CSIDL_COMMON_APPDATA
            CSIDL_LOCAL_APPDATA CSIDL_APPDATA CSIDL_COMMON_DESKTOPDIRECTORY
            CSIDL_DESKTOPDIRECTORY CSIDL_COMMON_STARTUP CSIDL_STARTUP
            CSIDL_COMMON_PROGRAMS CSIDL_PROGRAMS CSIDL_PROGRAM_FILES_COMMON
            CSIDL_PROGRAM_FILES CSIDL_FONTS&quot;&quot;&quot;.split():
            if maybe == path_name:
                csidl = getattr(shellcon, maybe)
                return shell.SHGetSpecialFolderPath(0, csidl, False)
        raise ValueError(&quot;%s is an unknown path ID&quot; % (path_name,))

def CopyTo(desc, src, dest):
    import win32api, win32con
    while 1:
        try:
            win32api.CopyFile(src, dest, 0)
            return
        except win32api.error as details:
            if details.winerror==5: # access denied - user not admin.
                raise
            if silent:
                # Running silent mode - just re-raise the error.
                raise
            tb = None
            full_desc = &quot;Error %s\n\n&quot; \
                        &quot;If you have any Python applications running, &quot; \
                        &quot;please close them now\nand select 'Retry'\n\n%s&quot; \
                        % (desc, details.strerror)
            rc = win32api.MessageBox(0,
                                     full_desc,
                                     &quot;Installation Error&quot;,
                                     win32con.MB_ABORTRETRYIGNORE)
            if rc == win32con.IDABORT:
                raise
            elif rc == win32con.IDIGNORE:
                return
            # else retry - around we go again.

# We need to import win32api to determine the Windows system directory,
# so we can copy our system files there - but importing win32api will
# load the pywintypes.dll already in the system directory preventing us
# from updating them!
# So, we pull the same trick pywintypes.py does, but it loads from
# our pywintypes_system32 directory.
def LoadSystemModule(lib_dir, modname):
    # See if this is a debug build.
    import imp
    for suffix_item in imp.get_suffixes():
        if suffix_item[0]=='_d.pyd':
            suffix = '_d'
            break
    else:
        suffix = &quot;&quot;
    filename = &quot;%s%d%d%s.dll&quot; % \
               (modname, sys.version_info[0], sys.version_info[1], suffix)
    filename = os.path.join(lib_dir, &quot;pywin32_system32&quot;, filename)
    mod = imp.load_dynamic(modname, filename)


def SetPyKeyVal(key_name, value_name, value):
    root_hkey = get_root_hkey()
    root_key = winreg.OpenKey(root_hkey, root_key_name)
    try:
        my_key = winreg.CreateKey(root_key, key_name)
        try:
            winreg.SetValueEx(my_key, value_name, 0, winreg.REG_SZ, value)
        finally:
            my_key.Close()
    finally:
        root_key.Close()
    if verbose:
        print((&quot;-&amp;gt; %s\\%s[%s]=%r&quot; % (root_key_name, key_name, value_name, value)))

def RegisterCOMObjects(register = 1):
    import win32com.server.register
    if register:
        func = win32com.server.register.RegisterClasses
    else:
        func = win32com.server.register.UnregisterClasses
    flags = {}
    if not verbose:
        flags['quiet']=1
    for module, klass_name in com_modules:
        __import__(module)
        mod = sys.modules[module]
        flags[&quot;finalize_register&quot;] = getattr(mod, &quot;DllRegisterServer&quot;, None)
        flags[&quot;finalize_unregister&quot;] = getattr(mod, &quot;DllUnregisterServer&quot;, None)
        klass = getattr(mod, klass_name)
        func(klass, **flags)

def RegisterPythonwin(register=True):
    &quot;&quot;&quot; Add (or remove) Pythonwin to context menu for python scripts.
        ??? Should probably also add Edit command for pys files also.
        Also need to remove these keys on uninstall, but there's no function
            like file_created to add registry entries to uninstall log ???
    &quot;&quot;&quot;
    import os

    lib_dir = distutils.sysconfig.get_python_lib(plat_specific=1)
    classes_root=get_root_hkey()
    ## Installer executable doesn't seem to pass anything to postinstall script indicating if it's a debug build,
    pythonwin_exe = os.path.join(lib_dir, &quot;Pythonwin&quot;, &quot;Pythonwin.exe&quot;)
    pythonwin_edit_command=pythonwin_exe + ' /edit &quot;%1&quot;'

    keys_vals = [
        ('Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Pythonwin.exe', '', pythonwin_exe),
        ('Software\\Classes\\Python.File\\shell\\Edit with Pythonwin', 'command', pythonwin_edit_command),
        ('Software\\Classes\\Python.NoConFile\\shell\\Edit with Pythonwin', 'command', pythonwin_edit_command),
        ]

    try:
        if register:
            for key, sub_key, val in keys_vals:
                ## Since winreg only uses the character Api functions, this can fail if Python
                ##  is installed to a path containing non-ascii characters
                hkey = winreg.CreateKey(classes_root, key)
                if sub_key:
                    hkey = winreg.CreateKey(hkey, sub_key)
                winreg.SetValueEx(hkey, None, 0, winreg.REG_SZ, val)
                hkey.Close()
        else:
            for key, sub_key, val in keys_vals:
                try:
                    winreg.DeleteKey(classes_root, key)
                except OSError as why:
                    winerror = getattr(why, 'winerror', why.errno)
                    if winerror != 2: # file not found
                        raise
    finally:
        # tell windows about the change
        from win32com.shell import shell, shellcon
        shell.SHChangeNotify(shellcon.SHCNE_ASSOCCHANGED, shellcon.SHCNF_IDLIST, None, None)

def get_shortcuts_folder():
    if get_root_hkey()==winreg.HKEY_LOCAL_MACHINE:
        try:
            fldr = get_special_folder_path(&quot;CSIDL_COMMON_PROGRAMS&quot;)
        except OSError:
            # No CSIDL_COMMON_PROGRAMS on this platform
            fldr = get_special_folder_path(&quot;CSIDL_PROGRAMS&quot;)
    else:
        # non-admin install - always goes in this user's start menu.
        fldr = get_special_folder_path(&quot;CSIDL_PROGRAMS&quot;)

    try:
        install_group = winreg.QueryValue(get_root_hkey(),
                                           root_key_name + &quot;\\InstallPath\\InstallGroup&quot;)
    except OSError:
        vi = sys.version_info
        install_group = &quot;Python %d.%d&quot; % (vi[0], vi[1])
    return os.path.join(fldr, install_group)

# Get the system directory, which may be the Wow64 directory if we are a 32bit
# python on a 64bit OS.
def get_system_dir():
    import win32api # we assume this exists.
    try:
        import pythoncom
        import win32process
        from win32com.shell import shell, shellcon
        try:
            if win32process.IsWow64Process():
                return shell.SHGetSpecialFolderPath(0,shellcon.CSIDL_SYSTEMX86)
            return shell.SHGetSpecialFolderPath(0,shellcon.CSIDL_SYSTEM)
        except (pythoncom.com_error, win32process.error):
            return win32api.GetSystemDirectory()
    except ImportError:
        return win32api.GetSystemDirectory()

def fixup_dbi():
    # We used to have a dbi.pyd with our .pyd files, but now have a .py file.
    # If the user didn't uninstall, they will find the .pyd which will cause
    # problems - so handle that.
    import win32api, win32con
    pyd_name = os.path.join(os.path.dirname(win32api.__file__), &quot;dbi.pyd&quot;)
    pyd_d_name = os.path.join(os.path.dirname(win32api.__file__), &quot;dbi_d.pyd&quot;)
    py_name = os.path.join(os.path.dirname(win32con.__file__), &quot;dbi.py&quot;)
    for this_pyd in (pyd_name, pyd_d_name):
        this_dest = this_pyd + &quot;.old&quot;
        if os.path.isfile(this_pyd) and os.path.isfile(py_name):
            try:
                if os.path.isfile(this_dest):
                    print((&quot;Old dbi '%s' already exists - deleting '%s'&quot; % (this_dest, this_pyd)))
                    os.remove(this_pyd)
                else:
                    os.rename(this_pyd, this_dest)
                    print((&quot;renamed '%s'-&amp;gt;'%s.old'&quot; % (this_pyd, this_pyd)))
                    file_created(this_pyd+&quot;.old&quot;)
            except os.error as exc:
                print((&quot;FAILED to rename '%s': %s&quot; % (this_pyd, exc)))

def install(lib_dir):
    import traceback
    # The .pth file is now installed as a regular file.
    # Create the .pth file in the site-packages dir, and use only relative paths
    # We used to write a .pth directly to sys.prefix - clobber it.
    if os.path.isfile(os.path.join(sys.prefix, &quot;pywin32.pth&quot;)):
        os.unlink(os.path.join(sys.prefix, &quot;pywin32.pth&quot;))
    # The .pth may be new and therefore not loaded in this session.
    # Setup the paths just in case.
    for name in &quot;win32 win32\\lib Pythonwin&quot;.split():
        sys.path.append(os.path.join(lib_dir, name))
    # It is possible people with old versions installed with still have
    # pywintypes and pythoncom registered.  We no longer need this, and stale
    # entries hurt us.
    for name in &quot;pythoncom pywintypes&quot;.split():
        keyname = &quot;Software\\Python\\PythonCore\\&quot; + sys.winver + &quot;\\Modules\\&quot; + name
        for root in winreg.HKEY_LOCAL_MACHINE, winreg.HKEY_CURRENT_USER:
            try:
                winreg.DeleteKey(root, keyname + &quot;\\Debug&quot;)
            except WindowsError:
                pass
            try:
                winreg.DeleteKey(root, keyname)
            except WindowsError:
                pass
    LoadSystemModule(lib_dir, &quot;pywintypes&quot;)
    LoadSystemModule(lib_dir, &quot;pythoncom&quot;)
    import win32api
    # and now we can get the system directory:
    files = glob.glob(os.path.join(lib_dir, &quot;pywin32_system32\\*.*&quot;))
    if not files:
        raise RuntimeError(&quot;No system files to copy!!&quot;)
    # Try the system32 directory first - if that fails due to &quot;access denied&quot;,
    # it implies a non-admin user, and we use sys.prefix
    for dest_dir in [get_system_dir(), sys.prefix]:
        # and copy some files over there
        worked = 0
        try:
            for fname in files:
                base = os.path.basename(fname)
                dst = os.path.join(dest_dir, base)
                CopyTo(&quot;installing %s&quot; % base, fname, dst)
                if verbose:
                    print((&quot;Copied %s to %s&quot; % (base, dst)))
                # Register the files with the uninstaller
                file_created(dst)
                worked = 1
                # If this isn't sys.prefix (ie, System32), then nuke
                # any versions that may exist in sys.prefix - having
                # duplicates causes major headaches.
                if dest_dir != sys.prefix:
                    bad_fname = os.path.join(sys.prefix, base)
                    if os.path.exists(bad_fname):
                        # let exceptions go here - delete must succeed
                        os.unlink(bad_fname)
            if worked:
                break
        except win32api.error as details:
            if details.winerror==5:
                # access denied - user not admin - try sys.prefix dir,
                # but first check that a version doesn't already exist
                # in that place - otherwise that one will still get used!
                if os.path.exists(dst):
                    msg = &quot;The file '%s' exists, but can not be replaced &quot; \
                          &quot;due to insufficient permissions.  You must &quot; \
                          &quot;reinstall this software as an Administrator&quot; \
                          % dst
                    print(msg)
                    raise RuntimeError(msg)
                continue
            raise
    else:
        raise RuntimeError(
              &quot;You don't have enough permissions to install the system files&quot;)

    # Pythonwin 'compiles' config files - record them for uninstall.
    pywin_dir = os.path.join(lib_dir, &quot;Pythonwin&quot;, &quot;pywin&quot;)
    for fname in glob.glob(os.path.join(pywin_dir, &quot;*.cfg&quot;)):
        file_created(fname[:-1] + &quot;c&quot;) # .cfg-&amp;gt;.cfc

    # Register our demo COM objects.
    try:
        try:
            RegisterCOMObjects()
        except win32api.error as details:
            if details.winerror!=5: # ERROR_ACCESS_DENIED
                raise
            print(&quot;You do not have the permissions to install COM objects.&quot;)
            print(&quot;The sample COM objects were not registered.&quot;)
    except:
        print(&quot;FAILED to register the Python COM objects&quot;)
        traceback.print_exc()

    # There may be no main Python key in HKCU if, eg, an admin installed
    # python itself.
    winreg.CreateKey(get_root_hkey(), root_key_name)

    # Register the .chm help file.
    chm_file = os.path.join(lib_dir, &quot;PyWin32.chm&quot;)
    if os.path.isfile(chm_file):
        # This isn't recursive, so if 'Help' doesn't exist, we croak
        SetPyKeyVal(&quot;Help&quot;, None, None)
        SetPyKeyVal(&quot;Help\\Pythonwin Reference&quot;, None, chm_file)
    else:
        print(&quot;NOTE: PyWin32.chm can not be located, so has not &quot; \
              &quot;been registered&quot;)

    # misc other fixups.
    fixup_dbi()

    # Register Pythonwin in context menu
    try:
        RegisterPythonwin()
    except:
        print('Failed to register pythonwin as editor')
        traceback.print_exc()
    else:
        if verbose:
            print('Pythonwin has been registered in context menu')

    # Create the win32com\gen_py directory.
    make_dir = os.path.join(lib_dir, &quot;win32com&quot;, &quot;gen_py&quot;)
    if not os.path.isdir(make_dir):
        if verbose:
            print((&quot;Creating directory&quot;, make_dir))
        directory_created(make_dir)
        os.mkdir(make_dir)

    try:
        # create shortcuts
        # CSIDL_COMMON_PROGRAMS only available works on NT/2000/XP, and
        # will fail there if the user has no admin rights.
        fldr = get_shortcuts_folder()
        # If the group doesn't exist, then we don't make shortcuts - its
        # possible that this isn't a &quot;normal&quot; install.
        if os.path.isdir(fldr):
            dst = os.path.join(fldr, &quot;PythonWin.lnk&quot;)
            create_shortcut(os.path.join(lib_dir, &quot;Pythonwin\\Pythonwin.exe&quot;),
                            &quot;The Pythonwin IDE&quot;, dst, &quot;&quot;, sys.prefix)
            file_created(dst)
            if verbose:
                print(&quot;Shortcut for Pythonwin created&quot;)
            # And the docs.
            dst = os.path.join(fldr, &quot;Python for Windows Documentation.lnk&quot;)
            doc = &quot;Documentation for the PyWin32 extensions&quot;
            create_shortcut(chm_file, doc, dst)
            file_created(dst)
            if verbose:
                print(&quot;Shortcut to documentation created&quot;)
        else:
            if verbose:
                print((&quot;Can't install shortcuts - %r is not a folder&quot; % (fldr,)))
    except Exception as details:
        print(details)

    # importing win32com.client ensures the gen_py dir created - not strictly
    # necessary to do now, but this makes the installation &quot;complete&quot;
    try:
        import win32com.client
    except ImportError:
        # Don't let this error sound fatal
        pass
    print(&quot;The pywin32 extensions were successfully installed.&quot;)

def uninstall(lib_dir):
    # First ensure our system modules are loaded from pywin32_system, so
    # we can remove the ones we copied...
    LoadSystemModule(lib_dir, &quot;pywintypes&quot;)
    LoadSystemModule(lib_dir, &quot;pythoncom&quot;)

    try:
        RegisterCOMObjects(False)
    except Exception as why:
        print((&quot;Failed to unregister COM objects:&quot;, why))

    try:
        RegisterPythonwin(False)
    except Exception as why:
        print((&quot;Failed to unregister Pythonwin:&quot;, why))
    else:
        if verbose:
            print('Unregistered Pythonwin')

    try:
        # remove gen_py directory.
        gen_dir = os.path.join(lib_dir, &quot;win32com&quot;, &quot;gen_py&quot;)
        if os.path.isdir(gen_dir):
            shutil.rmtree(gen_dir)
            if verbose:
                print((&quot;Removed directory&quot;, gen_dir))

        # Remove pythonwin compiled &quot;config&quot; files.
        pywin_dir = os.path.join(lib_dir, &quot;Pythonwin&quot;, &quot;pywin&quot;)
        for fname in glob.glob(os.path.join(pywin_dir, &quot;*.cfc&quot;)):
            os.remove(fname)

        # The dbi.pyd.old files we may have created.
        try:
            os.remove(os.path.join(lib_dir, &quot;win32&quot;, &quot;dbi.pyd.old&quot;))
        except os.error:
            pass
        try:
            os.remove(os.path.join(lib_dir, &quot;win32&quot;, &quot;dbi_d.pyd.old&quot;))
        except os.error:
            pass

    except Exception as why:
        print((&quot;Failed to remove misc files:&quot;, why))

    try:
        fldr = get_shortcuts_folder()
        for link in (&quot;PythonWin.lnk&quot;, &quot;Python for Windows Documentation.lnk&quot;):
            fqlink = os.path.join(fldr, link)
            if os.path.isfile(fqlink):
                os.remove(fqlink)
                if verbose:
                    print((&quot;Removed&quot;, link))
    except Exception as why:
        print((&quot;Failed to remove shortcuts:&quot;, why))
    # Now remove the system32 files.
    files = glob.glob(os.path.join(lib_dir, &quot;pywin32_system32\\*.*&quot;))
    # Try the system32 directory first - if that fails due to &quot;access denied&quot;,
    # it implies a non-admin user, and we use sys.prefix
    try:
        for dest_dir in [get_system_dir(), sys.prefix]:
            # and copy some files over there
            worked = 0
            for fname in files:
                base = os.path.basename(fname)
                dst = os.path.join(dest_dir, base)
                if os.path.isfile(dst):
                    try:
                        os.remove(dst)
                        worked = 1
                        if verbose:
                            print((&quot;Removed file %s&quot; % (dst)))
                    except Exception:
                        print((&quot;FAILED to remove&quot;, dst))
            if worked:
                break
    except Exception as why:
        print((&quot;FAILED to remove system files:&quot;, why))

# NOTE: If this script is run from inside the bdist_wininst created
# binary installer or uninstaller, the command line args are either
# '-install' or '-remove'.

# Important: From inside the binary installer this script MUST NOT
# call sys.exit() or raise SystemExit, otherwise not only this script
# but also the installer will terminate! (Is there a way to prevent
# this from the bdist_wininst C code?)


def verify_destination(location):
    if not os.path.isdir(location):
        raise argparse.ArgumentTypeError(&quot;Path \&quot;{}\&quot; does not exist!&quot;.format(location))
    return location


if __name__ == '__main__':
    import argparse

    parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter,
                                     description=&quot;&quot;&quot;A post-install script for the pywin32 extensions.

    * Typical usage:

    &amp;gt; python pywin32_postinstall.py -install

    If you installed pywin32 via a .exe installer, this should be run
    automatically after installation, but if it fails you can run it again.

    If you installed pywin32 via PIP, you almost certainly need to run this to
    setup the environment correctly.

    Execute with script with a '-install' parameter, to ensure the environment
    is setup correctly.
    &quot;&quot;&quot;)
    parser.add_argument(&quot;-install&quot;,
                        default=False,
                        action='store_true',
                        help=&quot;Configure the Python environment correctly for pywin32.&quot;)
    parser.add_argument(&quot;-remove&quot;,
                        default=False,
                        action='store_true',
                        help=&quot;Try and remove everything that was installed or copied.&quot;)
    parser.add_argument(&quot;-wait&quot;,
                        type=int,
                        help=&quot;Wait for the specified process to terminate before starting.&quot;)
    parser.add_argument(&quot;-silent&quot;,
                        default=False,
                        action='store_true',
                        help=&quot;Don't display the \&quot;Abort/Retry/Ignore\&quot; dialog for files in use.&quot;)
    parser.add_argument(&quot;-quiet&quot;,
                        default=False,
                        action='store_true',
                        help=&quot;Don't display progress messages.&quot;)
    parser.add_argument(&quot;-destination&quot;,
                        default=distutils.sysconfig.get_python_lib(plat_specific=1),
                        type=verify_destination,
                        help=&quot;Location of the PyWin32 installation&quot;)

    args = parser.parse_args()

    if not args.quiet:
        print((&quot;Parsed arguments are: {}&quot;.format(args)))

    if not args.install ^ args.remove:
        parser.error(&quot;You need to either choose to -install or -remove!&quot;)

    if args.wait is not None:
        try:
            os.waitpid(args.wait, 0)
        except AttributeError:
            # Python 2.2 - no waitpid - just sleep.
            time.sleep(3)
        except os.error:
            # child already dead
            pass

    silent = args.silent
    verbose = not args.quiet

    if args.install:
        install(args.destination)

    if args.remove:
        if not is_bdist_wininst:
            uninstall(args.destination)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Develop/Python</category>
      <category>import error</category>
      <category>importerror: dll load failed while importing win32api</category>
      <category>python</category>
      <category>pywin32</category>
      <category>win32</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/676</guid>
      <comments>https://geunuk.tistory.com/676#entry676comment</comments>
      <pubDate>Tue, 11 Mar 2025 16:23:55 +0900</pubDate>
    </item>
    <item>
      <title>[Python] VSCode Error - Sorry, something went wrong activating IntelliCode support for Python. Please check the &amp;quot;Python&amp;quot; and &amp;quot;VS IntelliCode&amp;quot; output windows for details.</title>
      <link>https://geunuk.tistory.com/675</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/microsoft/pylance-release/issues/50&quot;&gt;Sorry, something went wrong activating IntelliCode support for Python &amp;middot; Issue #50 &amp;middot; microsoft/pylance-release&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741672151287&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Sorry, something went wrong activating IntelliCode support for Python &amp;middot; Issue #50 &amp;middot; microsoft/pylance-release&quot; data-og-description=&quot;Getting the following error after installing pylance Sorry, something went wrong activating IntelliCode support for Python. Please check the &amp;quot;Python&amp;quot; and &amp;quot;VS IntelliCode&amp;quot; output windows for details...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/microsoft/pylance-release/issues/50&quot; data-og-url=&quot;https://github.com/microsoft/pylance-release/issues/50&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/1mEe8/hyYrXWXIeI/vv9o0I5b7oCSIL4pTkYi00/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cfDV88/hyYrQ4BiB8/ZGGrFKxksBvfk8wlv1V5Z0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/microsoft/pylance-release/issues/50&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/microsoft/pylance-release/issues/50&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/1mEe8/hyYrXWXIeI/vv9o0I5b7oCSIL4pTkYi00/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cfDV88/hyYrQ4BiB8/ZGGrFKxksBvfk8wlv1V5Z0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Sorry, something went wrong activating IntelliCode support for Python &amp;middot; Issue #50 &amp;middot; microsoft/pylance-release&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Getting the following error after installing pylance Sorry, something went wrong activating IntelliCode support for Python. Please check the &quot;Python&quot; and &quot;VS IntelliCode&quot; output windows for details...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VSCode의 Python Extention의 버전을 과거 버전(v2024.2.0)으로 변경으로 해결하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A4lky/btsMGOFmzdi/iv6JMsBczz7QKtBeLnxuu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A4lky/btsMGOFmzdi/iv6JMsBczz7QKtBeLnxuu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A4lky/btsMGOFmzdi/iv6JMsBczz7QKtBeLnxuu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA4lky%2FbtsMGOFmzdi%2Fiv6JMsBczz7QKtBeLnxuu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;421&quot; height=&quot;481&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;481&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biLz7d/btsMGBsAOzp/bvfAtvy5Kmm82UxrcdUPN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biLz7d/btsMGBsAOzp/bvfAtvy5Kmm82UxrcdUPN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biLz7d/btsMGBsAOzp/bvfAtvy5Kmm82UxrcdUPN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiLz7d%2FbtsMGBsAOzp%2FbvfAtvy5Kmm82UxrcdUPN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1342&quot; height=&quot;272&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;272&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLCVxT/btsMGMALpvP/7WfLhRTDRLCk9P8QL7PWr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLCVxT/btsMGMALpvP/7WfLhRTDRLCk9P8QL7PWr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLCVxT/btsMGMALpvP/7WfLhRTDRLCk9P8QL7PWr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLCVxT%2FbtsMGMALpvP%2F7WfLhRTDRLCk9P8QL7PWr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;735&quot; height=&quot;425&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;425&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Develop/Python</category>
      <category>error</category>
      <category>extention</category>
      <category>something went wrong activating</category>
      <category>Sorry</category>
      <category>vscode</category>
      <category>에러</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/675</guid>
      <comments>https://geunuk.tistory.com/675#entry675comment</comments>
      <pubDate>Tue, 11 Mar 2025 14:51:43 +0900</pubDate>
    </item>
    <item>
      <title>[Ubuntu] E: Unable to locate package</title>
      <link>https://geunuk.tistory.com/674</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. apt update&lt;/p&gt;
&lt;pre id=&quot;code_1741307631912&quot; class=&quot;shell&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;sudo apt-get update&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 패키지 명 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 없는 패키지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. ubuntu 버전 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Develop/Linux</category>
      <category>E: Unable to locate package</category>
      <category>ubuntu</category>
      <category>WSL</category>
      <category>패키지 설치</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/674</guid>
      <comments>https://geunuk.tistory.com/674#entry674comment</comments>
      <pubDate>Fri, 7 Mar 2025 09:34:14 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Container Network 연결</title>
      <link>https://geunuk.tistory.com/673</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QB12Z/btsMAJdEdqX/rA14Wh3IzSC24TluTLkLO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QB12Z/btsMAJdEdqX/rA14Wh3IzSC24TluTLkLO1/img.png&quot; data-alt=&quot;https://captcha.tistory.com/70&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QB12Z/btsMAJdEdqX/rA14Wh3IzSC24TluTLkLO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQB12Z%2FbtsMAJdEdqX%2FrA14Wh3IzSC24TluTLkLO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;321&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;624&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://captcha.tistory.com/70&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 네트워크 목록&lt;/p&gt;
&lt;pre id=&quot;code_1741142500287&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker netwokr ls&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 상세 정보&lt;/p&gt;
&lt;pre id=&quot;code_1741142525598&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker network inspect bridge&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 생성&lt;/p&gt;
&lt;pre id=&quot;code_1741142563028&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker network create --driver bridge mynetwork&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 연결&lt;/p&gt;
&lt;pre id=&quot;code_1741142644452&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run -it --network mynetwork [IMAGE:TAG]&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1741142665734&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker network connect mynetwork [CONTAINER]
docker attach [CONTAINER]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 연결 끊기&lt;/p&gt;
&lt;pre id=&quot;code_1741142711675&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker network disconnect mynetwork [CONTAINER]
docker attach [CONTAINER]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 연결 확인&lt;/p&gt;
&lt;pre id=&quot;code_1741306219312&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker inspect [NETWORK NAME]&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1741150751098&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker inspect [CONTAINER] -f &quot;{{json .NetworkSettings.Networks }}&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Develop/Docker</category>
      <category>Container</category>
      <category>docker</category>
      <category>Network</category>
      <category>네트워크</category>
      <category>도커</category>
      <category>연결</category>
      <category>컨테이너</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/673</guid>
      <comments>https://geunuk.tistory.com/673#entry673comment</comments>
      <pubDate>Wed, 5 Mar 2025 11:47:13 +0900</pubDate>
    </item>
    <item>
      <title>[PostgreSQL] ON CONFLICT ERROR (there is no unique or ~)</title>
      <link>https://geunuk.tistory.com/672</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;상황&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ON CONFLICT ~ DO UPDATE ~ 수행 시 다음과 같은 에러 출력&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;there&amp;nbsp;is&amp;nbsp;no&amp;nbsp;unique&amp;nbsp;or&amp;nbsp;exclusion&amp;nbsp;constraint&amp;nbsp;matching&amp;nbsp;the&amp;nbsp;ON&amp;nbsp;CONFLICT&amp;nbsp;specification&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;원인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Primary Key, Unique Key가 정의 되어 있지 않아 발생&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unique Key 추가&lt;/p&gt;
&lt;pre id=&quot;code_1740556211369&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ALTER TABLE [MY_TABLE]
ADD CONSTRAINT unique_datetime_tag_name UNIQUE (datetime, tag_name);&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Develop/Database</category>
      <category>constraint</category>
      <category>on conflict</category>
      <category>postgre</category>
      <category>PostgreSQL</category>
      <category>SQL</category>
      <category>unique</category>
      <category>upsert</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/672</guid>
      <comments>https://geunuk.tistory.com/672#entry672comment</comments>
      <pubDate>Wed, 26 Feb 2025 16:51:49 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 기상청 API Hub의 날씨 &amp;amp; 날씨 예보 데이터 수집 with. airflow</title>
      <link>https://geunuk.tistory.com/671</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/KimGeunUk/airflow-weather&quot;&gt;KimGeunUk/airflow-weather: Weather &amp;amp; Weather Forecast Data Pipeline With Apache Airflow&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742780163073&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - KimGeunUk/airflow-weather: Weather &amp;amp; Weather Forecast Data Pipeline With Apache Airflow&quot; data-og-description=&quot;Weather &amp;amp; Weather Forecast Data Pipeline With Apache Airflow - KimGeunUk/airflow-weather&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/KimGeunUk/airflow-weather&quot; data-og-url=&quot;https://github.com/KimGeunUk/airflow-weather&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/crfQGq/hyYvqMbGsR/WRcrLGTIl6iKpFo7Tx1XLK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bl2rkH/hyYxFBJfd9/odLsE4jCemFxtksB1mu6oK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/KimGeunUk/airflow-weather&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/KimGeunUk/airflow-weather&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/crfQGq/hyYvqMbGsR/WRcrLGTIl6iKpFo7Tx1XLK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bl2rkH/hyYxFBJfd9/odLsE4jCemFxtksB1mu6oK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - KimGeunUk/airflow-weather: Weather &amp;amp; Weather Forecast Data Pipeline With Apache Airflow&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Weather &amp;amp; Weather Forecast Data Pipeline With Apache Airflow - KimGeunUk/airflow-weather&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오탈자, 에러, 수정 제안이 있으시다면 댓글 부탁드립니다.&lt;/p&gt;</description>
      <category>Develop/Python</category>
      <category>Airflow</category>
      <category>API</category>
      <category>api hub</category>
      <category>기상청</category>
      <category>날씨</category>
      <category>날씨 예보</category>
      <category>데이터</category>
      <category>수집</category>
      <category>예제</category>
      <category>튜토리얼</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/671</guid>
      <comments>https://geunuk.tistory.com/671#entry671comment</comments>
      <pubDate>Fri, 21 Feb 2025 14:03:38 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Airflow Dag 정보 (Task Context) 전달</title>
      <link>https://geunuk.tistory.com/670</link>
      <description>&lt;pre id=&quot;code_1739410805232&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...

from train_model.main import run

local_tz = pendulum.timezone(&quot;Asia/Seoul&quot;)

...

dag = DAG(
    dag_id='train_model_dag',
    default_args=default_args,
    schedule_interval='30 9 * * *',  # 매일 09:30 실행
    catchup=False
)

process_task = PythonOperator(
    task_id='train_model',
    python_callable=run,
    dag=dag
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 간단한 dag을 구성 후 train_model의 run 함수에서 airflow에서 작업을 수행한 시간인 execution_date를 가져오고 싶었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 run함수에서 **kwargs를 받으면 쉽게 얻을 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1739411027013&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# train_model.py
def run(**kwargs):
	execution_date = kwargs['execution_date']
    
    # 이외에도 다양한 정보를 kwargs에서 꺼낼 수 있음
    # run_id = kwargs['run_id']
    # dag_run = kwargs['dag_run']
    # etc...
    
    ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주의할 점으로 execution_date는 datetime이며 UTC를 기준으로 하고, time zone 정보가 포함되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 KST를 위해 9시간을 더하고 time zone 정보를 제거하고 사용하는 것이 좋다.&lt;/p&gt;
&lt;pre id=&quot;code_1739411327907&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import datetime

...

execution_date_utc = kwargs['execution_date']
execution_date_ktc = run_time_utc + datetime.timedelta(hours=9)
execution_date = execution_date_ktc.replace(tzinfo=None)

...&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Develop/Python</category>
      <category>Airflow</category>
      <category>Dag</category>
      <category>Get</category>
      <category>Info</category>
      <category>kwargs</category>
      <category>task context</category>
      <category>실행 정보</category>
      <category>정보</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/670</guid>
      <comments>https://geunuk.tistory.com/670#entry670comment</comments>
      <pubDate>Thu, 13 Feb 2025 10:50:08 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] PostgreSQL 설치</title>
      <link>https://geunuk.tistory.com/669</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;도커 실행&lt;/h4&gt;
&lt;pre id=&quot;code_1738914636141&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker pull postgres:latest&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1738914663609&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run --name postgres -p [PORT]:5432 -e POSTGRES_USER=[USER] -e POSTGRES_PASSWORD=[PASSWORD] -d postgres&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;내부 접속&lt;/h4&gt;
&lt;pre id=&quot;code_1738914860266&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker exec -it postgres /bin/bash&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Database 목록 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접속&lt;/p&gt;
&lt;pre id=&quot;code_1738914913745&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;psql -U postgres&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어&lt;/p&gt;
&lt;pre id=&quot;code_1738914949035&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;\l&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;외부 접속&lt;/h4&gt;
&lt;pre id=&quot;code_1738915131348&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# //[PostgreSQL ID]:[PostgreSQL PWD]@[HOST IP]:[PORT]/[DB NAME]
export DB_URL = 'postgresql://postgres:1@127.0.0.1:5432/postgres&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Develop/Docker</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/669</guid>
      <comments>https://geunuk.tistory.com/669#entry669comment</comments>
      <pubDate>Fri, 7 Feb 2025 16:59:15 +0900</pubDate>
    </item>
    <item>
      <title>[Git] 삭제된 폴더, 파일 반영</title>
      <link>https://geunuk.tistory.com/668</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;git add 시 로컬에서 삭제한 폴더나 파일이 반영되지 않는 경우가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 해결하기 위해 다음 명령어를 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1738562073317&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git add -u [file or .]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로, commit 시 -a 옵션을 사용하면 삭제된 폴더, 파일만 반영된다.&lt;/p&gt;
&lt;pre id=&quot;code_1738562149459&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git commit -a -m &quot;feat: ...&quot;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Develop/Git &amp;amp; GitHub</category>
      <category>ADD</category>
      <category>COMMIT</category>
      <category>GIT</category>
      <category>Push</category>
      <category>삭제</category>
      <category>삭제된</category>
      <category>제거한</category>
      <category>파일</category>
      <category>폴더</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/668</guid>
      <comments>https://geunuk.tistory.com/668#entry668comment</comments>
      <pubDate>Mon, 3 Feb 2025 14:56:27 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Windows에 pyenv 설치</title>
      <link>https://geunuk.tistory.com/667</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트마다 사용하는 python 버전이 달라질 수 있으므로, pyenv를 사용하기로 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 설치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/pyenv-win/pyenv-win&quot;&gt;https://github.com/pyenv-win/pyenv-win&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735786621724&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - pyenv-win/pyenv-win: pyenv for Windows. pyenv is a simple python version management tool. It lets you easily switch bet&quot; data-og-description=&quot;pyenv for Windows. pyenv is a simple python version management tool. It lets you easily switch between multiple versions of Python. It's simple, unobtrusive, and follows the UNIX tradition of s...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/pyenv-win/pyenv-win&quot; data-og-url=&quot;https://github.com/pyenv-win/pyenv-win&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cBL15v/hyXWBNUeji/mQkYQw9Qo6zRMi4OWJUeM1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/CDxgy/hyXWwy3k8D/kjgWt8D0jN2TVA2LHzBbw0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/pyenv-win/pyenv-win&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/pyenv-win/pyenv-win&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cBL15v/hyXWBNUeji/mQkYQw9Qo6zRMi4OWJUeM1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/CDxgy/hyXWwy3k8D/kjgWt8D0jN2TVA2LHzBbw0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - pyenv-win/pyenv-win: pyenv for Windows. pyenv is a simple python version management tool. It lets you easily switch bet&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;pyenv for Windows. pyenv is a simple python version management tool. It lets you easily switch between multiple versions of Python. It's simple, unobtrusive, and follows the UNIX tradition of s...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Window Powershell의 관리자 모드로 실행을 권장&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;1. &lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;Install pyenv-win in PowerShell.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735786683746&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Invoke-WebRequest -UseBasicParsing -Uri &quot;https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1&quot; -OutFile &quot;./install-pyenv-win.ps1&quot;; &amp;amp;&quot;./install-pyenv-win.ps1&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 시스템에서 스크림트를 실행할 수 없으므로 ~ 에러를 출력한다면 다음을 입력 후 다시 시도&lt;/p&gt;
&lt;pre id=&quot;code_1735790515060&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Reopen PowerShell&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.&amp;nbsp;Run&lt;span&gt;&amp;nbsp;&lt;/span&gt;pyenv --version&lt;span&gt;&amp;nbsp;&lt;/span&gt;to check if the installation was successful.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치된 pyenv 버전 확인&lt;/p&gt;
&lt;pre id=&quot;code_1735790569935&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pyenv --version&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. &lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;Run&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;pyenv install -l&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;to check a list of Python versions supported by pyenv-win&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1f2328;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;설치 가능한 python 버전 확인&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735790629481&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pyenv install -l&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;5. &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;Run&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;pyenv install &amp;lt;version&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;to install the supported version&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;3.10 버전 파이썬 설치&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;uninstall를 사용하여 해당 버전을 삭제할 수도 있다&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735790682655&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pyenv install 3.10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;6. &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;Run&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;pyenv global &amp;lt;version&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;to set a Python version as the global version&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;global / local / shell 옵션으로 python 적용 범위를 설정 가능&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735790706760&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pyenv global 3.10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;7. &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; letter-spacing: 0px;&quot;&gt;Check which Python version you are using and its path&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1f2328;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;사용 중인 python version 확인&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735790872634&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pyenv version&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. &lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;Check that Python is working&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: left;&quot;&gt;사용 중인 python의 위치 확인&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735790920142&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python -c &quot;import sys; print(sys.executable)&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 가상환경 생성&lt;/h2&gt;
&lt;pre id=&quot;code_1741326294312&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python -m venv .venv&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Develop/Python</category>
      <category>pyenv</category>
      <category>python</category>
      <category>window</category>
      <category>관리</category>
      <category>방법</category>
      <category>버전</category>
      <category>설치</category>
      <category>프로젝트</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/667</guid>
      <comments>https://geunuk.tistory.com/667#entry667comment</comments>
      <pubDate>Thu, 2 Jan 2025 13:10:28 +0900</pubDate>
    </item>
    <item>
      <title>간단한 Airflow v2.10.5 환경 구축 (with. dockerfile)</title>
      <link>https://geunuk.tistory.com/666</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;WSL2 Ubuntu&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;apt 업데이트&lt;/p&gt;
&lt;pre id=&quot;code_1735606021070&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt update&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1735606033485&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install sudo&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 폴더 권한 부여&lt;/p&gt;
&lt;pre id=&quot;code_1735606204198&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo chown -R [사용자 계정명] [프로젝트 디렉토리]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 설치&lt;/p&gt;
&lt;pre id=&quot;code_1735606226189&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install python3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상환경 생성 (프로젝트 디렉토리에서)&lt;/p&gt;
&lt;pre id=&quot;code_1735606290321&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install python3-venv&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1735606309656&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python3 -m venv venv&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1735606378096&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;source venv/bin/activate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;airflow 라이브러리 설치&lt;/p&gt;
&lt;pre id=&quot;code_1735606416275&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install apache-airflow==2.10.5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;airflow 세팅 및 실행 (프로젝트 디렉토리에서)&lt;/p&gt;
&lt;pre id=&quot;code_1735606627661&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export AIRFLOW_HOME=$PWD/airflow
airflow db init
sed -i 's/^load_examples = True/load_examples = False/' $AIRFLOW_HOME/airflow.cfg # 예제 로드 X
airflow users create -u user -f user -l user -e user@example.com -p user -r Admin # 계정 생성
airflow webserver -p 8080 &amp;amp; airflow scheduler # 실행&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AIRFLOW root 디렉토리를 현재 위치한 프로젝트 디렉토리로 설정하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;airflow에서 제공하는 예제 DAGs를 띄우지 않게 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Dockerfile (Airflow 2.10.5)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2025-09-16 : flask-limiter 버전 충돌 수정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741140282424&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM python:3.9-slim

USER root

RUN apt-get update &amp;amp;&amp;amp; \
    apt-get install -y --no-install-recommends vim sudo &amp;amp;&amp;amp; \
    rm -rf /var/lib/apt/lists/*

RUN sudo ln -snf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

ENV AIRFLOW_HOME=/root/airflow
RUN mkdir -p $AIRFLOW_HOME
WORKDIR $AIRFLOW_HOME

RUN pip install apache-airflow==2.10.5 flask-limiter==3.10.0

RUN airflow db init &amp;amp;&amp;amp; \
    sed -i 's/^load_examples = True/load_examples = False/' $AIRFLOW_HOME/airflow.cfg &amp;amp;&amp;amp; \
    airflow users create \
        --username user \
        --firstname user \
        --lastname user \
        --email user@example.com \
        --password user \
        --role Admin

EXPOSE 8080

CMD [&quot;/bin/bash&quot;, &quot;-c&quot;, &quot;airflow webserver -p 8080 &amp;amp; airflow scheduler&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1741140329607&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker build -t airflow .
docker run -d -p 8080:8080 \
  -v /home/user/projects/airflow/dags:/root/airflow/dags \
  -v /home/user/projects/airflow/logs:/root/airflow/logs \
  -v /home/user/projects/airflow/plugins:/root/airflow/plugins \
  --name airflow \
  airflow&lt;/code&gt;&lt;/pre&gt;</description>
      <category>ML &amp;amp; DL/Practice</category>
      <category>Airflow</category>
      <category>Apache</category>
      <category>docker</category>
      <category>Dockerfile</category>
      <category>python</category>
      <category>구축</category>
      <category>기본</category>
      <category>설정</category>
      <category>세팅</category>
      <category>환경</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/666</guid>
      <comments>https://geunuk.tistory.com/666#entry666comment</comments>
      <pubDate>Tue, 31 Dec 2024 10:01:47 +0900</pubDate>
    </item>
    <item>
      <title>[Tistory] hELLO. 스킨 카테고리 접기 펼치기 수정</title>
      <link>https://geunuk.tistory.com/664</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;카테고리 목록에서 서브 카테고리가 있는 경우, 클릭 시 페이지 이동 없이 펼쳐볼 수 있도록 스킨을 수정했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스킨 편집에서 HTML &amp;gt; body 아래에 다음 코드를 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1735284248339&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;!-- 카테고리 목록 펼치기/접기 --&amp;gt;
    &amp;lt;script&amp;gt;
      $(function() {
        $(&quot;.category_list&quot;).children(&quot;li&quot;).each(function() {
          const $li = $(this);
          if ($li.children(&quot;ul&quot;).length &amp;gt; 0) {
            $li.children(&quot;a&quot;)
              .removeAttr(&quot;href&quot;)
              .addClass(&quot;duration-200&quot;)
              .attr(&quot;x-on:click&quot;, &quot;open = ! open&quot;)
              .attr(&quot;:class&quot;, &quot;{ &amp;amp;quot;rotate-90 duration-200&amp;amp;quot;: open }&quot;);
          }
        });
      });
    &amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>끄적 끄적</category>
      <category>hello.</category>
      <category>수정</category>
      <category>카테고리</category>
      <category>카테고리 목록 펼치기</category>
      <category>티스토리 스킨</category>
      <category>편집</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/664</guid>
      <comments>https://geunuk.tistory.com/664#entry664comment</comments>
      <pubDate>Fri, 27 Dec 2024 16:24:39 +0900</pubDate>
    </item>
    <item>
      <title>docker-compose로 Airflow 환경 구축</title>
      <link>https://geunuk.tistory.com/663</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html&quot;&gt;여기&lt;/a&gt;에서 최신 설치 방법을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;Python&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. python 설치 (v3.12)&lt;/p&gt;
&lt;pre id=&quot;code_1735525379623&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install python3-pip&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. airflow library 설치&lt;/p&gt;
&lt;pre id=&quot;code_1735525379624&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;pip3 install apache-airflow&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;Airflow&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. .yaml 파일 가져오기&lt;/p&gt;
&lt;pre id=&quot;code_1735525379624&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.10.4/docker-compose.yaml'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. directory 생성 및 그룹 id 설정&lt;/p&gt;
&lt;pre id=&quot;code_1735525379624&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;mkdir -p -m 755 ./dags ./logs ./plugins ./config
echo -e &quot;AIRFLOW_UID=$(id -u)&quot; &amp;gt; .env&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 초기 세팅&lt;/p&gt;
&lt;pre id=&quot;code_1735525379624&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;AIRFLOW_UID=50000&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 공통 환경 설정 (postgres, redis 설치 포함)&lt;/p&gt;
&lt;pre id=&quot;code_1735525379625&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;docker compose up airflow-init&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;airflow-init-1 exited with code 0 를 출력하면 정상적으로 설치 및 설정되었다는 뜻입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 실행&lt;/p&gt;
&lt;pre id=&quot;code_1735525379625&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 확인&lt;/p&gt;
&lt;pre id=&quot;code_1735525379625&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;docker ps -a&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어를 통해 container가 정상적으로 설치되었는지 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;localhost:8080 을 통해 airflow에 접근할 수 있습니다. 기본 id/password는 airflow 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지가 간단한 실습이고, CPU를 많이 사용하기 때문에 container를 종료 및 제거합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1735531322514&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker-compose down --volumes --rmi all&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;커스텀&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예제 DAG LOAD X&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735531229034&quot; class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;AIRFLOW__CORE__LOAD_EXAMPLES: 'false'&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;webserver ID/PWD (admin/admin)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1735531492893&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    environment:
      ...
      _AIRFLOW_WWW_USER_USERNAME: ${_AIRFLOW_WWW_USER_USERNAME:-admin}
      _AIRFLOW_WWW_USER_PASSWORD: ${_AIRFLOW_WWW_USER_PASSWORD:-admin}
      ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ML &amp;amp; DL/Practice</category>
      <category>Airflow</category>
      <category>docker-compose</category>
      <category>docker-compose로 airflow 설치</category>
      <category>install</category>
      <category>설치</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/663</guid>
      <comments>https://geunuk.tistory.com/663#entry663comment</comments>
      <pubDate>Fri, 27 Dec 2024 11:26:59 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] WSL2에 Docker 설치</title>
      <link>https://geunuk.tistory.com/662</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. apt update &amp;amp; upgrade&lt;/h3&gt;
&lt;pre id=&quot;code_1735263115782&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt update -y
sudo apt upgrade -y&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. docker에 필요한 패키지 설치&lt;/h3&gt;
&lt;pre id=&quot;code_1735263199555&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install -y apt-transport-https ca-certificates curl software-properties-common&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. docker GPG key 추가&lt;/h3&gt;
&lt;pre id=&quot;code_1735263251967&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. docker apt 저장소 추가&lt;/h3&gt;
&lt;pre id=&quot;code_1735263301706&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo add-apt-repository &quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. apt update&lt;/h3&gt;
&lt;pre id=&quot;code_1735263338206&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get update&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. docker 설치&lt;/h3&gt;
&lt;pre id=&quot;code_1735263370304&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install -y docker-ce docker-ce-cli containerd.io&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. [WSL 사용 시] sudo 없이 docker를 사용하기 위해 계정 권한 추가&lt;/h3&gt;
&lt;pre id=&quot;code_1735263438524&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo groupadd docker
sudo usermod -aG docker $USER
sudo chmod 666 /var/run/docker.sock
newgrp docker&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8. docker 실행&lt;/h3&gt;
&lt;pre id=&quot;code_1735263474524&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo service docker start&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Develop/Docker</category>
      <category>docker</category>
      <category>ubuntu</category>
      <category>WSL</category>
      <category>권한</category>
      <category>설치</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/662</guid>
      <comments>https://geunuk.tistory.com/662#entry662comment</comments>
      <pubDate>Fri, 27 Dec 2024 10:43:09 +0900</pubDate>
    </item>
    <item>
      <title>[Error] / [Pyinstaller] xgboost XGBoostLibraryNotFound error</title>
      <link>https://geunuk.tistory.com/661</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 상황&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;xgboost를 import한 .py 파일을 pyinstaller로 .exe 로 패키징 할 때 다음과 같은 에러를 출력&lt;/p&gt;
&lt;pre id=&quot;code_1732845802101&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;xgboost.libpath.XGBoostLibraryNotFound: Cannot find XGBoost Library in the candidate path, did you install compilers and run build.sh in root path?
List of candidates:
C:\...\AppData\Local\Temp\_MEI103562\xgboost\xgboost.dll
C:\...\AppData\Local\Temp\_MEI103562\xgboost\../../lib/xgboost.dll
C:\...\AppData\Local\Temp\_MEI103562\xgboost\./lib/xgboost.dll
C:\...\AppData\Local\Temp\_MEI103562\xgboost\xgboost.dll
C:\...\AppData\Local\Temp\_MEI103562\xgboost\../../windows/x64/Release/xgboost.dll
C:\...\AppData\Local\Temp\_MEI103562\xgboost\./windows/x64/Release/xgboost.dll&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 글을 참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/dmlc/xgboost/issues/7761#issuecomment-1104619556&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/dmlc/xgboost/issues/7761#issuecomment-1104619556&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732845858889&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Pyinstaller and xgboost &amp;middot; Issue #7761 &amp;middot; dmlc/xgboost&quot; data-og-description=&quot;Dear coders, I am trying to launch pyinstaller for my app but it appear the commun error with xgboost and pyinstaller. I am using xgboost version 1.5.2. The error is : import xgboost as xgb File &amp;quot;&amp;quot;...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/dmlc/xgboost/issues/7761#issuecomment-1104619556&quot; data-og-url=&quot;https://github.com/dmlc/xgboost/issues/7761&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Ddb7p/hyXC9FzCpV/YlfsT60ORnFMEUg7aKd850/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/b8eiG6/hyXDfy08xP/DMT7VV3kkHU3VgS9Pb3GPk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/dmlc/xgboost/issues/7761#issuecomment-1104619556&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/dmlc/xgboost/issues/7761#issuecomment-1104619556&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Ddb7p/hyXC9FzCpV/YlfsT60ORnFMEUg7aKd850/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/b8eiG6/hyXDfy08xP/DMT7VV3kkHU3VgS9Pb3GPk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Pyinstaller and xgboost &amp;middot; Issue #7761 &amp;middot; dmlc/xgboost&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Dear coders, I am trying to launch pyinstaller for my app but it appear the commun error with xgboost and pyinstaller. I am using xgboost version 1.5.2. The error is : import xgboost as xgb File &quot;&quot;...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 파일 추가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[PYTHON PATH]\L&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;ib/site-package/_pyinstaller_hooks_contrib/stdhooks 폴더에 hook-xgboost.py 파일을 생성&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1732846017525&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;&quot;&quot; hook-xgboost.py &quot;&quot;&quot;
from PyInstaller.utils.hooks import collect_all
datas, binaries, hiddenimports = collect_all(&quot;xgboost&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 패키징&lt;/h4&gt;
&lt;pre id=&quot;code_1732846203210&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pyinstaller --collect-all &quot;xgboost&quot; test.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--add-data &quot;[file_path]; [dir_path]&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--hidden-import &quot;[library]&quot;&lt;/p&gt;</description>
      <category>Develop/Python</category>
      <category>.DLL</category>
      <category>error</category>
      <category>import</category>
      <category>module</category>
      <category>package</category>
      <category>pyinstaller</category>
      <category>XGBoost</category>
      <category>xgboostlibrarynotfound</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/661</guid>
      <comments>https://geunuk.tistory.com/661#entry661comment</comments>
      <pubDate>Fri, 29 Nov 2024 11:13:22 +0900</pubDate>
    </item>
    <item>
      <title>[Time Sereis Forecasting] One-Step, Multi-Step, Multi-Output</title>
      <link>https://geunuk.tistory.com/660</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;One-Step&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 과거 데이터를 바탕으로 한 시점 뒤의 미래 값을 예측하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 1시간 간격으로 기록된 데이터가 있다면 0~6시의 데이터를 보고 1시간 뒤인 7시의 데이터를 예측하는 것&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적으로 모델의 예측이 정확하며, 에러가 축적되지 않아 안정적인 예측 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Multi-Step&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 시점을 동시에 예측하는 방법.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 1시간 간격으로 기록된 데이터가 있다면 0~12시의 데이터를 보고 6시간 뒤인 13~18시 까지의 데이터를 예측하는 것&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Direct Multi-Step&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 시점을 별도의 모델로 예측하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, t+1, t+2, t+3의 3개의 시점을 예측하고 싶다면 각각의 시점에 대해 독립적으로 모델을 훈련&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정확도는 높을 수 있지만, 계산 비용이 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Recursive Multi-Step&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 시점의 예측 결과를 다음 시점의 입력으로 사용하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, t+1 시점의 예측 결과를 입력의 마지막에 붙여 t+2를 예측하는 방식&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단일 모델을 반복적으로 사용해 계산 비용이 낮음&lt;/li&gt;
&lt;li&gt;이전 예측의 에러가 다음 시점에 반영되어 에러가 누적될 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Multi-Output&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예측하고자 하는 시점을 한 번에 예측하는 방법&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단일 모델로 여러 시점의 값을 동시에 예측하기 때문에 복잡성이 낮음&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>ML &amp;amp; DL/Deep Learning</category>
      <category>multi-output</category>
      <category>multi-step</category>
      <category>one-step</category>
      <category>time series forecasting</category>
      <category>단일 시점</category>
      <category>미래</category>
      <category>예측</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/660</guid>
      <comments>https://geunuk.tistory.com/660#entry660comment</comments>
      <pubDate>Mon, 4 Nov 2024 16:22:42 +0900</pubDate>
    </item>
    <item>
      <title>ReLU Family</title>
      <link>https://geunuk.tistory.com/659</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;ReLU&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Rectified Linear Unit&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ ReLU(x) = max(0,x) $$&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;465&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLcqOh/btsKgvgRhuU/rtw5kDhcayKTvQJ8ckHrX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLcqOh/btsKgvgRhuU/rtw5kDhcayKTvQJ8ckHrX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLcqOh/btsKgvgRhuU/rtw5kDhcayKTvQJ8ckHrX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLcqOh%2FbtsKgvgRhuU%2Frtw5kDhcayKTvQJ8ckHrX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;569&quot; height=&quot;465&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;465&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;LeakyReLU&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ LeakyReLU_{\alpha} = max(\alpha x, x) $$&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;465&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bluQQG/btsKhfKZLum/4YrEWgXgGdCyHCKHoUprg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bluQQG/btsKhfKZLum/4YrEWgXgGdCyHCKHoUprg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bluQQG/btsKhfKZLum/4YrEWgXgGdCyHCKHoUprg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbluQQG%2FbtsKhfKZLum%2F4YrEWgXgGdCyHCKHoUprg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;569&quot; height=&quot;465&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;465&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;GELU&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gaussian Error Linear Unit&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ GELU(x) = 0.5 \cdot x \cdot (1 + \tanh(\sqrt{2/\pi} \cdot (x + 0.044715 \cdot x^3))) $$&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;465&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eBAVRz/btsKgMbHowM/u6oUXNQC86y90xnjKopIJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eBAVRz/btsKgMbHowM/u6oUXNQC86y90xnjKopIJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eBAVRz/btsKgMbHowM/u6oUXNQC86y90xnjKopIJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeBAVRz%2FbtsKgMbHowM%2Fu6oUXNQC86y90xnjKopIJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;569&quot; height=&quot;465&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;465&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;PReLU&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Parametric ReLU&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ PReLU(x) = \max(0, x) + a \cdot \min(0, x) $$&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;465&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lrPaw/btsKgB89GhC/fkIKYvSeqQWFHe18WbKEVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lrPaw/btsKgB89GhC/fkIKYvSeqQWFHe18WbKEVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lrPaw/btsKgB89GhC/fkIKYvSeqQWFHe18WbKEVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlrPaw%2FbtsKgB89GhC%2FfkIKYvSeqQWFHe18WbKEVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;569&quot; height=&quot;465&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;465&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ELU&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Exponential Linear Unit&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ ELU_{\alpha} = \begin{cases} \alpha (\exp(x) - 1) &amp;amp; \text{if } x &amp;lt; 0 \\ x &amp;amp; \text{if } x &amp;gt;= 0 \end{cases} $$&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;465&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj1JBw/btsKeTwB3Uf/LvhTISuIUuUIYysX49k2hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj1JBw/btsKeTwB3Uf/LvhTISuIUuUIYysX49k2hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj1JBw/btsKeTwB3Uf/LvhTISuIUuUIYysX49k2hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj1JBw%2FbtsKeTwB3Uf%2FLvhTISuIUuUIYysX49k2hk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;569&quot; height=&quot;465&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;465&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SELU&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Scaled Exponential Linear Unit&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ SELU(x) = \text{scale} \cdot (\max(0, x) + \min(0, \alpha \cdot (\exp(x) - 1))) $$&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;465&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/quUJn/btsKhfRSh1k/zV4SPetGbM2sIdBQTxBb1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/quUJn/btsKhfRSh1k/zV4SPetGbM2sIdBQTxBb1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/quUJn/btsKhfRSh1k/zV4SPetGbM2sIdBQTxBb1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FquUJn%2FbtsKhfRSh1k%2FzV4SPetGbM2sIdBQTxBb1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;569&quot; height=&quot;465&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;465&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>ML &amp;amp; DL/기초 이론</category>
      <category>ELU</category>
      <category>family</category>
      <category>GELU</category>
      <category>Leakyrelu</category>
      <category>prelu</category>
      <category>relu</category>
      <category>selu</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/659</guid>
      <comments>https://geunuk.tistory.com/659#entry659comment</comments>
      <pubDate>Wed, 23 Oct 2024 14:02:03 +0900</pubDate>
    </item>
    <item>
      <title>[Windows 11] 네트워크 자격 증명 로그인 문제 해결 방법</title>
      <link>https://geunuk.tistory.com/658</link>
      <description>&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;1. 일반적인 해결 방법&lt;/h2&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1.1 컴퓨터 공유 허용 문제&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;대부분 윈도우 업데이트 이후 발생&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;제어판 &amp;gt; 네트워크 및 인터넷 &amp;gt; 네트워크 및 공유 센터 &amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;고급 공유 설정 변경&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. 프라이빗 네트워크의 네트워크 검색, 파일 및 프린터 공유를 켬으로 변경&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 모든 네트워크의 공유 폴더 공유, 암호로 보호된 공유를 켬으로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 공유 폴더로 접근할 때 사용자 이름/ 암호가 맞지만, 일치하지 않다고하는 경우&amp;nbsp;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.1 네트워크 보안 LAN 관리자 인증 수준 문제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;win + r &amp;gt; gpedit.msc &amp;gt; 컴퓨터 구성 &amp;gt; Windows 설정 &amp;gt; 보안 설정 &amp;gt; 로컬 정책 &amp;gt; 보안 옵션 &amp;gt; 네트워크 보안: LAN Manager 인증 수준&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속성에서 '&lt;b&gt;NTLMv2 응답만 보냅니다. LM 및 NTLM은 거부합니다.&lt;/b&gt;' 로 변경&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.2 Microsoft 계정 문제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 &amp;gt; 계정 에서 Microsoft 계정을 사용하고 있다면 &lt;b&gt;로그아웃&lt;/b&gt;을 하여 로컬 계정으로 전환한 후 접속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 로그온 실패: 사용자는 이 컴퓨터에서는 요청된 로그온 유형을 허가 받지 않았습니다.&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.1 네트워크 자격 증명 문제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제어판 &amp;gt; 검색 : 자격 증명 관리자 &amp;gt; Windows 자격 증명 &amp;gt; Windows 자격 증명 추가 &amp;gt; 공유 폴더에 접속하기 위한 주소, 사용자 이름, 암호 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소 입력 시 \\ 를 입력 할 것 (\\192.168.0.1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Develop/Windows</category>
      <category>windows11</category>
      <category>공유</category>
      <category>내용 자격 증명</category>
      <category>네트워크</category>
      <category>로그온 유형</category>
      <category>로그인</category>
      <category>사용자 이름</category>
      <category>암호</category>
      <category>오류</category>
      <category>폴더</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/658</guid>
      <comments>https://geunuk.tistory.com/658#entry658comment</comments>
      <pubDate>Thu, 17 Oct 2024 09:54:20 +0900</pubDate>
    </item>
    <item>
      <title>[Time Series Forecasting] Sliding Window Dataset</title>
      <link>https://geunuk.tistory.com/657</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Sliding Window Dataset&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blK8ax/btsK2vT3ddF/oy2IXlpzMaSiA6b7g3viK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blK8ax/btsK2vT3ddF/oy2IXlpzMaSiA6b7g3viK0/img.png&quot; data-alt=&quot;https://mlpills.dev/time-series/forecasting-in-time-series/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blK8ax/btsK2vT3ddF/oy2IXlpzMaSiA6b7g3viK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblK8ax%2FbtsK2vT3ddF%2Foy2IXlpzMaSiA6b7g3viK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;537&quot; height=&quot;279&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;279&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://mlpills.dev/time-series/forecasting-in-time-series/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Time Series Forecasting에 사용되는 Sliding Window Dataset은 연속적인 시계열 데이터를 여러 개의 고정된 크기의 입력과 출력 윈도우로 나누어 Dataset을 구성하는 방법입니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 Pytorch로 Dataset 다변량(Multi-Variate) 다중 스텝(Multi-Step) 데이터셋을 구성하기 위한 코드입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1728885339223&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import torch
from torch.utils.data import Dataset

class SlidingWindowDataset(Dataset):
    def __init__(self, train_X, target_variables, input_window, output_window, stride=1):
        self.train_X = train_X
        self.train_y = train_X[target_variables].values

        self.input_window = input_window
        self.output_window = output_window
        self.stride = stride

        self.num_samples = (len(self.train_y) - input_window - output_window) // stride + 1

    def create_features(self, df, idx):
        return np.stack([df[var].values[idx * self.stride:idx * self.stride + self.input_window] for var in self.train_X.columns], axis=-1)

    def create_target(self, target, idx):
        return target[idx * self.stride + self.input_window : idx * self.stride + self.input_window + self.output_window]

    def __getitem__(self, idx):
        X = self.create_features(self.train_X, idx)
        Y = self.create_target(self.train_y, idx)

        X_tensor = torch.tensor(X, dtype=torch.float32)
        Y_tensor = torch.tensor(Y, dtype=torch.float32)

        return X_tensor, Y_tensor

    def __len__(self):
        return self.num_samples&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ML &amp;amp; DL/Deep Learning</category>
      <category>DataSet</category>
      <category>multi step</category>
      <category>multi variate</category>
      <category>python</category>
      <category>pytorch</category>
      <category>sliding window</category>
      <category>time series forecasting</category>
      <category>코드</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/657</guid>
      <comments>https://geunuk.tistory.com/657#entry657comment</comments>
      <pubDate>Mon, 14 Oct 2024 14:56:09 +0900</pubDate>
    </item>
    <item>
      <title>[Time Series Forecasting] LSTM, GRU, CNN, ... PyTorch 구현</title>
      <link>https://geunuk.tistory.com/656</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;LSTM&lt;/h2&gt;
&lt;pre id=&quot;code_1728540355440&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class LSTMModel(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, dropout):
        super(LSTMModel, self).__init__()
        self.hidden_size = hidden_size
        self.num_layers = num_layers

        self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)

        self.selu = nn.SELU() # nn.ReLU()
        self.dropout = nn.Dropout(dropout)
        self.fc = nn.Linear(hidden_size, 1)

    def forward(self, x):
        batch_size = x.size(0)
        h0 = Variable(torch.zeros(self.num_layers, batch_size, self.hidden_size)).to(x.device)
        c0 = Variable(torch.zeros(self.num_layers, batch_size, self.hidden_size)).to(x.device)

        x, _ = self.lstm(x, (h0, c0))
        x = x[:, -1, :]

        x = self.dropout(self.selu(x))
        x = self.fc(x)

        return x.unsqueeze(-1)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;GRU&lt;/h2&gt;
&lt;pre id=&quot;code_1729658036561&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class GRUModel(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, dropout):
        super(GRUModel, self).__init__()
        self.hidden_size = hidden_size
        self.num_layers = num_layers

        self.gru = nn.GRU(input_size, hidden_size, num_layers, batch_first=True)

        self.selu = nn.SeLU()
        self.dropout = nn.Dropout(dropout)
        self.fc = nn.Linear(hidden_size, 1)

    def forward(self, x):
        h0 = Variable(torch.zeros(self.num_layers, x.size(0), self.hidden_size)).to(x.device)

        x, _ = self.gru(x, h0)
        x = x[:, -1, :]
        
        x = self.dropout(self.selu(x))
        x = self.fc(x)

        return x.unsqueeze(-1)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CNN&lt;/h2&gt;
&lt;pre id=&quot;code_1732862435677&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class CNNModel(nn.Module):
    def __init__(self, input_size, hidden_size, kernel_size, input_window, output_window, dropout=0.2):
        super(CNNModel, self).__init__()

        self.conv1d1 = nn.Conv1d(input_size, hidden_size, kernel_size, stride=1, padding=kernel_size // 2)
        self.maxpool = nn.MaxPool1d(kernel_size=2, stride=2)

        self.selu = nn.SELU()
        self.dropout = nn.Dropout(dropout)

        self.fc = nn.Linear(hidden_size * (input_window // 2), output_window)

    def forward(self, x):
        x = x.transpose(1, 2)
        x = self.conv1d1(x)
        x = self.selu(x)
        x = self.maxpool(x)

        x = x.reshape(x.size(0), -1)

        x = self.dropout(self.selu(x))
        x = self.fc(x)

        return x.unsqueeze(-1)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CNN-LSTM&lt;/h2&gt;
&lt;pre id=&quot;code_1732862466336&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class CNN_LSTM(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, dropout, output_size, output_window):
        super(CNN_LSTM, self).__init__()
        
        self.output_size = output_size
        self.output_window = output_window

        self.conv1d = nn.Conv1d(in_channels=input_size, out_channels=hidden_size, kernel_size=3, stride=1, padding=1)
        self.maxpool = nn.MaxPool1d(kernel_size=2)

        self.lstm = nn.LSTM(input_size=hidden_size, hidden_size=hidden_size*2, num_layers=num_layers, batch_first=True)

        self.dropout1 = nn.Dropout(dropout)
        self.fc1 = nn.Linear(hidden_size*2, output_size * output_window)

        self.selu = nn.SELU()

    def forward(self, x):
        x = x.transpose(1, 2)

        x = self.selu(self.conv1d(x))
        x = self.maxpool(x)

        x = x.transpose(1, 2)

        x, _ = self.lstm(x)
        x = x[:, -1, :]

        x = self.dropout1(self.selu(x))
        x = self.fc1(x)
        x = x.reshape(-1, self.output_window, self.output_size)
        
        return x&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TCN&lt;/h2&gt;
&lt;pre id=&quot;code_1728540438190&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;&quot;&quot;
https://github.com/hyliush/deep-time-series/blob/master/models/TCN.py
&quot;&quot;&quot;

class Chomp1d(nn.Module):
    def __init__(self, chomp_size):
        super(Chomp1d, self).__init__()
        self.chomp_size = chomp_size

    def forward(self, x):
        return x[:, :, :-self.chomp_size].contiguous()


class TemporalBlock(nn.Module):
    def __init__(self, n_inputs, n_outputs, kernel_size, stride, dilation, padding, dropout=0.2):
        super(TemporalBlock, self).__init__()
        self.conv1 = nn.utils.parametrizations.weight_norm(nn.Conv1d(n_inputs, n_outputs, kernel_size,
                                           stride=stride, padding=padding, dilation=dilation))
        self.chomp1 = Chomp1d(padding)
        self.dropout1 = nn.Dropout(dropout)

        self.conv2 = nn.utils.parametrizations.weight_norm(nn.Conv1d(n_outputs, n_outputs, kernel_size,
                                           stride=stride, padding=padding, dilation=dilation))
        self.chomp2 = Chomp1d(padding)
        self.dropout2 = nn.Dropout(dropout)

        self.net = nn.Sequential(self.conv1, self.chomp1, self.dropout1,
                                 self.conv2, self.chomp2, self.dropout2)
        self.downsample = nn.Conv1d(n_inputs, n_outputs, 1) if n_inputs != n_outputs else None
        self.init_weights()

    def init_weights(self):
        self.conv1.weight.data.normal_(0, 0.01)
        self.conv2.weight.data.normal_(0, 0.01)
        if self.downsample is not None:
            self.downsample.weight.data.normal_(0, 0.01)

    def forward(self, x):
        out = self.net(x)
        res = x if self.downsample is None else self.downsample(x)
        return out + res

class TCN(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, kernel_size, dropout=0.2):
        super(TCN, self).__init__()

        num_channels = [hidden_size] * num_layers
        layers = []
        num_levels = len(num_channels)
        for i in range(num_levels):
            dilation_size = 2 ** i
            in_channels = input_size if i == 0 else num_channels[i-1]
            out_channels = num_channels[i]

            layers += [TemporalBlock(in_channels, out_channels, kernel_size, stride=1, dilation=dilation_size,
                                     padding=(kernel_size-1) * dilation_size, dropout=dropout)]

        self.network = nn.Sequential(*layers)
        self.out_proj = nn.Linear(hidden_size, 1)

    def forward(self, x):
        x = x.transpose(1, 2)
        x = self.network(x)
        x = x[:, :, -1:]
        x = self.out_proj(x.transpose(1, 2))
        return x&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Transformer Encoder&lt;/h2&gt;
&lt;pre id=&quot;code_1732862514350&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import math
import torch.nn.functional as F

class PositionalEncoding(nn.Module):
    def __init__(self, d_model, dropout=0.1, max_len=5000):
        super(PositionalEncoding, self).__init__()
        self.dropout = nn.Dropout(p=dropout)

        pe = torch.zeros(max_len, d_model)
        position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)
        div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model))
        pe[:, 0::2] = torch.sin(position * div_term)
        pe[:, 1::2] = torch.cos(position * div_term)
        pe = pe.unsqueeze(0).transpose(0, 1)
        self.register_buffer('pe', pe)

    def forward(self, x):
        x = x + self.pe[:x.size(0), :]
        return self.dropout(x)


class TransformerEncoder(nn.Module):
    def __init__(self, input_size, hidden_size, kernel_size, seq_len, n_head, n_layers, output_size, output_window):
        super(TransformerEncoder, self).__init__()

        self.conv = nn.Conv1d(input_size, hidden_size, kernel_size=kernel_size)
        self.pos_encoder = PositionalEncoding(hidden_size, max_len=seq_len)
        self.transformer_layer = nn.TransformerEncoderLayer(d_model=hidden_size, nhead=n_head)
        self.transformer = nn.TransformerEncoder(self.transformer_layer, num_layers=n_layers)
        self.fc = nn.Linear(hidden_size, output_size * output_window)

        self.kernel_size = kernel_size

    def forward(self, x):
        x = x.transpose(1, 2)
        x = F.pad(x, (self.kernel_size-1,0))
        x = self.conv(x).permute(2, 0, 1)
        x = self.pos_encoder(x)
        x = self.transformer(x).transpose(0, 1)[:, -1:]
        x = self.fc(x)
        return x.transpose(1, 2)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;D-Linear&lt;/h2&gt;
&lt;pre id=&quot;code_1732862579215&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class moving_avg(torch.nn.Module):
    def __init__(self, kernel_size, stride):
        super(moving_avg, self).__init__()
        self.kernel_size = kernel_size
        self.avg = torch.nn.AvgPool1d(kernel_size=kernel_size, stride=stride, padding=0)

    def forward(self, x):
        front = x[:, 0:1, :].repeat(1, (self.kernel_size - 1) // 2, 1)
        end = x[:, -1:, :].repeat(1, (self.kernel_size - 1) // 2, 1)
        x = torch.cat([front, x, end], dim=1)
        x = self.avg(x.permute(0, 2, 1))
        x = x.permute(0, 2, 1)
        return x

class series_decomp(torch.nn.Module):
    def __init__(self, kernel_size):
        super(series_decomp, self).__init__()
        self.moving_avg = moving_avg(kernel_size, stride=1)

    def forward(self, x):
        moving_mean = self.moving_avg(x)
        residual = x - moving_mean
        return moving_mean, residual

class LTSF_DLinear(torch.nn.Module):
    def __init__(self, seq_len, pred_len, kernel_size, individual, feature_size):
        super(LTSF_DLinear, self).__init__()

        self.seq_len = seq_len
        self.pred_len = pred_len

        self.decompsition = series_decomp(kernel_size)
        self.individual = individual
        self.channels = feature_size

        if self.individual:
            self.Linear_Seasonal = torch.nn.ModuleList()
            self.Linear_Trend = torch.nn.ModuleList()
            for i in range(self.channels):
                self.Linear_Trend.append(torch.nn.Linear(self.seq_len, self.pred_len))
                self.Linear_Trend[i].weight = torch.nn.Parameter((1/self.seq_len)*torch.ones([self.pred_len, self.seq_len]))
                self.Linear_Seasonal.append(torch.nn.Linear(self.seq_len, self.pred_len))
                self.Linear_Seasonal[i].weight = torch.nn.Parameter((1/self.seq_len)*torch.ones([self.pred_len, self.seq_len]))
        else:
            self.Linear_Trend = torch.nn.Linear(self.seq_len, self.pred_len)
            self.Linear_Trend.weight = torch.nn.Parameter((1/self.seq_len)*torch.ones([self.pred_len, self.seq_len]))
            self.Linear_Seasonal = torch.nn.Linear(self.seq_len,  self.pred_len)
            self.Linear_Seasonal.weight = torch.nn.Parameter((1/self.seq_len)*torch.ones([self.pred_len, self.seq_len]))

        self.fc = nn.Linear(feature_size, 1)

    def forward(self, x):
        trend_init, seasonal_init = self.decompsition(x)
        trend_init, seasonal_init = trend_init.permute(0,2,1), seasonal_init.permute(0,2,1)

        if self.individual:
            trend_output = torch.zeros([trend_init.size(0), trend_init.size(1), self.pred_len], dtype=trend_init.dtype).to(trend_init.device)
            seasonal_output = torch.zeros([seasonal_init.size(0), seasonal_init.size(1), self.pred_len], dtype=seasonal_init.dtype).to(seasonal_init.device)
            for idx in range(self.channels):
                trend_output[:, idx, :] = self.Linear_Trend[idx](trend_init[:, idx, :])
                seasonal_output[:, idx, :] = self.Linear_Seasonal[idx](seasonal_init[:, idx, :])
        else:
            trend_output = self.Linear_Trend(trend_init)
            seasonal_output = self.Linear_Seasonal(seasonal_init)

        x = seasonal_output + trend_output
        x = x.permute(0,2,1)

        if x.size(2) &amp;gt; 1:
            x = self.fc(x)
            return x
        return x&lt;/code&gt;&lt;/pre&gt;</description>
      <category>ML &amp;amp; DL/Deep Learning</category>
      <category>d-linear</category>
      <category>gru</category>
      <category>LSTM</category>
      <category>TCN</category>
      <category>time series forecasting</category>
      <category>transformer encoder</category>
      <category>모델 구현</category>
      <category>시계열</category>
      <category>시계열 예측</category>
      <category>예측</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/656</guid>
      <comments>https://geunuk.tistory.com/656#entry656comment</comments>
      <pubDate>Thu, 10 Oct 2024 15:07:45 +0900</pubDate>
    </item>
    <item>
      <title>코랩(Colab) 끊김 방지</title>
      <link>https://geunuk.tistory.com/655</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;F12 &amp;gt; console (콘솔) 창에 아래 코드 입력&lt;/p&gt;
&lt;pre id=&quot;code_1728519229435&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var startClickConnect = function startClickConnect(){
    var clickConnect = function clickConnect(){
        console.log(&quot;Connnect Clicked - Start&quot;);
        document.querySelector(&quot;#top-toolbar &amp;gt; colab-connect-button&quot;).shadowRoot.querySelector(&quot;#connect&quot;).click();
        console.log(&quot;Connnect Clicked - End&quot;); 
    };

    var intervalId = setInterval(clickConnect, 60000);

    var stopClickConnectHandler = function stopClickConnect() {
        console.log(&quot;Connnect Clicked Stopped - Start&quot;);
        clearInterval(intervalId);
        console.log(&quot;Connnect Clicked Stopped - End&quot;);
    };

    return stopClickConnectHandler;
};

var stopClickConnect = startClickConnect();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>끄적 끄적</category>
      <category>colab</category>
      <category>끊김</category>
      <category>런타임</category>
      <category>방지</category>
      <category>유지</category>
      <category>코랩</category>
      <author>욱근욱</author>
      <guid isPermaLink="true">https://geunuk.tistory.com/655</guid>
      <comments>https://geunuk.tistory.com/655#entry655comment</comments>
      <pubDate>Thu, 10 Oct 2024 09:13:52 +0900</pubDate>
    </item>
  </channel>
</rss>