<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>fblog</title>
    <link>https://falto.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 5 Apr 2026 20:31:08 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>falto</managingEditor>
    <item>
      <title>한국투자증권 websocket 응답 복호화하는 방법</title>
      <link>https://falto.tistory.com/618</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://apiportal.koreainvestment.com/apiservice-apiservice?/tryitout/H0GSCNI0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://apiportal.koreainvestment.com/apiservice-apiservice?/tryitout/H0GSCNI0&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1768965550517&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;KIS Developers&quot; data-og-description=&quot;한국투자증권 Open API 포탈&quot; data-og-host=&quot;apiportal.koreainvestment.com&quot; data-og-source-url=&quot;https://apiportal.koreainvestment.com/apiservice-apiservice?/tryitout/H0GSCNI0&quot; data-og-url=&quot;https://apiportal.koreainvestment.com/apiservice-apiservice?%2Ftryitout%2FH0GSCNI0=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/PgHBe/dJMb86OVM5o/3iRh9kMkXGdJuGy8pu4Nu0/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400&quot;&gt;&lt;a href=&quot;https://apiportal.koreainvestment.com/apiservice-apiservice?/tryitout/H0GSCNI0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://apiportal.koreainvestment.com/apiservice-apiservice?/tryitout/H0GSCNI0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/PgHBe/dJMb86OVM5o/3iRh9kMkXGdJuGy8pu4Nu0/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400');&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;KIS Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;한국투자증권 Open API 포탈&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;apiportal.koreainvestment.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;&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;/p&gt;
&lt;pre id=&quot;code_1768965627725&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;header&quot;: {
    &quot;approval_key&quot;: &quot;your key&quot;,
    &quot;tr_type&quot;: &quot;1&quot;,
    &quot;custtype&quot;: &quot;P&quot;,
    &quot;content-type&quot;: &quot;utf-8&quot;
  },
  &quot;body&quot;: {
    &quot;input&quot;: {
      &quot;tr_id&quot;: &quot;H0GSCNI0&quot;,
      &quot;tr_key&quot;: &quot;your hts id&quot;
    }
  }
}&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;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;/p&gt;
&lt;pre id=&quot;code_1768965695539&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{&quot;header&quot;:{&quot;tr_id&quot;:&quot;H0GSCNI0&quot;,&quot;tr_key&quot;:&quot;your hts id&quot;,&quot;encrypt&quot;:&quot;N&quot;},&quot;body&quot;:{&quot;rt_cd&quot;:&quot;0&quot;,&quot;msg_cd&quot;:&quot;OPSP0000&quot;,&quot;msg1&quot;:&quot;SUBSCRIBE SUCCESS&quot;,&quot;output&quot;:{&quot;iv&quot;:&quot;your iv&quot;,&quot;key&quot;:&quot;your key&quot;}}}&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;이때 iv와 key 값을 얻을 수 있으며, 향후 암호화된 응답을 복호화하는데에 쓰인다.&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;&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;/p&gt;
&lt;pre id=&quot;code_1768965769730&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1|H0GSCNI0|001|some base64 string&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;some base64 string을 복호화하기 위해선 아래와 같은 파이썬 코드를 이용하면 된다. (출처: &lt;a href=&quot;https://wikidocs.net/164065&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wikidocs.net/164065&lt;/a&gt; )&lt;/p&gt;
&lt;pre id=&quot;code_1768965845168&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from base64 import b64decode
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad

iv = &quot;your iv&quot;
key = &quot;your key&quot;
cipher_text = &quot;your base64 string&quot;


def aes_cbc_base64_dec(key: str, iv: str, cipher_text: str) -&amp;gt; str:
    &quot;&quot;&quot;
    :param key:  str type AES256 secret key value
    :param iv: str type AES256 Initialize Vector
    :param cipher_text: Base64 encoded AES256 str
    :return: Base64-AES256 decoded str
    &quot;&quot;&quot;
    cipher = AES.new(key.encode(&quot;utf-8&quot;), AES.MODE_CBC, iv.encode(&quot;utf-8&quot;))
    b64decoded = b64decode(cipher_text)
    padded_data = cipher.decrypt(b64decoded)
    b = unpad(padded_data, AES.block_size)
    ret = bytes.decode(b)
    return ret


result = aes_cbc_base64_dec(key, iv, cipher_text)
print(result)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 파이썬에서 bytes.decode의 encoding 기본값은 utf8이다.&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;&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;C#에서는 아래처럼 하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1768965919391&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp472
{
    internal static class Program
    {
        private static string F()
        {
            const string iv = &quot;your iv&quot;;
            const string key = &quot;your key&quot;;
            const string cipher_text = &quot;your base64 string&quot;;
            using (Aes cipher = Aes.Create())
            {
                cipher.Key = Encoding.UTF8.GetBytes(key);
                cipher.Mode = CipherMode.CBC;
                cipher.IV = Encoding.UTF8.GetBytes(iv);
                byte[] b64decoded = Convert.FromBase64String(cipher_text);
                using (ICryptoTransform decryptor = cipher.CreateDecryptor())
                {
                    using (MemoryStream memoryStream = new MemoryStream(b64decoded))
                    {
                        using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
                        {
                            byte[] buffer = new byte[b64decoded.Length + 15];
                            int size = cryptoStream.Read(buffer, 0, buffer.Length);
                            return Encoding.UTF8.GetString(buffer);
                        }
                    }
                }
            }
        }

        private static void Main(string[] args)
        {
            try
            {
                Console.WriteLine(F());
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>falto</author>
      <guid isPermaLink="true">https://falto.tistory.com/618</guid>
      <comments>https://falto.tistory.com/618#entry618comment</comments>
      <pubDate>Wed, 21 Jan 2026 12:27:05 +0900</pubDate>
    </item>
    <item>
      <title>Python smtplib 메일 전송</title>
      <link>https://falto.tistory.com/617</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;smtplib는 메일 전송을 하는 데에 사용할 수 있는 라이브러리다.&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;&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;네이버 메일의 경우 아래처럼 작성하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1767502228299&quot; style=&quot;background-color: #1c1e1f; color: #c1bcb4; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot; data-darkreader-inline-bgcolor=&quot;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;code&gt;import smtplib

HOST=&quot;smtp.naver.com&quot;
PORT=587
USER=&quot;YOUR_ID@naver.com&quot;
PASSWORD=&quot;YOUR_APP_PASSWORD&quot;
TO_ADDR=&quot;example@example.com&quot;
MSG=f&quot;From: {USER}\r\nTo: {TO_ADDR}\r\n\r\nHello, World!&quot;

with smtplib.SMTP(HOST, port=PORT) as smtp:
    smtp.set_debuglevel(1)
    smtp.starttls()
    smtp.login(USER, PASSWORD)
    smtp.sendmail(USER,TO_ADDR,MSG)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;YOUR_APP_PASSWORD에는 내 계정의 비밀번호가 아니라 애플리케이션 비밀번호를 따로 발급받아 사용해야 한다. 애플리케이션 비밀번호를 생성하는 방법은 아래 링크에 있다. 먼저 2단계 인증부터 설정해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://help.naver.com/service/5640/contents/8584?lang=ko&amp;amp;osType=COMMONOS&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://help.naver.com/service/5640/contents/8584?lang=ko&amp;amp;osType=COMMONOS&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1767502295406&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;애플리케이션 비밀번호 사용 방법 (아웃룩 등 2단계 인증 미지원 환경에서 로그인) : 회원정보 고&quot; data-og-description=&quot;아웃룩, 휴대전화 기본 메일앱, 캘린더앱 등 일부 애플리케이션은 2단계 인증을 지원하지 않습니다.미지원 환경에서는 먼저 비밀번호를 생성한 후 애플리케이션 화면에서 생성된 비밀번호를 입&quot; data-og-host=&quot;help.naver.com&quot; data-og-source-url=&quot;https://help.naver.com/service/5640/contents/8584?lang=ko&amp;amp;osType=COMMONOS&quot; data-og-url=&quot;https://help.naver.com/service/5640/contents/8584?lang=ko&amp;amp;osType=COMMONOS&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/GiPoA/hyZPP52PyO/ktDYKxbsw0OcUaPLIXku5K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/2rSVM/hyZPLo2RKU/oeCFvNR3nqFBv8YTeDOsr1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://help.naver.com/service/5640/contents/8584?lang=ko&amp;amp;osType=COMMONOS&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://help.naver.com/service/5640/contents/8584?lang=ko&amp;amp;osType=COMMONOS&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/GiPoA/hyZPP52PyO/ktDYKxbsw0OcUaPLIXku5K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/2rSVM/hyZPLo2RKU/oeCFvNR3nqFBv8YTeDOsr1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;애플리케이션 비밀번호 사용 방법 (아웃룩 등 2단계 인증 미지원 환경에서 로그인) : 회원정보 고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;아웃룩, 휴대전화 기본 메일앱, 캘린더앱 등 일부 애플리케이션은 2단계 인증을 지원하지 않습니다.미지원 환경에서는 먼저 비밀번호를 생성한 후 애플리케이션 화면에서 생성된 비밀번호를 입&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;help.naver.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;&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;메일플러그의 경우 아래처럼 작성하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1767502418679&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import smtplib

HOST=&quot;smtp.mail-server.kr&quot;
PORT=465
USER=&quot;YOUR_ID@YOUR_COMPANY.com&quot;
PASSWORD=&quot;YOUR_LOGIN_PASSWORD&quot;
TO_ADDR=&quot;example@example.com&quot;
MSG=f&quot;From: {USER}\r\nTo: {TO_ADDR}\r\n\r\nHello, World!&quot;

with smtplib.SMTP_SSL(HOST, port=PORT) as smtp:
    smtp.set_debuglevel(1)
    smtp.login(USER, PASSWORD)
    smtp.sendmail(USER,TO_ADDR,MSG)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메일플러그는 PASSWORD에 자신이 로그인할 때 사용하는 비밀번호를 그대로 넣으면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python</category>
      <author>falto</author>
      <guid isPermaLink="true">https://falto.tistory.com/617</guid>
      <comments>https://falto.tistory.com/617#entry617comment</comments>
      <pubDate>Sun, 4 Jan 2026 13:54:19 +0900</pubDate>
    </item>
    <item>
      <title>nohup 사용법</title>
      <link>https://falto.tistory.com/616</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nohup &amp;lt;command&amp;gt; 2&amp;gt;&amp;amp;1 &amp;gt;&amp;gt; log.txt &amp;amp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라고 입력하면, 표준 에러(2)를 표준 출력(1)으로 리다이렉트시키고, 그것을 log.txt에 append하여 실행한 command의 프로세스가 쉘 종료 뒤에도 계속 남아있게끔 해준다. 또한, echo $!를 하면 방금 nohup &amp;amp;으로 실행한 백그라운드 프로세스의 PID를 알아낼 수 있다. 이를 응용하면 아래와 같은 bash script를 작성할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1766067841747&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash

is_running=0

if [ -s pid.txt ];
then
 running_pid=`cat pid.txt`

 if ps -p $running_pid &amp;gt; /dev/null
 then
  is_running=1
 fi

fi

if [ a$1 == ak ];
then

 if [ $is_running == 0 ];
 then
  echo no running program found
 else
  kill $running_pid
  echo killed $running_pid
 fi

 exit 0
fi

if [ $is_running == 0 ];
then
 nohup sleep 10 2&amp;gt;&amp;amp;1 &amp;gt;&amp;gt; log.txt &amp;amp;
 echo $! &amp;gt; pid.txt
 echo program started on pid $!
else
 echo program is already running on pid $running_pid
fi&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;위 bash script 파일명을 nsleep이라 한다면...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;./nsleep을 입력하면 프로세스가 존재하지 않을 경우 sleep 10을 백그라운드에서 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;./nsleep k를 입력하면 프로세스가 존재할 경우 저장한 PID의 프로세스를 죽인다.&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;References&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;&lt;a href=&quot;https://stackoverflow.com/questions/3043978/how-to-check-if-a-process-id-pid-exists&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://stackoverflow.com/questions/3043978/how-to-check-if-a-process-id-pid-exists&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1766068239650&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;How to check if a process id (PID) exists&quot; data-og-description=&quot;In a bash script, I want to do the following (in pseudo-code): if [ a process exists with $PID ]; then kill $PID fi What's the appropriate expression for the conditional statement?&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/3043978/how-to-check-if-a-process-id-pid-exists&quot; data-og-url=&quot;https://stackoverflow.com/questions/3043978/how-to-check-if-a-process-id-pid-exists&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/4PjQk/hyZPsQoT9Q/GW1690sb6gYePhD0rQOZn1/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/3043978/how-to-check-if-a-process-id-pid-exists&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/3043978/how-to-check-if-a-process-id-pid-exists&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/4PjQk/hyZPsQoT9Q/GW1690sb6gYePhD0rQOZn1/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&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;How to check if a process id (PID) exists&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;In a bash script, I want to do the following (in pseudo-code): if [ a process exists with $PID ]; then kill $PID fi What's the appropriate expression for the conditional statement?&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://nayoungs.tistory.com/entry/Linux-%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0-%EC%99%80-nohup&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://nayoungs.tistory.com/entry/Linux-%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0-%EC%99%80-nohup&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1766068263416&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;[Linux] 백그라운드 실행하기 : &amp;amp;와 nohup&quot; data-og-description=&quot;리눅스 시스템에서 작업을 수행하다 보면, 긴 시간이 걸리는 명령어를 실행해야 할 때가 있다. 그러나 터미널을 닫거나 세션이 끊기면 작업이 종료되는 문제가 생길 수 있다. 이를 방지하기 위&quot; data-og-host=&quot;nayoungs.tistory.com&quot; data-og-source-url=&quot;https://nayoungs.tistory.com/entry/Linux-%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0-%EC%99%80-nohup&quot; data-og-url=&quot;https://nayoungs.tistory.com/entry/Linux-%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0-%EC%99%80-nohup&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kJS4i/hyZPqdZl1s/OdZAP5rOlTG8I2ywT5kar0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cqKS2I/hyZPAAS64q/dfl1srJ1qOnKvfZXUjRNeK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/jUce0/hyZPzaUNIo/AQJC67upOZEKkOrPTgjIr0/img.jpg?width=890&amp;amp;height=863&amp;amp;face=260_298_524_562&quot;&gt;&lt;a href=&quot;https://nayoungs.tistory.com/entry/Linux-%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0-%EC%99%80-nohup&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nayoungs.tistory.com/entry/Linux-%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0-%EC%99%80-nohup&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kJS4i/hyZPqdZl1s/OdZAP5rOlTG8I2ywT5kar0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cqKS2I/hyZPAAS64q/dfl1srJ1qOnKvfZXUjRNeK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/jUce0/hyZPzaUNIo/AQJC67upOZEKkOrPTgjIr0/img.jpg?width=890&amp;amp;height=863&amp;amp;face=260_298_524_562');&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;[Linux] 백그라운드 실행하기 : &amp;amp;와 nohup&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;리눅스 시스템에서 작업을 수행하다 보면, 긴 시간이 걸리는 명령어를 실행해야 할 때가 있다. 그러나 터미널을 닫거나 세션이 끊기면 작업이 종료되는 문제가 생길 수 있다. 이를 방지하기 위&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nayoungs.tistory.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;</description>
      <category>ubuntu</category>
      <author>falto</author>
      <guid isPermaLink="true">https://falto.tistory.com/616</guid>
      <comments>https://falto.tistory.com/616#entry616comment</comments>
      <pubDate>Thu, 18 Dec 2025 23:30:14 +0900</pubDate>
    </item>
    <item>
      <title>Merge sort 때문에 시험을 망쳤다.</title>
      <link>https://falto.tistory.com/615</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;C언어로 코딩하는 시험이었다. 과거 첫 번째 시험과 두 번째 시험 모두 100점을 받았기에, 세 번째 시험을 위해 별 준비를 안 해도 무리 없이 다 풀 수 있을 거라고 생각했다. 교수님이 정렬 알고리듬 구현이 필요하다고 말했지만 미래의 내가 백준으로 단련한 실력으로 알아서 어떻게든 하겠지 하고 준비를 안 했다. 이때 준비를 했어야 했는데... 그냥 강의 자료에 파일 입출력만 대충 훑어보고 자버렸다.&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;시험 시간은 약 2시간 30분 정도 주어졌다. 시험이 시작하고 문제지를 보니 문제는 총 세 문제였다. 어쩐지 오늘따라 머리가 좀 어지러운 것 같았다. 잠을 너무 늦게 잤나. 첫 문제는 구현하기 약간 까다로워서 건너뛰었다. 나중에 시간 남을 때 다시 돌아올 셈이었다.&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;두 번째 문제는 정렬이 필요한 문제였다. 문제에 시간 제한이나 시간 복잡도 제한은 없으니 정렬 알고리듬이 N log N에 돌든 제곱 시간에 돌든 점수에는 아무런 지장이 없었다. 하지만 나는 괜히 여유를 부리겠다고 더 효율적인 N log N에 도는 merge sort를 구현하려고 했다. 그런데 예상치 못한 버그가 자꾸 발생하면서 시간이 사르르 녹아내렸다. void 포인터 스왑하는 방법도 몰라서 typedef로 온몸비틀기하고, printf로 디버깅하고... 그러다 시간이 얼마 안 남아서 결국 merge sort를 중간에 폐기하고 제곱 시간에 도는 selection sort를 급하게 구현했다. selection sort도 여러 번 디버깅하면서 겨우겨우 완성했다. 그 쉽고 직관적인 selection sort를 구현할 때도 어이 없는 실수를 자꾸만 했다. i를 넣어야 하는 곳에 0을 넣는다든가, i와 j를 혼동한다든가 하는 것들 말이다. Selection sort도 제대로 구현 못 하는 정신 상태로 merge sort를 구현하려 했으니 될 리가 없었다. 결국 merge sort 하나 때문에 시험 시간의 반을 넘게 날려먹고 성공적으로 구현하지도 못 했다. 시간이 다 되어서 첫 문제와 마지막 문제는 반도 못 풀고, 두 번째 문제만 완벽하게 풀어서 마감했다.&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;시험 결과를 예상해보건대 아마 이번에는 반 평균 미만의 점수가 나올 것 같다. 하필 이번 시험에는 교수가 학생들의 부정행위 방지를 위해 시험 시작 때 자리를 바꾸도록 시켰는데, 그걸 시키고 나서 내 점수가 뚝 떨어졌을테니... 설마 교수가 날 부정행위로 100점 맞아온 학생으로 오해하진 않겠지?&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;그냥 아래 코드처럼 간단하게 구현할 걸 그랬다. 참고로 아래 C 소스 코드에 쓰인 정렬 알고리듬은 &lt;a href=&quot;https://arxiv.org/abs/2110.01111&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://arxiv.org/abs/2110.01111&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1764080984720&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;Is this the simplest (and most surprising) sorting algorithm ever?&quot; data-og-description=&quot;We present an extremely simple sorting algorithm. It may look like it is obviously wrong, but we prove that it is in fact correct. We compare it with other simple sorting algorithms, and analyse some of its curious properties.&quot; data-og-host=&quot;arxiv.org&quot; data-og-source-url=&quot;https://arxiv.org/abs/2110.01111&quot; data-og-url=&quot;https://arxiv.org/abs/2110.01111v1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/csU8FN/hyZOmOV6n5/kdhkD8BBbU6w3gI97WEf0k/img.png?width=1200&amp;amp;height=700&amp;amp;face=0_0_1200_700,https://scrap.kakaocdn.net/dn/JW42z/hyZOfcMbmQ/0KH3l9UEW16eEXzI2kLsDk/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/2110.01111&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://arxiv.org/abs/2110.01111&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/csU8FN/hyZOmOV6n5/kdhkD8BBbU6w3gI97WEf0k/img.png?width=1200&amp;amp;height=700&amp;amp;face=0_0_1200_700,https://scrap.kakaocdn.net/dn/JW42z/hyZOfcMbmQ/0KH3l9UEW16eEXzI2kLsDk/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&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;Is this the simplest (and most surprising) sorting algorithm ever?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;We present an extremely simple sorting algorithm. It may look like it is obviously wrong, but we prove that it is in fact correct. We compare it with other simple sorting algorithms, and analyse some of its curious properties.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;arxiv.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기 논문에 나온 알고리듬이다. 증명은 안 읽어봤지만 해보니까 정말 정렬이 되더라.&lt;/p&gt;
&lt;pre id=&quot;code_1764066832848&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;
#include&amp;lt;string.h&amp;gt;
#include&amp;lt;stdlib.h&amp;gt;


typedef struct _person{
	char name[99];
	int age;
	char sex;
}person;



// Source - https://stackoverflow.com/a/29596215
// Posted by Kerrek SB, modified by community. See post 'Timeline' for change history
// Retrieved 2025-11-25, License - CC BY-SA 3.0

void swap(void * a, void * b, size_t len)
{
    unsigned char *p=a, *q=b, tmp;
    for (size_t i = 0; i != len; ++i)
    {
        tmp = p[i];
        p[i] = q[i];
        q[i] = tmp;
    }
}


void sort(void*ptr,size_t count,size_t size, int (*comp)(const void*,const void*)){
	for(size_t i=0;i&amp;lt;count;i++)
	for(size_t j=0;j&amp;lt;count;j++)
	if(comp(ptr+i*size,ptr+j*size)&amp;lt;0)
	swap(ptr+i*size,ptr+j*size,size);
}


int cmp(const void*x,const void*y){
	return strcmp(((person*)x)-&amp;gt;name,((person*)y)-&amp;gt;name);
}


int main(){
	person people[3]={{&quot;John&quot;,20,'M'},{&quot;Bob&quot;,21,'F'},{&quot;Kate&quot;,19,'M'}};
	sort(people,3,sizeof(person),cmp);
	for(int i=0;i&amp;lt;3;i++){
		printf(&quot;%s &quot;,people[i].name);
	}
	return 0;
}&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;p data-ke-size=&quot;size16&quot;&gt;그래서 이번 일로 얻은 교훈은 무엇이나.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 자만하지 말자. 점수를 얻기 위해 최선을 다하자.&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;3. 유비무환. 준비를 빈틈없이 단단히 하자.&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;시험 전날 merge sort 구현 연습을 했으면 시험을 망칠 일이 없었을 것이고, 연습을 안 했다 하더라도 시험 중에 처음부터 selection sort 구현으로 방향을 잡았다면 이렇게까지 망하진 않았을 텐데. 많이 아쉽다. 시험이 끝난 직후 충격을 많이 먹었다. 시험 끝나고나서 점심 먹고 노트북으로 merge sort 구현을 하고 돌려봤는데 아주 얄밉게도 잘 되더라. 시험 때는 대체 뭐가 문제였던 거지.&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <author>falto</author>
      <guid isPermaLink="true">https://falto.tistory.com/615</guid>
      <comments>https://falto.tistory.com/615#entry615comment</comments>
      <pubDate>Tue, 25 Nov 2025 19:45:31 +0900</pubDate>
    </item>
    <item>
      <title>[.NET Framework 4.8.1] dnSpy로 dll 수정하기</title>
      <link>https://falto.tistory.com/614</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;목표:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 소스 코드가 실행되었을 때 창 제목에 asdf1234가 적혀있게 하기.&lt;/p&gt;
&lt;pre id=&quot;code_1759987912182&quot; class=&quot;cs&quot; style=&quot;background-color: #1c1e1f; color: #c1bcb4; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;csharp&quot; data-darkreader-inline-bgcolor=&quot;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WinForm481
{
    internal static class Program
    {
        [STAThread]
        static void Main()
        {
            Console.WriteLine(typeof(Form).Assembly.Location);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form());
        }
    }
}&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;창 제목의 기본값이 asdf1234가 되게 하려면 Form의 생성자를 수정해야 한다. 그러려면 우선 Form 클래스가 어디 경로의 dll에 정의되어있는지 알아내야 하는데, 소스 코드에 나와있듯이 typeof(Form).Assembly.Location이 이 경로를 나타낸다.&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;dnSpy는 dll을 디컴파일하는 기능이 있다. 또한, 디컴파일한 코드를 VS project로 변환해주는 기능도 있다. 하지만 이 기능을 사용하면 다시 컴파일이 안 되므로 무용지물이다... 직접 컴파일을 시도해보면 이런 이상한 오류들이 뜬다. 한두개도 아니고 엄청 많이.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RydAC/btsQ3h4UxjA/9iVjFrnDSwnae1nnevUWZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RydAC/btsQ3h4UxjA/9iVjFrnDSwnae1nnevUWZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RydAC/btsQ3h4UxjA/9iVjFrnDSwnae1nnevUWZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRydAC%2FbtsQ3h4UxjA%2F9iVjFrnDSwnae1nnevUWZK%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;881&quot; height=&quot;281&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;281&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;p data-ke-size=&quot;size16&quot;&gt;따라서 VS project로 변환하여 코드를 수정하고 다시 컴파일하는 전략은 쓰지 못한다.&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;dll의 복사본을 수정해주고 원본 dll 대신 새로 수정한 dll을 참조하는 전략으로 가보자.&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.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 dll의 복사본을 만들어서 프로젝트에 넣어준다. 혼동을 방지하기 위해 파일명도 바꿔준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;265&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MBKcU/btsQ3a5RyiI/19T8IyouFiW0m5VhiQz13k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MBKcU/btsQ3a5RyiI/19T8IyouFiW0m5VhiQz13k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MBKcU/btsQ3a5RyiI/19T8IyouFiW0m5VhiQz13k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMBKcU%2FbtsQ3a5RyiI%2F19T8IyouFiW0m5VhiQz13k%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;265&quot; height=&quot;139&quot; data-origin-width=&quot;265&quot; data-origin-height=&quot;139&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;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;dnSpy에서 생성자 부분을 수정해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H75Dv/btsQ2UB99Ov/5sEs2Mp5SZ0lubeXti1160/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H75Dv/btsQ2UB99Ov/5sEs2Mp5SZ0lubeXti1160/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H75Dv/btsQ2UB99Ov/5sEs2Mp5SZ0lubeXti1160/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH75Dv%2FbtsQ2UB99Ov%2F5sEs2Mp5SZ0lubeXti1160%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;656&quot; height=&quot;499&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;499&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;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;그 다음 Edit -&amp;gt; Edit Assembly... 를 클릭한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wsbxE/btsQ3flP36L/mhGRBuYvgQi1s0T3EZqblk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wsbxE/btsQ3flP36L/mhGRBuYvgQi1s0T3EZqblk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wsbxE/btsQ3flP36L/mhGRBuYvgQi1s0T3EZqblk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwsbxE%2FbtsQ3flP36L%2FmhGRBuYvgQi1s0T3EZqblk%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;495&quot; height=&quot;416&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Name을 아까 수정해준 파일명으로 바꿔준다. 어셈블리 편집하는 김에 Version도 다른 값으로 바꿔주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;주의: Public Key는 그대로 놔두어야 한다. 그렇지 않으면 나중에 프로젝트에서 invalid assembly public key라면서 컴파일이 안 될 수 있다.&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다 했으면 OK를 누른다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;File -&amp;gt; Save Module...을 클릭하고 OK를 눌러 모듈을 저장한다.&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;&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;5.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 프로젝트에서 References에 myforms를 추가하고 System.Windows.Forms를 제거한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EOY1B/btsQ3ktOLD1/IjTn4w6JplDAn34MlEUyL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EOY1B/btsQ3ktOLD1/IjTn4w6JplDAn34MlEUyL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EOY1B/btsQ3ktOLD1/IjTn4w6JplDAn34MlEUyL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEOY1B%2FbtsQ3ktOLD1%2FIjTn4w6JplDAn34MlEUyL0%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;303&quot; height=&quot;312&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;312&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;p data-ke-size=&quot;size16&quot;&gt;6.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일 후 실행해보면 System.Windows.Forms.Form 클래스에 대한 참조가 myforms.dll로 바뀌었음을 확인할 수 있다. 또한 창 제목도 asdf1234로 되어있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHaBS2/btsQ5j1wOlX/pa4fi1rblK9rx6vWmexon0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHaBS2/btsQ5j1wOlX/pa4fi1rblK9rx6vWmexon0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHaBS2/btsQ5j1wOlX/pa4fi1rblK9rx6vWmexon0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHaBS2%2FbtsQ5j1wOlX%2Fpa4fi1rblK9rx6vWmexon0%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;473&quot; height=&quot;348&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;348&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;p data-ke-size=&quot;size16&quot;&gt;끝.&lt;/p&gt;</description>
      <category>C#</category>
      <author>falto</author>
      <guid isPermaLink="true">https://falto.tistory.com/614</guid>
      <comments>https://falto.tistory.com/614#entry614comment</comments>
      <pubDate>Thu, 9 Oct 2025 14:56:47 +0900</pubDate>
    </item>
  </channel>
</rss>