<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>카루의 프로그래밍 연구소</title>
    <link>https://karupro.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 17 Jun 2026 16:55:13 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>카루-R</managingEditor>
    <image>
      <title>카루의 프로그래밍 연구소</title>
      <url>https://tistory1.daumcdn.net/tistory/3802872/attach/47b093bf9d8b4b1492352051ffddb21f</url>
      <link>https://karupro.tistory.com</link>
    </image>
    <item>
      <title>Python 고급 문법 4: async / await 비동기 프로그래밍</title>
      <link>https://karupro.tistory.com/133</link>
      <description>&lt;div id=&quot;SE-bbb2b230-72b0-4f2a-b4eb-73cc38fc2cd5&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-a65aa4f4-bbc7-49e7-8945-0d9805bc6e64&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;환영합니다, Rolling Ress의 카루입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c439fbb9-d373-4bd2-8df1-70365c627c0e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-92d47398-2357-4346-a5d6-9a1f66df061b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이번에는 비동기 프로그래밍입니다. 프로그래밍 언어마다 스레드를 지원하는 방법은 다르지만, 최근에는 async / await을 이용하여 비동기 프로그래밍을 지원하는 언어가 많아졌습니다. 이러한 언어들은 함수 선언 앞에 async를 붙이고, await을 통해 기다린다는 공통점이 있습니다. 파이썬 또한 3.5 버전부터 async / await을 지원합니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f4683d85-3920-40f2-8ede-ee0ee48eb017&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;동기 프로그래밍 (Synchronous)&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1776857540801&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import time

def make_coffee(name, delay):
    print(f&quot;[{name}] 커피 추출 시작...&quot;)
    time.sleep(delay)          # 일시 정지 -&amp;gt; 대기 상태
    print(f&quot;[{name}] 커피 완성!&quot;)

start = time.time()
make_coffee(&quot;아메리카노&quot;, 2)
make_coffee(&quot;카페라떼&quot;, 3)
print(f&quot;동기 방식 총 소요 시간: {time.time() - start:.1f}초&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2dc44e3a-4df6-4b0c-947a-e8f108ee3a46&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-64824468-6256-41db-a4f9-a85410c60ac7&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;비동기 프로그래밍의 단점은 설명하는 사람도 어렵고 이해하는 사람도 난해하다는 점입니다. 그래서, 우선 동기 프로그래밍에 대해서 알아볼 겁니다. 카페에서 음료를 주문하고 있습니다. 직원은 두 명이 있네요. 앞 사람은 아메리카노를 시켰는데, 저는 카페라떼를 시켰습니다. 그런데 두 명이서 아메리카노를 함께 만들고, 아메리카노가 완성되고 나서야 카페라떼를 만들기 시작하는 겁니다. 비효율의 극치가 따로 없죠.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-56e9a03c-78f9-4c6d-999d-2b7197b8880d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-af8f0ddc-fa50-4e22-b869-7490a1c0ddeb&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아메리카노 제작에 2초, 카페라떼 제작에 3초. 제가 카페라떼를 받기까지 5초의 시간이 걸렸습니다. 이걸 동시에 실행할 수 없을까요?&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-02f8b14e-975c-4a66-9d25-47d074efe7fc&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-73b9c16b-7989-4f0b-9540-28d67f61c032&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-b5b0a458-e8b7-4b01-89ab-bee61e03b0e5&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;비동기 프로그래밍 (Asynchronous)&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1776857556683&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import asyncio
import time

# async 함수: coroutine
async def make_coffee_async(name, delay):
    print(f&quot;[{name}] 커피 추출 시작...&quot;)
    # time.sleep() 대신 asyncio.sleep()
    # await: 제어권 넘기기
    await asyncio.sleep(delay) 
    print(f&quot;[{name}] 커피 완성!&quot;)

async def main():
    start = time.time()
    # asyncio.gather(): 여러 코루틴 동시에 작동
    await asyncio.gather(
        make_coffee_async(&quot;아메리카노&quot;, 2),
        make_coffee_async(&quot;카페라떼&quot;, 3)
    )
    print(f&quot;비동기 방식 총 소요 시간: {time.time() - start:.1f}초&quot;)

asyncio.run(main())&lt;/code&gt;&lt;/pre&gt;
&lt;div id=&quot;SE-6548fca5-ee01-4b6d-903e-f5dec7b5295c&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-3dd558cc-ece6-4fe5-8888-151c96f61c0c&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;함수 앞에 async를 붙이면 그 함수는 코루틴이 됩니다. 사실 async 키워드 자체는 큰 의미가 없다고 보아도 됩니다. async는 &lt;/span&gt;&lt;span&gt;&lt;b&gt;해당 함수 내에서 await 키워드를 사용할 수 있게 해주는 도구입니다. &lt;/b&gt;&lt;/span&gt;&lt;span&gt;async가 붙은 비동기 함수는 일반 함수처럼 그냥 호출할 수 없기 때문에, asyncio.run을 통해 이벤트 루프를 이용하여 실행해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-666de68a-818d-4746-b52a-b76655cc3707&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;async main()을 보겠습니다. 시간을 재기 시작하고 asyncio.gather를 사용하여 두 개의 함수(코루틴)를 동시에 호출합니다. 그럼 async make_coffee_async()가 호출됩니다. async 함수 내에서 실행 흐름을 잠시 멈추고 싶을 때는 time.sleep() 대신 await asyncio.sleep()을 이용해야 합니다. async 함수의 경우 함수를 단순히 호출하면 함수가 실행되지 않고 &lt;/span&gt;&lt;span&gt;&lt;b&gt;코루틴 객체만 반환됩니다. &lt;/b&gt;&lt;/span&gt;&lt;span&gt;await 키워드를 사용하여야 그 코루틴 객체를 실행하고, 함수가 반환할 때까지 기다릴 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776857571556&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import asyncio
import time

# 서버에 데이터를 요청하는 가상의 비동기 함수
async def fetch_user_info(user_id):
    print(f&quot;▶️ [유저 {user_id}] 정보 요청 시작...&quot;)
    await asyncio.sleep(1)  # 네트워크 지연 1초 가정
    
    # 작업이 끝나면 딕셔너리 데이터를 반환합니다.
    return {&quot;id&quot;: user_id, &quot;name&quot;: f&quot;사용자_{user_id}&quot;, &quot;status&quot;: &quot;정상&quot;}

async def main():
    print(&quot;=== 1. 단일 비동기 함수의 반환값 받기 ===&quot;)
    
    # 잘못된 코드: await를 안 쓰면 데이터가 아니라 '껍데기(코루틴)'가 들어옵니다.
    # bad_result = fetch_user_info(999) 
    # print(bad_result) # &amp;lt;coroutine object fetch_user_info at 0x...&amp;gt;
    
    # await를 써야만 진짜 반환값이 변수에 담깁니다.
    single_result = await fetch_user_info(777)
    print(f&quot;✅ 단일 반환값: {single_result['name']}님의 상태는 {single_result['status']}&quot;)
    print(&quot;\n&quot;)

    print(&quot;=== 2. 여러 비동기 함수의 반환값을 리스트로 한 번에 받기 ===&quot;)
    start_time = time.time()
    
    user_ids = [101, 102, 103, 104, 105]
    
    # 1. 실행할 비동기 작업(코루틴)들을 리스트로 모아둡니다.
    tasks = [fetch_user_info(uid) for uid in user_ids]
    
    # 2. asyncio.gather()에 묶어서 던지면, 동시에 실행된 후 
    #    결과값들이 '요청했던 순서 그대로' 리스트에 담겨서 반환됩니다.
    results = await asyncio.gather(*tasks)
    
    print(f&quot;\n✅ 동시 요청 완료! (소요 시간: {time.time() - start_time:.2f}초)&quot;)
    
    # 반환받은 결과(results)는 일반 리스트이므로 마음대로 다룰 수 있습니다.
    print(&quot;[최종 반환된 리스트 데이터]&quot;)
    for res in results:
        print(res)

asyncio.run(main())&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div id=&quot;ssp-adcontent-2&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-dfb3c98f-1b51-4be9-a5e2-bb9b3345a1bf&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/etDtJ7/dJMcabjFMil/3PGu0eoILH6nXIfMFruYKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/etDtJ7/dJMcabjFMil/3PGu0eoILH6nXIfMFruYKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/etDtJ7/dJMcabjFMil/3PGu0eoILH6nXIfMFruYKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FetDtJ7%2FdJMcabjFMil%2F3PGu0eoILH6nXIfMFruYKk%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;773&quot; height=&quot;353&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-630f1b4e-ea61-4cdf-b533-678e9d590cb0&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-5d15a097-a7ec-43d1-b0cb-a74ccef66030&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;단일 코루틴의 경우 await을 사용하여 결과값을 받아올 수 있으며, 여러 코루틴을 동시에 실행할 경우 gather를 통해 한 번에 값을 받아올 수 있습니다. 여기서 독특한 점은 결과값들이 실제 반환되는 순서와 상관 없이 요청한 순서대로 들어온다는 점입니다. 비동기 상황에서 마구잡이로 정렬이 틀어지는 걸 막을 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a37d6ffe-2ce6-4057-a4a4-50f0f3ecb1c7&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;하지만 왜 asyncio.gather를 써야 할까요? 단순히 await를 여러 번 쓰면 안 될까요?&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776857586519&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import asyncio
import time

async def boil_water():
    print(&quot;  물 끓이기 시작... (3초)&quot;)
    await asyncio.sleep(3)
    return &quot;끓은 물&quot;

async def chop_vegetables():
    print(&quot;  채소 썰기 시작... (2초)&quot;)
    await asyncio.sleep(2)
    return &quot;썰린 채소&quot;

async def main():
    start = time.time()
    
    # 잘못된 비동기 사용법 (사실상 동기)
    # 물이 다 끓을 때까지 3초간 멍하니 기다렸다가, 그제야 채소를 썰기 시작합니다.
    water = await boil_water() 
    veg = await chop_vegetables()
    
    print(f&quot;종료 시간: {time.time() - start:.1f}초&quot;)

asyncio.run(main())&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-7b48d3f4-7e9b-4c59-9946-16600fbd591b&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9VFlQ/dJMcabjFMij/9kxN7hTvLydtk27jbPWBX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9VFlQ/dJMcabjFMij/9kxN7hTvLydtk27jbPWBX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9VFlQ/dJMcabjFMij/9kxN7hTvLydtk27jbPWBX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9VFlQ%2FdJMcabjFMij%2F9kxN7hTvLydtk27jbPWBX1%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;410&quot; height=&quot;72&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-103da51a-0a81-40c9-b2b7-670d0815270f&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이렇게 &amp;lt; await + 함수호출() &amp;gt; 형태의 구문을 연속해서 써버리면 동기 프로그래밍과 다를 바가 없기 때문입니다. 함수를 호출하여 실행하고 그 결과값을 기다리므로, 한 번에 하나씩 실행하는 꼴이 되기 때문이죠. 그래서 아래와 같은 방식으로 task를 만들어 사용해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776857596527&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import asyncio
import time

async def boil_water():
    print(&quot;  물 끓이기 시작... (3초)&quot;)
    await asyncio.sleep(3)
    return &quot;끓은 물&quot;

async def chop_vegetables():
    print(&quot;  채소 썰기 시작... (2초)&quot;)
    await asyncio.sleep(2)
    return &quot;썰린 채소&quot;

async def main_with_task():
    start = time.time()
    
    # 두 개의 작업을 task로 만듦. 그리고 &quot;실행함&quot;.
    # 이때 await을 사용하지 않았으므로, 프로그램 흐름이 즉시 넘어감
    water_task = asyncio.create_task(boil_water())
    veg_task = asyncio.create_task(chop_vegetables())

    # 실행이 완료되었다면 값을 각각 받아옴.
    water = await water_task    # 얘가 먼저 끝나고
    veg = await veg_task        # 1초 뒤 얘가 끝남.
    
    print(f&quot;종료 시간: {time.time() - start:.1f}초&quot;)

asyncio.run(main_with_task())&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-700b796a-d427-454c-8622-fffcbf566ce0&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLlgiS/dJMcabjFMii/EvehKyiRUHpdqsSwHDtKg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLlgiS/dJMcabjFMii/EvehKyiRUHpdqsSwHDtKg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLlgiS/dJMcabjFMii/EvehKyiRUHpdqsSwHDtKg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLlgiS%2FdJMcabjFMii%2FEvehKyiRUHpdqsSwHDtKg0%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;74&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-01a48797-75d1-485a-a4d3-1a87a42f225d&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-beda73f0-63ac-4b13-87e4-19eef66b0bb4&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;'아니, 이 번에도 두 줄에 걸쳐서 await을 쓰잖아?'라고 생각하실 수도 있습니다. 하지만 자세히 보세요. create_task를 이용하여 task를 만들고, 그 task에 await을 걸었습니다. &lt;/span&gt;&lt;span&gt;&lt;b&gt;코루틴에 직접 await을 건 게 아닙니다. task로 변환된 코루틴에 await을 건 겁니다. &lt;/b&gt;&lt;/span&gt;&lt;span&gt;이렇게 하면 두 개의 코루틴이 백그라운드로 동시에 실행되어, 시간 단축 효과를 볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0bf60ea9-8026-45ae-9d90-d7335974b0d4&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-129c1b4c-0aa8-450b-a6e6-dd8eced86747&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;한참 위에서 사용한 asyncio.gather()는 내부적으로 &lt;/span&gt;&lt;span&gt;&lt;b&gt;create_task를 여러 번 호출해주는 도우미 함수입니다. &lt;/b&gt;&lt;/span&gt;&lt;span&gt;일괄 처리할 때는 gather()를 사용하여 여러 코루틴을 전달하는 것이 좋고, 세밀한 작업 순서 컨트롤이 필요하다면 create_task()를 이용하여 task 객체로 만든 뒤 제어하는 것이 좋습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Python</category>
      <author>카루-R</author>
      <guid isPermaLink="true">https://karupro.tistory.com/133</guid>
      <comments>https://karupro.tistory.com/133#entry133comment</comments>
      <pubDate>Wed, 22 Apr 2026 20:33:21 +0900</pubDate>
    </item>
    <item>
      <title>Python 고급 문법 3: with 블럭과 @contextmanager</title>
      <link>https://karupro.tistory.com/132</link>
      <description>&lt;div id=&quot;SE-b90d7032-3975-4dcc-8701-9ae89c1a70f6&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-29ca3e9b-b4b6-4ef2-880c-d021319fb3b6&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;환영합니다, Rolling Ress의 카루입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f5b08a24-1ae7-45ca-8319-a970eeb547e8&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-62cddf89-5e55-41c6-ae47-974acb220f4d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;첫 번째 글에서 with 블럭에 대해 소개한 적이 있습니다. 파일 입출력 등을 할 때, with 블럭을 사용하면 try ~ finally 구문을 번거롭게 사용할 필요 없이 자원 해제를 자동으로 해주는 편리한 구문이었죠. 사실 이것도 숨겨진 메서드가 자동으로 호출되는 트릭에 가깝습니다. C++의 소멸자, C#의 IDisposible.Dispose()와 비슷합니다. 파이썬에서는 __enter__()과 __exit__(ty, val, tb) 메서드로 with 문의 동작을 정의할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-13df79ac-b384-421c-95cc-4ba73fa21782&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-a1f3ae98-28db-4401-a8de-9a827e0a5412&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-95ba2cb9-b279-45e0-97b2-667af4a40df4&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;'with' Statement (with 문)&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1776853004882&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;f = open(&quot;data.txt&quot;, &quot;w&quot;)
try:
    f.write(&quot;Hello&quot;)
finally:
    f.close()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-72e35ad4-0811-4270-94fe-dcb1d0667c41&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;정리가 필요한 작업들이 있습니다. 대표적인 예시가 파일 입출력입니다. 파일을 열었으면 반드시 닫아주어야 합니다. 단순히 open()을 실행한 뒤 close()를 실행해도 될 것 같지만, 오류가 나서 프로그램의 제어 흐름이 달라진다면 파일이 닫히지 않을 수도 있습니다. 이를 예방하기 위해 try ~ finally로 파일을 반드시 닫도록 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776853014558&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;with open(&quot;data.txt&quot;, &quot;w&quot;) as f:
    f.write(&quot;Hello&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-dd95d1e6-83bc-4b50-9914-7b5d536a19ca&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-29a8ce7a-08ab-4b91-8741-0d83c243305d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;하지만 with 문을 사용한다면 close()를 명시적으로 호출할 필요가 없습니다. 이건 with 문이 자동으로 파일을 닫아주기 때문입니다. 하지만 어떻게 알고 파일을 닫아줄 수 있을까요?&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0586e0c4-baf7-43ca-a5bd-766c7ad66b7b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;컨텍스트 매니저(Context Manager)는 시작할 때 준비 작업을 하고, 끝날 때 뒷정리를 하는 작업을 직접 정의할 수 있게 해줍니다. 지난 시간에 Iterator 클래스와 Generator 함수를 배웠듯, 클래스를 이용하여 구현하는 방법과 제너레이터 함수를 이용하는 방법 두 가지가 존재합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776853035032&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import time

class Timer:
    def __init__(self, name):
        self.name = name

    def __enter__(self):
        print(f&quot;[{self.name}] 타이머 시작&quot;)
        self.start_time = time.time()
        return self.start_time      # with ~ as 뒤에 받을 값 (t)을 반환합니다.

    def __exit__(self, exc_type, exc_val, traceback):
        self.end_time = time.time()
        elapsed = self.end_time - self.start_time
        print(f&quot;[{self.name}] 타이머 종료 (소요 시간: {elapsed:.4f}s)&quot;)
        
        # 만약 에러가 발생했다면 exc_type에 에러 정보가 담깁니다.
        # return True를 하면 에러를 삼켜버리고(무시하고) 프로그램을 계속 실행시킵니다.

with Timer(&quot;데이터 크롤링&quot;) as t:
    print(&quot;...열심히 데이터를 수집하는 중...&quot;)
    time.sleep(1.5)  # 1.5초가 걸리는 작업이라고 가정
    print(&quot;...수집 완료!&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-acd295a9-1ff4-42b0-889e-9ceee8540adb&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lQoYL/dJMcafM8YLQ/fSexNt1oTKo4cmKp17Chy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lQoYL/dJMcafM8YLQ/fSexNt1oTKo4cmKp17Chy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lQoYL/dJMcafM8YLQ/fSexNt1oTKo4cmKp17Chy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlQoYL%2FdJMcafM8YLQ%2FfSexNt1oTKo4cmKp17Chy1%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;773&quot; height=&quot;170&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div id=&quot;ssp-adcontent-2&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-a9a8a527-fce0-406c-b05c-f659e91e0ab6&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-b5003825-a919-46cd-a933-96c37a0bafc0&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;t = Timer(&quot;데이터 크롤링&quot;) 대신 with 문을 사용하여 타이머를 구현하였습니다. 명시적으로 __enter__() 또는 __exit__()을 호출하지 않아도 with문의 시작점과 종료점에서 자동으로 함수를 호출해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e4d513c9-e7e6-451a-afbc-56eee31b42d1&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d63d252b-36a7-426c-b5aa-ed358954a557&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;t에는 Timer 객체가 들어갑니다. 이후 __enter__()가 실행되며 start_time을 기록하고, with 문 내부의 로직이 실행됩니다. with문을 벗어날 때 __exit__()이 실행되고 소요 시간을 계산하여 출력합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ba8d9e59-22fb-488c-9b09-bca251e01436&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-546f3285-5c11-495a-9ad0-d7bd7ae9079d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;하지만 함수로도 충분히 가능한 일을 클래스까지 도입해서 만들 필요가 있을까요? 그래서, 클래스가 필요 없는 제너레이터 방식을 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5355e8b2-0bb9-4b98-b536-54cb60ed2e74&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-b5d886bc-5328-4ccc-8f9d-ee87b6b67b0b&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-82d600cc-dea0-4e6b-bf7c-0a3131a4263e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;@contextmanager&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d872135b-7668-4f61-94b8-0f208c4fd4ce&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;데코레이터는 이미 배웠습니다. 함수를 변경하지 않고 부가기능을 추가해 준다고 했죠. 파이썬 기본 라이브러리의 데코레이터는 예약어처럼 생각하고 사용하여도 무방합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776853053228&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from contextlib import contextmanager
import time

@contextmanager
def timer(name):
    print(f&quot;[{name}] 타이머 시작&quot;) # 1. 시작 (준비 작업) : __enter__ 역할
    start_time = time.time()
    try:
        yield start_time       # 2. 값 전달 및 대기 (as 뒤로 넘어갈 값)
    finally:
        end_time = time.time() # 3. 끝 (뒷정리 작업) : __exit__ 역할
        elapsed = end_time - start_time
        print(f&quot;[{name}] 타이머 종료 (소요 시간: {elapsed:.4f}s)&quot;)

with timer(&quot;데이터 크롤링&quot;) as t:
    print(&quot;...열심히 데이터를 수집하는 중...&quot;)
    time.sleep(1.5)  # 1.5초가 걸리는 작업이라고 가정
    print(&quot;...수집 완료!&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f9aa1556-39c7-4b0c-8a4c-93370248d9df&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2vnNJ/dJMcafzAJzC/OdtOL9dj9HPzNcvt4ydsVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2vnNJ/dJMcafzAJzC/OdtOL9dj9HPzNcvt4ydsVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2vnNJ/dJMcafzAJzC/OdtOL9dj9HPzNcvt4ydsVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2vnNJ%2FdJMcafzAJzC%2FOdtOL9dj9HPzNcvt4ydsVk%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;773&quot; height=&quot;170&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;170&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-c1e348a9-3479-4297-aa32-840275010330&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-6661db3e-1406-4449-8fb9-00f3eec5998a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;코드가 조금 더 간결해집니다. 약간 헷갈릴 수 있는데, yield를 기준으로 위쪽은 __enter__, 아래쪽은 __exit__으로 볼 수 있습니다. yield를 하는 부분이 t로 들어가 with 문 내부에서 사용할 수 있고, with 문을 나오면 yield 아래 부분이 실행되는 겁니다. 매번 try ~ finally를 길게 쓰는 대신 컨텍스트 매니저를 잘 만들어두면 실수를 차단하고 코드를 깔끔하게 유지할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div id=&quot;ssp-adcontent&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Python</category>
      <author>카루-R</author>
      <guid isPermaLink="true">https://karupro.tistory.com/132</guid>
      <comments>https://karupro.tistory.com/132#entry132comment</comments>
      <pubDate>Wed, 22 Apr 2026 19:17:38 +0900</pubDate>
    </item>
    <item>
      <title>Python 고급 문법 2: 이터레이터(iterator)와 제너레이터(generator)</title>
      <link>https://karupro.tistory.com/131</link>
      <description>&lt;div id=&quot;SE-e289fe93-6da6-43c4-9a9b-00cbef88de7f&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-391cd3fb-418f-4c39-8af3-a3ff209bc314&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;환영합니다, Rolling Ress의 카루입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f8370da7-9d99-4425-89ab-6c17992ee1a3&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-af7abec3-b251-42fa-9677-20cc670c48aa&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이번에는 파이썬의 고급 문법 중 이터레이터와 제너레이터에 대해 알아보겠습니다. 이 두 개념은 반복문에서 많이 사용되므로 for문에 대해 정확하게 숙지하고 오셔야 아래 내용을 이해하기 편하실 겁니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9e3be243-29b4-4b87-ab3c-a1977ced4fce&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-3b9ad51a-0259-40ad-ab72-0b5764cde010&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-bb83af52-cda6-449a-a73e-f953cdf0c894&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Iterator(반복자, 이터레이터)&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-b09f539f-4f87-46fa-9403-2881c8006d54&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-722ea1df-acdf-4dce-8d10-ac1536f165e4&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Python의 반복자(이하 이터레이터)는 C++의 반복자와 비슷한 개념으로 보아도 됩니다. 값을 한 번에 하나씩, 순서대로 꺼내주는 객체를 이터레이터라고 부릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-01ff31ec-c3d4-4b29-acef-c29a4059f079&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;Iterable(반복 가능한 객체): 리스트(list), 튜플(tuple), 문자열(str), 딕셔너리(dict)와 같이 데이터가 여러 개 모여 있는 객체로, 이터레이터를 만들어낼 수 있습니다. 정확히는 &lt;/span&gt;&lt;span&gt;&lt;b&gt;내부에 __iter__ 메서드를 가지고 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;Iterator(이터레이터): Iterable 객체에서 값을 하나씩 꺼내주는 도구입니다. 값을 꺼내는 __next__ 메서드를 가지고 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1776833192957&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;numbers = [10, 20, 30]  # numbers는 Iterable(반복 가능한 객체)입니다.

for num in numbers: # 우리가 흔히 썼던 for문이지만...
    print(num)

# 실제로는 아래와 같은 과정을 거칩니다.
iterator = iter(numbers)  # 1. Iterable에서 이터레이터를 꺼냅니다.

print(next(iterator))  # 2. 첫 번째 값을 꺼냅니다. -&amp;gt; 10
print(next(iterator))  # 3. 두 번째 값을 꺼냅니다. -&amp;gt; 20
print(next(iterator))  # 4. 세 번째 값을 꺼냅니다. -&amp;gt; 30

# print(next(iterator)) # 5. 더 꺼낼 게 없으면 StopIteration 에러가 납니다!
# for 문은 이 에러가 발생하면 알아서 반복을 종료하는 것입니다.&lt;/code&gt;&lt;/pre&gt;
&lt;div id=&quot;SE-f39e6c4c-c48b-483f-bb0e-8b0598c14517&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;SE-5cd52f1a-1721-4fd2-b9b8-397acdb6357c&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-b369d2ea-2327-4aba-8209-ea4991ba8d46&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;코드를 하나씩 살펴보겠습니다. 우선 numbers는 세 개의 정수를 가진 리스트입니다. 리스트는 반복 가능한 객체(iterable)입니다. for문을 통해 출력할 수도 있지만, 이터레이터를 이용해 직접 출력해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3dce7d63-b5c6-4517-a4ad-2e335e5fae5c&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0742ae74-9269-4862-afd8-bc16cb19a485&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;iter()는 iterable 객체 내부의 __iter__() 메서드를 호출하여 이터레이터를 받아옵니다. 즉, iterator 변수 안에는 이터레이터가 들어있습니다. 이제부턴 이 이터레이터를 사용하여 작업할 겁니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ca176025-60db-474a-9a55-38ee72bc3230&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c4b20087-1871-4b94-82ee-580cc18aeb94&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;next() 함수는 내부적으로 매개변수의 __next__()를 호출합니다. 여기선 iterator 변수를 가지고 작업하므로, iterator.__next__()를 호출합니다. next() 함수를 호출할 때마다 앞에서부터 값을 하나씩 꺼내게 되며, 더 이상 꺼낼 값이 없으면 StopIteration 예외가 발생합니다. &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div id=&quot;ssp-adcontent-1&quot;&gt;
&lt;pre id=&quot;code_1776833208053&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class TicketMachine:    
    def __init__(self, limit):
        self.current = 1    # 현재 발급할 번호 (상태를 기억함)
        self.limit = limit  # 발급할 최대 번호

    def __iter__(self):
        # for 문 같은 곳에서 iter()를 호출하면 자기 자신을 내어줍니다.
        return self

    def __next__(self):
        # next()를 호출할 때마다 실행됩니다.
        if self.current &amp;lt;= self.limit:
            ticket_number = self.current
            self.current += 1  # 다음 번호를 위해 1 증가시킴 (상태 변경)
            return f&quot;대기번호 {ticket_number}번&quot;
        else:
            # 한도에 도달하면 표가 떨어졌다는 신호를 보냅니다.
            raise StopIteration

machine = TicketMachine(5) # 5번까지만 표를 주는 기계 생성

print(&quot;=== 수동 출력 ===&quot;)
print(next(machine)) # 대기번호 1번
print(next(machine)) # 대기번호 2번

print(&quot;=== for문 출력 ===&quot;)
for ticket in machine:
    print(ticket)    # 대기번호 3, 4, 5번&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-3dde8cf1-1e66-4908-9f49-019f5492e3a6&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-a8553dbd-6465-4a14-ad20-c78a0419da2b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이터레이터를 직접 만들 수도 있습니다. 기본적으로 __iter__ (자기 자신을 반환), __next__ (다음 값을 꺼냄) 이렇게 두 개의 메서드를 보유해야 합니다. __iter__에는 자기 자신을 반환하는 코드만 있으면 되며, __next__는 현재 요소를 반환하고 만약 더 이상 반환할 내용이 없다면 StopIteration 예외를 발생시키면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776833218875&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from time import sleep

class Natural:    
    def __init__(self):
        self.current = 1

    def __iter__(self):
        return self

    def __next__(self):
        c = self.current
        self.current += 1
        return c

n = Natural() # 자연수의 집합
for i in n:
    print(i)
    sleep(0.1)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-086e5bca-c602-4cd0-bd94-eb836c8d731d&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-5e1b5aa1-a480-44de-8fde-604f6a6f2d80&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이런 식으로 사용하면 마치 무한집합처럼 동작하는 코드를 만들 수 있습니다. 분명히 for문을 통해 반복하고 있는데, 저는 리스트를 선언하지 않았습니다. 설령 리스트를 선언한다고 해도 크기가 무한대인 리스트를 선언할 수는 없습니다. 하지만 이터레이터를 이용하면 실시간으로 다음 값을 계산해서 1개만 반환해도 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c31ec96a-3e88-4884-bc5f-5f56ded22900&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-614fffc9-2074-434d-86f6-b4a0513404e9&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이터레이터는 메모리 효율성에서 장점이 많지만, 클래스를 선언해야 하므로 불편합니다. 그래서 제너레이터가 등장합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-74b49a02-211c-4ed8-9368-01e6b39e3019&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-28c4b07f-2e21-4b8d-9a51-f2073640f376&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-f844632d-1f0c-453c-a6fd-c85b8eb3a223&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Generator(제너레이터)&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d5299015-42b9-4fa9-ad91-ce699bc788aa&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-952d8b35-d1b4-4e7e-80fa-194ca8b3c84e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;제너레이터는 클래스 없이 함수만으로 이터레이터를 만듭니다. __iter__, __next__같은 메서드를 직접 정의할 필요가 없습니다. &lt;/span&gt;&lt;span&gt;&lt;b&gt;yield&lt;/b&gt;&lt;/span&gt;&lt;span&gt;라는 키워드만 알면 됩니다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5578aed4-0b1c-4732-a62a-3ffcd2d5d6b0&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-89b81a28-6bb0-4598-bcc0-d8286f755d77&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;yield는 return과 같이 함수에서 값을 반환하는 키워드입니다. return이 함수를 완전히 종료하고 값을 반환한다면, yield는 &lt;/span&gt;&lt;span&gt;&lt;b&gt;함수를 일시정지한 뒤 값을 반환하며, 다시 호출되면 멈췄던 부분부터 실행합니다.&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 이 점이 가장 큰 차이점입니다. 만약 일시정지+값 반환이라는 부분에서 __next__가 떠오르셨다면, 감이 좋으신 겁니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-783767f8-b213-4445-959e-365569086fac&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d6e36c84-84c3-4e27-ac96-5d0a9d5c2a43&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;앞서 작성한 번호표 기계 프로그램을 제너레이터를 이용하여 다시 써보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div id=&quot;ssp-adcontent-2&quot;&gt;
&lt;pre id=&quot;code_1776833232473&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def ticket_generator(limit):
    current = 1
    while current &amp;lt;= limit:
        yield f&quot;대기번호 {current}번&quot;  # 값을 던져주고 대기하기
        
        # 다음 next()가 호출되면 여기서부터 다시 시작하여 current를 1 증가시킴
        current += 1 

machine = ticket_generator(5)

for ticket in machine:
    print(ticket)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-bb8629d6-47ac-4fde-bff3-fe57faa1f9df&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-624c42cf-a218-4afc-ad52-1c8e0c029c6f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;코드가 간결해졌습니다. yield를 쓰면 이 함수는 즉시 실행되지 않고, 제너레이터 타입만 반환합니다. machine에는 제너레이터가 들어가게 됩니다. 함수를 yield 부분까지 실행하려면 &lt;/span&gt;&lt;span&gt;&lt;b&gt;next(machine)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;을 이용하여 다음 값을 받아오면 됩니다. 마찬가지로 반환할 값이 더 이상 없으면(뒤에 yield가 없다면) StopIteration 예외가 발생합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776833243350&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from time import sleep

def natural():
    n = 1
    while True:
        yield n
        n += 1

n = natural() # 자연수의 집합
for i in n:
    print(i)
    sleep(0.1)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-3d0411ef-930c-4e0a-a112-05ce52afe517&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-77669718-8627-4a59-b659-4e3f010965eb&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이렇게 무한집합을 간단하게 정의할 수도 있습니다. 파이썬 첫 글에서 잠깐 설명했던 내용이기도 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b8ec84a3-7028-4d9c-bb74-0aeaf911563a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-560bc9f7-cbaa-4677-874d-7fd212bf7bd4&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-ca9b2a71-5f37-4236-8f4d-08b3a88fa24e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Generator Expression&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1776833256888&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1. 리스트 컴프리헨션 (대괄호 사용)
list_comp = [x**2 for x in range(1, 6)]
print(list_comp)       # 출력: [1, 4, 9, 16, 25]
print(type(list_comp)) # 출력: &amp;lt;class 'list'&amp;gt;


# 2. 제너레이터 표현식 (소괄호 사용)
gen_expr = (x**2 for x in range(1, 6))
print(gen_expr)        # 출력: &amp;lt;generator object &amp;lt;genexpr&amp;gt; at 0x...&amp;gt;
print(type(gen_expr))  # 출력: &amp;lt;class 'generator'&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2690dacf-7d29-4db9-922a-0063db3f1e2a&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-d4cacda7-671e-4b1e-b35d-03557d51f57d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;list comprehension은 마치 집합의 조건제시법처럼 리스트를 생성할 수 있는 방법입니다. 여기서 대괄호를 소괄호로 바꿔주기만 하면 제너레이터 표현식이 됩니다. 위 코드는 1부터 5까지의 숫자를 제곱하는 코드입니다. list_comp의 경우 이미 값이 다 계산되어 메모리에 저장되기 때문에 그대로 출력이 됩니다. 반면 gen_expr은 next()가 호출될 때 값이 계산되는 제너레이터이기에 값이 바로 출력되지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776833268596&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys

# 1천만 개의 숫자를 담는 리스트와 제너레이터 생성
list_comp = [x for x in range(10000000)]
gen_expr  = (x for x in range(10000000))

# 두 객체가 차지하는 메모리 용량(Byte) 확인
print(f&quot;리스트 메모리: {sys.getsizeof(list_comp):,} 바이트&quot;)  
print(f&quot;제너레이터 메모리: {sys.getsizeof(gen_expr):,} 바이트&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-c588b3f8-68e2-489c-b236-5ae85fa5b23c&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l98nQ/dJMcahc405s/9YMkDouwuaFBjXxKvoPstK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l98nQ/dJMcahc405s/9YMkDouwuaFBjXxKvoPstK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l98nQ/dJMcahc405s/9YMkDouwuaFBjXxKvoPstK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl98nQ%2FdJMcahc405s%2F9YMkDouwuaFBjXxKvoPstK%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;773&quot; height=&quot;138&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f5ea8b58-d9cf-4e6a-958d-004899a71fe5&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;p id=&quot;SE-af860dc5-570a-4752-9685-fe95a1ae46c7&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;실시간으로 값을 계산하기 때문에 메모리도 적게 차지합니다. 대용량 데이터 처리 시 메모리를 적게 쓸 수 있는 것이 제너레이터의 장점입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776833280888&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1부터 1000까지의 숫자 중 짝수만 골라서 모두 더하고 싶을 때

# X 나쁜 예: 리스트를 메모리에 굳이 만들었다가 합을 구하고 버림
total_bad = sum([x for x in range(1, 1001) if x % 2 == 0])

# O 좋은 예: 제너레이터 표현식으로 값을 하나씩 뽑으면서 바로 더함
total_good = sum(x for x in range(1, 1001) if x % 2 == 0)

print(total_good) # 250500&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-369a7175-9a06-4722-855e-5069b7e50a30&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-d73b3b4f-e138-44a7-bf44-e4aad0d12e52&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;특히 sum, max, min 등 파이썬 내장 함수와 사용할 때 진가를 발휘합니다. total_good을 보면 sum 함수의 인수로 제너레이터 표현식을 사용합니다. &lt;/span&gt;&lt;span&gt;원래는 sum((x for ...))과 같이 작성해야 하지만, 소괄호가 겹치면 하나를 생략할 수 있습니다. 표현식으로 생성한 데이터를 여러 번 읽을 필요가 없다면, 다시 말해 &lt;/span&gt;&lt;span&gt;&lt;b&gt;처음부터 끝까지 딱 한 번만 순서대로 읽고 버려도 된다면&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 제너레이터 표현식을 사용하는 것이 좋습니다. Lazy evaluation을 통해 시간을 절약할 수 있고, 메모리 사용량도 줄일 수 있기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Python</category>
      <author>카루-R</author>
      <guid isPermaLink="true">https://karupro.tistory.com/131</guid>
      <comments>https://karupro.tistory.com/131#entry131comment</comments>
      <pubDate>Wed, 22 Apr 2026 13:48:08 +0900</pubDate>
    </item>
    <item>
      <title>Python 고급 문법 1: 함수객체(Functor), 클로저(Closure)와 데코레이터(Decorator)</title>
      <link>https://karupro.tistory.com/130</link>
      <description>&lt;div id=&quot;SE-1fbcd9a5-24a7-4231-9b1e-c29f41fbf062&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-4a1a82a9-076c-43d3-8260-a494d546a597&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;환영합니다, Rolling Ress의 카루입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f49620c1-3c7d-44f6-b6cd-8936b44cfdc7&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f68fb026-98dd-44e4-9d4c-192512e3e844&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Python 첫 글 마지막에 Decoration에 대해 쓰겠다고 했는데, 몇 년이 지나서야 쓰네요. 이번에는 파이썬의 강력한 기능 중 하나인 &lt;/span&gt;&lt;span&gt;&lt;b&gt;데코레이터&lt;/b&gt;&lt;/span&gt;&lt;span&gt;에 대해 설명하며, 사전지식으로 펑터와 클로저에 대해서도 다루겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-80718586-2f7b-4853-a480-ab68a1ab139f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d3e21732-7558-4b90-a83d-876eee4152ee&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-c382f167-c587-4a85-99dc-0d13f38abc70&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Functor(함수객체, 펑터)&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-e91dbbaa-9827-4a1e-abdd-1a0cc3b3cd86&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-c0ec75b0-0fc0-4c37-9102-ae3b11eaf4f7&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;함수객체란 &lt;/span&gt;&lt;span&gt;&lt;b&gt;객체를 함수처럼 쓸 수 있게 만든 것&lt;/b&gt;&lt;/span&gt;&lt;span&gt;입니다. 일반적인 함수와 달리 클래스의 내부 변수를 통해 상태를 저장할 수 있는 점이 큰 차이점입니다. C++에서 operator()을 이용하여 함수객체를 정의했다면, 파이썬에서는 동일한 기능을 수행하는 __call__()을 정의하여 함수객체를 만들 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-560822f2-7565-485f-bbee-c7898fe5cbad&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;체이닝에 대해 알아보겠습니다. 합성함수 h(g(f(x)))가 있을 때, 실제 함수의 실행 순서는 f, g, h입니다. 조금 더 직관적으로 표기할 수는 없을까요? 우리가 읽는 순서대로 f-g-h를 순서대로 표기하는 방법이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776832989892&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Chain:
    def __init__(self, v): self.v = v
    def __call__(self, f): return Chain(f(self.v))
    def __repr__(self): return str(self.v)

# 내장 메서드(str.strip, str.upper)와 람다를 한 줄로 체이닝
result = Chain(&quot;  python  &quot;)(str.strip)(str.upper)(lambda x: x + &quot; IS FUN!&quot;)

print(result) # 출력: PYTHON IS FUN!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-06fb2651-2cc0-42e1-be90-e3fa380f06bc&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-e6cc0753-41c7-4e3d-aaa7-894b042001b8&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;코드가 좀 난해하죠. 그렇지만 이해하면 쉽습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e8b447d2-e8f2-47f5-a70f-2ab79c2b143b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ea68f231-85db-4e88-8aea-4be738d0e0b0&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1. Chain(&quot;&lt;/span&gt;&lt;span&gt; python &quot;)이 호출되어 Chain 타입의 이름 없는 임시객체 A가 생성되고, 내부 v에는 &quot; python &quot;이 저장됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b0e6cc69-de1b-4cd1-8fc7-988a958fbb64&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2. A(str.strip)을 통해 임시객체 A는 str.strip(v)를 생성합니다. 이때 Chain 타입의 이름 없는 임시객체 B가 생성되고, 내부 v에는 &quot;python&quot;이 저장됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f88ef6c0-826d-462c-9d0a-480e1c767176&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3. B(str.strip)을 통해 임시객체 B는 str.upper(v)를 생성합니다. 이때 Chain 타입의 이름 없는 임시객체 C가 생성되고, 내부 v에는 &quot;PYTHON&quot;이 저장됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e34d52e2-c9ac-4380-8e52-d8dbe43220f8&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;4. C(lambda x: x + &quot; IS FUN!&quot;)을 통해 임시객체 C는 람다식이 적용된 v값을 생성합니다. 이때 Chain 타입의 이름 없는 임시객체 D가 생성되고, 내부 v에는 &quot;PYTHON IS FUN!&quot;이 저장됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-28ff5adb-1696-4a5f-a0e7-9f698208cb86&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;5. 임시객체 D가 result에 저장됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-881aff73-b41e-4517-889a-3b78521b314d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;6. D의 __repr__ 함수가 실행되어 v를 str형으로 반환하여 출력합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8ba453ab-d4bf-4eb8-a8e6-7de63941806f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;만약 펑터가 없었다면 아래와 같이 써야 했겠죠.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776833000966&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;raw_data = &quot;  python  &quot;

# 주의: 괄호 안쪽부터 시작해 오른쪽에서 왼쪽으로 거꾸로 읽어야 합니다.
result = (lambda x: x + &quot; IS FUN!&quot;)(str.upper(str.strip(raw_data)))

print(result) # PYTHON IS FUN!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-9d6e9727-fd09-42cc-83e7-4ab9eaca3abd&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-30e2d92b-bc3b-45df-a9a8-2242b5db983f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;경우에 따라 이게 더 편할 수도 있겠지만, 코드가 길어지면 이쪽이 더 난해해집니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-1acb948b-f6b6-46fe-aae3-828c6229eeba&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-1ceb25de-3123-4622-98fb-22a97a57110c&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-10ff2b6d-8bf6-4757-88ce-b77895d78a68&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Closure(클로저)&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-cfd5422b-6992-4dd3-80e7-5631325bd855&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-03239e53-4c92-49fc-8596-66e925f5dc7d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;클로저는 &lt;/span&gt;&lt;span&gt;&lt;b&gt;상태를 가지는 함수&lt;/b&gt;&lt;/span&gt;&lt;span&gt;라고 이해하면 쉽습니다. 쉽게 말해, 생성될 당시의 상황을 기억하는 함수입니다. 사실 비슷한 개념을 방금 봤죠. 함수객체도 멤버 변수를 이용해 상태를 기억할 수 있었으니까요. 펑터의 편리한 버전이 클로저라고 보시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div id=&quot;ssp-adcontent-1&quot;&gt;
&lt;pre id=&quot;code_1776833013616&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def adder(a):
  def wrapper(b):
    return a + b # a는 adder의 변수
  return wrapper # wrapper 함수는 객체이므로, 반환할 수 있다.

add2 = adder(2)
print(add2(2)) # 2 + 2 = 4

add5 = adder(5)
print(add5(3)) # 5 + 3 = 8
# print(add5(10))의 결과는 얼마일까요?&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-df43d7e5-8192-42c8-a1ad-d7d66a859a0c&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-5c8fa0b1-35cf-4601-8a45-4e428a9c9ed9&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;adder 함수는 단지 내부의 wrapper 함수를 반환합니다. add2 = adder(2)를 통해 add2에는 a = 2인 wrapper 함수가 통으로 들어가게 됩니다. 무언가 이상하지 않나요? &lt;/span&gt;&lt;span&gt;&lt;b&gt;adder 함수는 이미 종료되었는데, wrapper 함수는 add2에 남아 계속 살아있고 adder함수의 지역변수인 a는 2의 값을 계속 갖고 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 이게 바로 클로저입니다. 함수가 생성될 당시의 상황(a = 2)을 기억하는 함수죠.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5c17c3ba-7f7e-4f48-8a37-25d299883c1c&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-32522c57-2def-4401-a102-1607101b07c7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-cfa31033-5119-4d7d-8887-a1cd4b2a86a1&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Decorator&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-64dedf02-8e65-44dd-89a2-ff44f7a6d8e8&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이제 데코레이터를 봅시다. 함수의 시작과 끝, 혹은 둘 중 하나에 특정한 작업을 넣고 싶다고 가정합니다. 여기서는 시작과 끝에 &quot;시작&quot;, &quot;끝&quot;을 출력하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776833029634&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def trace(f):
    def wrapper():
        print(f.__name__, ' 시작')
        f()
        print(f.__name__, ' 끝')
    return wrapper
 
def hello():
    print('&amp;lt; hello &amp;gt;')
 
def world():
    print('&amp;lt; world &amp;gt;')
 
trace_hello = trace(hello)
trace_hello()

trace_world = trace(world)
trace_world()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-596e3fc3-ab51-4b50-b4d6-1c61eddd09fe&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-8768efad-8eca-4e91-be3a-a40d99d4c677&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;여기서 클로저가 보입니다. 이번에는 변수를 저장하지 않고, 매개변수인 함수 f를 상태로 저장했습니다. trace에 함수를 담아 객체를 생성하면, trace 객체는 이 함수를 실행할 준비가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-5da341af-95a2-4878-8777-fcf5e0e2c3da&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;209&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boSBAu/dJMcajhCRHk/L55F7phcAV2aGzR2Fzx0Rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boSBAu/dJMcajhCRHk/L55F7phcAV2aGzR2Fzx0Rk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boSBAu/dJMcajhCRHk/L55F7phcAV2aGzR2Fzx0Rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboSBAu%2FdJMcajhCRHk%2FL55F7phcAV2aGzR2Fzx0Rk%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;773&quot; height=&quot;209&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;209&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f99b12a3-7414-4366-8634-e5de12ca27d7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;즉, wrapper 함수에서 f()의 앞뒤에 특정한 동작을 일으키는 문장을 작성하면 함수 실행 전후에 해당 코드를 실행할 수 있습니다. 하지만 모든 함수를 이렇게 객체로 만들어서 사용하기는 귀찮죠. 그럴 때 @을 활용한 데코레이터 문법을 씁니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776833040024&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def trace(f):
    def wrapper():
        print(f.__name__, ' 시작')
        f()
        print(f.__name__, ' 끝')
    return wrapper

@trace
def hello():
    print('&amp;lt; hello &amp;gt;')
 
@trace
def world():
    print('&amp;lt; world &amp;gt;')
 
hello()
world()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-037d11a8-8acf-4e12-8331-f310214802a7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;데코레이터로 실행할 함수 위에 @&amp;lt;데코레이터이름&amp;gt;을 작성해주면 끝입니다. 실행 결과는 위와 동일합니다. 이렇게 하면 &lt;/span&gt;&lt;span&gt;&lt;b&gt;기존 hello, world 함수의 동작을 수정하지 않으면서 새로운 기능을 추가할 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776833056572&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import time

# 실행 시간을 측정하는 데코레이터
def timer(func):
    # *args, **kwargs를 넣으면 어떤 인자를 가진 함수든 모두 받을 수 있습니다.
    def wrapper(*args, **kwargs):
        start_time = time.time()       # 시작 시간 기록
        result = func(*args, **kwargs) # 원래 함수 실행
        end_time = time.time()         # 종료 시간 기록
        print(f&quot;[{func.__name__}] 실행 시간: {end_time - start_time:.4f}초&quot;)
        return result                  # 원래 함수의 반환값을 그대로 돌려줌
    return wrapper

@timer
def count_numbers(limit):
    total = 0
    for i in range(limit):
        total += i
    return total

@timer
def make_sleep():
    time.sleep(1)
    print(&quot;충분히 쉬었습니다.&quot;)

# 함수 실행
count_numbers(10000000)
make_sleep()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-93479c79-c9e8-4a66-a972-2eee677dd054&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-749c9722-a944-42ac-9767-3a46acfd0571&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;위처럼 작성하면 timer 데코레이터를 이용해 count_numbers, make_sleep 함수의 실행 시간을 측정하여 표시할 수 있습니다. 기능이 필요 없다면 단순히 @timer를 제거하면 원래 함수의 구현대로 사용할 수 있습니다. 반대로 새로운 함수를 만들었는데, 시간 측정을 하고 싶다면? 그 함수 위에 @timer를 추가해주면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e2280a4c-68e2-4977-b3c1-b125b69b7f50&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;파이썬에서는 static 메서드를 정의할 수 있는 키워드가 없는데, 데코레이터를 이용하여 동일하게 구현할 수 있습니다. 아래는 파이썬의 내장 데코레이터 @staticmethod의 사용법입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776833075968&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MathUtils:
    @staticmethod
    def add(a, b):
        # self를 받지 않습니다! 클래스의 상태와 무관하게 작동합니다.
        return a + b
        
    @staticmethod
    def is_even(number):
        return number % 2 == 0

# 객체를 생성(MathUtils())하지 않고, 클래스 이름에서 바로 꺼내 씁니다.
print(MathUtils.add(10, 20))    # 출력: 30
print(MathUtils.is_even(4))     # 출력: True&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-909ede08-07ae-4abb-9372-f96600c34761&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 경우, 마치 @staticmethod가 키워드처럼 동작한다고 볼 수도 있습니다. 그렇게 이해해도 문제 없으며, 오히려 그 편이 더 직관적입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776833086138&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Person:
    def __init__(self, name, age):
        self.name = name
        self._age = age  # 실제 데이터는 '_age'에 숨겨둡니다.

    # 1. Getter
    @property
    def age(self):
        print(&quot;Getter 호출: 나이를 조회합니다.&quot;)
        return self._age

    # 2. Setter
    @age.setter
    def age(self, value):
        print(f&quot;Setter 호출: 나이를 {value}(으)로 변경 시도합니다.&quot;)
        if value &amp;lt; 0:
            raise ValueError(&quot;오류: 나이는 음수가 될 수 없습니다!&quot;)
        self._age = value

user = Person(&quot;홍길동&quot;, 20)

# 값 읽기 (Getter 작동)
print(user.age)  # 출력: Getter 호출: 나이를 조회합니다. -&amp;gt; 20

# 값 쓰기 (Setter 작동 - 정상적인 값)
user.age = 25  # 출력: Setter 호출: 나이를 25(으)로 변경 시도합니다.
print(user.age) # 25

# 값 쓰기 (Setter 작동 - 잘못된 값 필터링)
# user.age = -5  # ValueError: 오류: 나이는 음수가 될 수 없습니다! 발생&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-864f2499-72d8-4899-8ceb-8fb66d10e51a&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-82456a0e-e25f-4474-a942-587bf8031152&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;C#에서의 프로퍼티와 같은 사용도 가능합니다. 단, @property만 사용하면 읽기 전용이 됩니다. @프로퍼티이름.setter를 사용해야 값을 수정할 수 있습니다. 프로퍼티를 사용하면 그냥 변수를 사용할 때에 비해 입출력에 조건을 걸 수 있고, 여러 변수를 조합하여 새로운 읽기 전용 프로퍼티를 만드는 등 유연한 사용이 가능해집니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Python</category>
      <author>카루-R</author>
      <guid isPermaLink="true">https://karupro.tistory.com/130</guid>
      <comments>https://karupro.tistory.com/130#entry130comment</comments>
      <pubDate>Wed, 22 Apr 2026 13:44:49 +0900</pubDate>
    </item>
    <item>
      <title>Ubuntu에서 NginX로 HTTPS 서버를 만들어보자</title>
      <link>https://karupro.tistory.com/129</link>
      <description>&lt;div id=&quot;SE-c1db5165-44bd-4628-9fac-9030a35408fd&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2855a784-36c8-47bd-aa35-0add443d113d&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-f6bf45ae-8d78-499b-a369-8e5aac8fc19d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;환영합니다, Rolling Ress의 카루입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4149d14a-7108-4b53-8a11-8e93f70e2d19&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; Ubuntu에서 NginX를 사용하여 웹 서버를 구성하는 방법을 알아보겠습니다. 사용한 OS는 Ubuntu 24.04 LTS입니다. 우리가 웹 페이지를 만들고 싶다면 웹 페이지를 보여주는 컴퓨터(=서버)가 한 대 있을 것이고, 그 컴퓨터에서는 접속자(=클라이언트)에게 화면을 그려서 표시하고 상호작용해야 할 겁니다. 사용자에게 화면을 표시하고 상호작용하는 일, 이것이 바로 웹 서버 프로그램이 하는 일입니다. 주로 &lt;/span&gt;&lt;span&gt;&lt;b&gt;아파치(Apache)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;, NginX 등이 있는데 여기선 NginX를 사용하겠습니다. 가벼우면서도 강력해서 좋아요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772632519185&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt update &amp;amp;&amp;amp; sudo apt install nginx -y
$ sudo systemctl enable --now nginx&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div id=&quot;ssp-adcontent-1&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-dab0577b-f729-413f-8a59-875dfede4de0&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tb7sF/dJMcacbaZc7/Zes1Bm8R1RNiRJiU6wIHGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tb7sF/dJMcacbaZc7/Zes1Bm8R1RNiRJiU6wIHGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tb7sF/dJMcacbaZc7/Zes1Bm8R1RNiRJiU6wIHGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftb7sF%2FdJMcacbaZc7%2FZes1Bm8R1RNiRJiU6wIHGk%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;773&quot; height=&quot;335&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-89e5bc71-4ee5-4d1e-92d2-e54fa10e410d&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-d193062b-544e-46b9-98c1-9e1f9f3fc8c2&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이후 브라우저를 켜서 localhost 또는 127.0.0.1로 접속해보면 페이지가 하나 뜰 겁니다. 이 페이지는 /var/www/html 안에 있는 html 파일입니다. 이제 이 파일을 수정하거나, 기존에 만들어둔 페이지를 가져와 이 폴더로 옮겨야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d2ef3ffe-d2ec-4bf6-b17c-8730c4ebbb8b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b586631d-c85b-4eee-ba55-265ca65d1788&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그 전에, 제가 사용하는 환경에서는 homepage라는 그룹에 속한 사람들이 홈페이지를 제작하므로 권한을 좀 변경해주겠습니다. 다른 분들은 넘어가시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772632532187&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo chgrp -R homepage /var/www/html
$ sudo chmod -R 775 /var/www/html
$ sudo chmod g+s /var/www/html&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f64d233a-53fc-4bea-b543-1677d0404cff&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 id=&quot;SE-66b0c19f-a14c-42f6-b0e3-54d4007e81c2&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;HTTPS 설정&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-9b4ed454-3910-4fc5-87d3-15adc0a2db48&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; HTTPS란 HTTP에 TLS/SSL 암호화가 적용된 보안 프로토콜입니다. 이제는 HTTP 사이트에만 들어가도 크롬에서 경고 표시를 할 정도로 HTTPS는 선택이 아닌 필수가 되었습니다. HTTPS 연결을 위해서는 우리 사이트는 안전하다는 인증서가 필요한데, Let's Encrypt의 Certbot을 사용하여 인증서를 만들어봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772632545747&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt install certbot python3-certbot-nginx -y
$ sudo nano /etc/nginx/sites-available/&amp;lt;별칭&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-1246d7d3-f0f9-4a1e-bc0e-4b8cf056395d&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-ef65fce2-03bb-45c0-b136-36241283802a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;default에 해도 되는데, 사이트를 어떤 걸 만들지 몰라서 따로 설정파일을 만들었습니다. 여기선 rollingress라고 합시다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div id=&quot;ssp-adcontent-2&quot;&gt;
&lt;pre id=&quot;code_1772632589240&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;server {
        server_name www.rollingress.com;

        root /var/www/html;
        index index.html;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-366fc80e-0823-43f0-a0f3-bb541a370274&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;여기서는 도메인이 필요합니다. 내가 소유하고 있는 도메인이 있다면 도메인을 넣어줍니다. root에는 index.html 파일이 들어있는 폴더를 지정해줍니다. 환경에 (홈 디렉토리에서 git clone을 한 경우) 따라 /home에 있을 수도 있습니다. 마지막으로 index.html이 진입점이라는 것까지 정의해주면 끝납니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772632600464&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo nginx -t # 여기서 오류가 나면 문법 에러가 발생한 겁니다.
$ sudo systemctl reload nginx&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2dc08ca3-a85c-4d98-9282-785737e9f8af&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;NginX 파일의 문법 오류를 검사한 뒤, 서비스를 다시 시작합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772632608534&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo certbot --nginx -d &amp;lt;사이트 이름&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-46287bf7-7978-4cca-8dd9-dbcdab4d6960&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;자, 이제 Certbot이 알아서 내 사이트의 인증서를 발급하게 합니다. 이렇게 하면 /etc/nginx/sites-available/rollingress에 몇 줄이 추가됩니다. SSL 연결 및 80 -&amp;gt; 443 리다이렉션 과정입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772632622732&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo ln -s /etc/nginx/sites-available/rollingress /etc/nginx/sites-enabled/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d79da004-799d-4155-a047-b89635061acf&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-c7ca4a71-ef19-4f31-85d7-5d97ea273a43&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;마지막으로, 바로가기(심볼릭 링크)를 통해 sites-enabled에 등록해두어 NginX가 우리 사이트를 알아보고 표시할 수 있게 해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-1026570b-de96-41da-a850-77a10b0656f0&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f0d28160-2b82-4f8e-805c-68a2a36de875&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 id=&quot;SE-daf28714-9c54-4bf4-ae32-985b49fae6d2&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;인증서 갱신&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-42e05e2c-8adc-4867-a2e7-c3193d03530b&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 인증서는 90일 동안만 유효합니다. 그렇지만 Certbot은 이 모든 걸 자동화해주기 때문에, 90일이 지나면 인증서를 갱신해줄 수 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772632639472&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo systemctl status certbot.timer
● certbot.timer - Run certbot twice daily
     Loaded: loaded (/usr/lib/systemd/system/certbot.timer; enabled; preset: enabled)
     Active: active (waiting) since Fri 2026-02-20 20:26:17 KST; 3h 42min ago
    Trigger: Sat 2026-02-21 01:16:00 KST; 1h 7min left
   Triggers: ● certbot.service

Feb 20 20:26:17 UBUNTU-Server systemd[1]: Started certbot.timer - Run certbot twice daily.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-921485af-31ba-4c2d-ae59-1b0d4b60ab9c&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-656c6b60-6693-49c8-a176-f7f8c0be336c&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;위 명령어를 입력하여 확인해보면 Certbot 타이머가 정상적으로 동작함을 확인할 수 있습니다. 여러분만의 웹 서버를 구축하신 걸 축하드립니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Linux</category>
      <author>카루-R</author>
      <guid isPermaLink="true">https://karupro.tistory.com/129</guid>
      <comments>https://karupro.tistory.com/129#entry129comment</comments>
      <pubDate>Wed, 4 Mar 2026 22:57:30 +0900</pubDate>
    </item>
    <item>
      <title>Arch Linux 설치 가이드 4: 개발 환경 설정하기</title>
      <link>https://karupro.tistory.com/128</link>
      <description>&lt;div id=&quot;SE-443179d7-b555-4ac3-8517-3616ac5b4bf6&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-e091d931-1440-413f-9766-2b411a0c0161&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-3836eddd-924f-4c5b-abba-2583cc7d5e2f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;환영합니다, Rolling Ress의 카루입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b7f4d06c-65cf-441b-9e09-cad7238e70c8&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-111999aa-5953-4015-89b7-e3944d9087bf&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1년만에 다시 쓰는 아치 리눅스 글입니다. 그 사이 저도 리눅스에 대해 많은 것들을 공부하고, 특히 골칫거리였던 Wayland 등과 사투를 벌였네요. 저도 잊기 전에, 글로 기록해두어야겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-785534cc-8754-4fe0-a0ff-427030a90725&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2004e6f2-5f23-4a7e-8f90-df85561ad999&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;개발 프로그램 설치 및 설정&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;프로그래밍 언어별 설정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;SE-b62a72fc-3c4d-48ac-a16c-af481a8ee75c&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-441fb255-8eef-4c73-8028-6b769984d7f2&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-c0b3dbe9-4320-4d5c-8d61-45da3ed16c18&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 id=&quot;SE-c79866c2-5579-4e56-8038-d06fb1425b60&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;개발 프로그램 설치 및 설정&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-90fa713c-21f0-47c4-9b38-cdf09fae9672&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-d4a1203c-4306-453b-b24e-6dbe5e6e9d17&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-504b4926-dd97-4242-8e0e-03edb5e0b7f8&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;1. nano 하이라이팅&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1772632066928&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo nano /etc/nanorc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1772632075414&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## To include most of the existing syntax definitions, you can do:
include &quot;/usr/share/nano/*.nanorc&quot;
include &quot;/usr/share/nano/extra/*.nanorc&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;div id=&quot;SE-3ea08765-bf41-495b-937d-fd24cb56b755&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-e73fa4f5-db66-44de-aa3a-020438c3d4cf&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 다른 배포판은 nano의 구문 강조가 기본으로 켜져 있지만, 아치리눅스는 그렇지 않습니다. 위 주석을 찾은 뒤, 주석 밑에 두 줄을 추가해주시면 됩니다. 한 줄은 그냥 주석 처리만 되어 있으므로 주석만 풀어주시면 되고, 아래 줄은 직접 추가해주어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c2cdee02-b417-4a8a-a1c3-2cf5f03d4286&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5bbcf6ea-dbcc-43bc-aaeb-03e2ba79dd4e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; vim의 경우 자동으로 highlighting을 지원하기 때문에 해당 작업이 필요하지 않습니다. 다른 배포판과 다르게 vi와 vim이 별개의 프로그램이니 꼭 vim으로 실행하시기 바랍니다. (보통 vi -&amp;gt; vim으로 alias하여 많이 사용합니다)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7a2a4b8c-fc81-4f3c-bc44-612ba2a897fd&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-40fa64f1-ab36-4282-a17f-3658dfcd7657&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;2. vscode&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1772632089158&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ yay -S visual-studio-code-bin&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2f9c6f42-5f13-4400-8cff-d4645f6eb85b&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-2703c729-65b8-4c19-a628-b1346dcbdfcb&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;vscode 자체는 위와 같이 설치가 가능하지만, wayland에서 사용하기 위해선 code-flags.conf를 설정해주어야 합니다. 여기에 관한 글은 (2)를 참고하세요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b850f7a0-3eb0-4caa-ab9c-cf0db1a1d291&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a11cebb2-3475-4108-a77b-ad79834c9787&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;3. anaconda&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772632107493&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ curl -O https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh
$ bash Anaconda3-2024.06-1-Linux-x86_64.sh    # 마지막에서 yes를 입력하고 나가주세요
$ conda config --set auto_activate_base false&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-ea8cb84e-2044-4004-b9f7-e25bf463c71e&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-c0dd1a8f-7960-41c8-ae2f-590fdd913c2a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;AUR에 python-conda와 anaconda 같은 패키지가 있긴 하나, 둘 다 설치가 안 되고 말썽을 부립니다. 이런 경우엔 어쩔 수 없이 공식 사이트에서 받아 설치해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-628696a7-537a-4163-81b6-e37bbc8ae5dc&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6b146694-26e1-43b4-bcb1-c65087958de0&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 참고로 conda가 최근에 업데이트 되며 libmamba를 사용하도록 바뀌었는데, 구버전을 사용하는 경우 여기서 오류가 생길 수 있습니다. 가능하면 conda를 삭제했다가 새로 설치하시기 바라며, 그럴 수 없으신 분들은 수동으로 mamba 관련 툴을 설치하셔야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8e8c8c58-7e12-4885-bfbe-291126a4131c&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-87afd930-6a20-486f-afb2-2e95588484fd&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-b6c3801d-4d75-4883-b359-dd60576a37c5&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 id=&quot;SE-e079c984-3a72-4050-a4a0-c17d9ccab18d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;프로그래밍 언어별 설정&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-4e233582-0fd0-4a79-b3e9-e32adc180763&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-50f3bd31-4227-481c-9bcd-3467b5c97873&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a86caaec-a6c8-4c27-ab9c-93a7cf730ee6&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;1. C/C++&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9b553c31-d6c2-4eef-bf3b-28a051e71201&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 달리 설정할 건 없습니다. 어차피 AUR 설치 과정에서도 gcc와 g++을 마구 활용하기 때문인데... 혹시라도 없다면 간단하게 설치하실 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772632127201&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S gcc gcc-libs boost boost-libs&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-1683397b-3ec9-4883-9067-5a7f2cbcc227&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-6930a724-5b3f-4eb5-9629-dee250f37e75&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;2. C# / VB.NET / F#&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-137f680c-5367-4a5e-ae70-8f52472319e7&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; .NET이 통합되었죠. 더 이상 .NET Core 등으로 나뉘지 않고 .NET으로 일원화되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772632137241&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S dotnet-sdk dotnet-runtime 
$ sudo pacman -S aspnet-runtime # ASP.NET 구동시&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-19456d1b-13ef-45d6-8dde-8de80fe744dd&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-6778f357-0fe6-4359-ac3a-cfb1fe794a40&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;3. node.js&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772632145755&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S nodejs npm&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div id=&quot;ssp-adcontent-2&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-fb072ee6-cf7e-4b00-a561-b885c4a53d6b&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-d3ac9f1d-2c5c-4daf-ac42-0bd34333b501&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; npm은 공식 레포에 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f67acb0a-912f-407b-99b3-5968a996aae8&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0669a61d-5809-4550-8e8d-f9c7128e25ba&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;4. Java&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-09e4cc47-6d0d-4ef3-83d4-09926471bc59&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 아치는 기본적으로 OpenJDK만을 지원합니다. Oracle JDK는 AUR에서 받으실 수 있어요. 그리고, intellij도 설치 가능합니다. 커뮤니티 버전은 공식 레포에 있고, Ultimate 버전은 AUR에 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772632159011&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S jdk{,21}-openjdk
$ yay -S jdk              # oracle jdk
$ sudo pacman -S intellij-idea-community-edition{,jre}
$ yay -S intellij-idea-ultimate-edition
$ archlinux-java status&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-c5fb6374-5e82-4a11-baad-a9eb2bf2adb5&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-0b4e95e4-3dbd-4562-8c7a-90c9f47c47f1&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- IntelliJ의 경우 현재 jre 패키지가 없으면 실행되지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-82e1cda4-d126-4193-a3fc-955bc0a13a34&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- archlinux-java는 현재 아치 시스템에서 설치된 모든 Java 환경을 보여줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-63931db8-ed48-4a5f-a6c4-28d5cc3dcc24&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;5. Python&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772632167227&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S python{,-pip} 
$ pip install numpy # 오류!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-335e0269-e9b4-401d-aa17-9eb14bf9cb79&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; Python의 경우 위에서 설정한 아나콘다를 쓰시겠지만, 가상환경 없이(!) 쓰시겠다면 신경 써야 할 게 많습니다. pip을 통해 패키지를 설치하려고 하면 아래와 같은 경고 문구가 나오기 때문이에요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772632185065&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;error: externally-managed-environment

&amp;times; This environment is externally managed
╰─&amp;gt; To install Python packages system-wide, try 'pacman -S
    python-xyz', where xyz is the package you are trying to
    install.
    
    If you wish to install a non-Arch-packaged Python package,
    create a virtual environment using 'python -m venv path/to/venv'.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip.
    
    If you wish to install a non-Arch packaged Python application,
    it may be easiest to use 'pipx install xyz', which will manage a
    virtual environment for you. Make sure you have python-pipx
    installed via pacman.

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2f05daa5-7907-482a-9524-b8b20ee0655f&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 패키지들 버전이 꼬이는 걸 막고자 나온 장치로 보이는데... EXTERNALLY_MANAGED 파일을 지워버리는 방법이 있고 pip에 옵션을 주는 방법이 있습니다. &lt;/span&gt;&lt;span&gt;&lt;b&gt;다만 이 두 방법 모두 추천하지 않습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772632232498&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ mkdir ~/.config/pip
$ echo &quot;[global]&quot; &amp;gt;&amp;gt; ~/.config/pip/pip.conf
$ echo &quot;break-system-packages = true&quot; &amp;gt;&amp;gt; !$&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-bc6900bb-f642-470d-a679-d84353fa7688&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-3a7c0919-59c9-4432-87a8-33b5eb5d890a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 정석적인 방법은 이렇게 제한을 우회하는 게 아니라 아치에서 기본으로 제공하는 패키지를 이용하는 겁니다. 쉽게 말하면 아래와 같아요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772632246417&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ pip install numpy             # 오류! externally-managed-environment
$ sudo pacman -S python-numpy   # OK&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f264fc30-5464-4fac-ac35-49797a05afb1&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-65362706-bcca-44ac-98ff-014f2862bc02&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; Pytorch와 같은 패키지도 설치할 수 있습니다. AVX2를 지원하는 CPU를 사용하거나(opt) CUDA를 지원하는 GPU를 사용하는 경우(cuda) 해당 하드웨어에 최적화된 Pytorch를 설치할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b5627eae-9ba9-44bd-82c0-07070b0a9cef&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-fb274f3e-a86b-42e4-af52-1a48455c6f6d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;6. Android 개발환경&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772632258150&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S android-tools        # fastboot, adb 등
$ yay -S android-sdk-platform-tools   # 기타 다른 platform-tools가 필요한 경우
$ yay -S android-studio&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-6b103cec-1a66-4d6b-a5cd-5d24cd939ae1&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-2181883e-94df-4cba-b4f1-8af8589a60ae&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;일반적인 &quot;개발자 모드&quot;를 사용하기 위해선 android-tools를 통해 adb, fastboot을 사용할 수 있습니다. 이 외에 AUR에서 android-emulator 및 android-x86-system-image-28 등 에뮬레이터와 시스템 이미지를 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Linux</category>
      <author>카루-R</author>
      <guid isPermaLink="true">https://karupro.tistory.com/128</guid>
      <comments>https://karupro.tistory.com/128#entry128comment</comments>
      <pubDate>Wed, 4 Mar 2026 22:51:16 +0900</pubDate>
    </item>
    <item>
      <title>Arch Linux 설치 가이드 3: LTS 커널과 기타 설정 마무리</title>
      <link>https://karupro.tistory.com/127</link>
      <description>&lt;div id=&quot;SE-d6530637-c0cc-4832-b364-c91fa8d9eeb1&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-8cb43bad-bd90-4ca7-81d5-fb538e0088b7&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;환영합니다, Rolling Ress의 카루입니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-b0741eef-ea8a-4c20-921b-77b05b85d08b&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-a537a51a-b478-45eb-aec2-c911f6728ea9&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-fa7ddef5-2a98-4ac6-8e2a-0661e0f9b755&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아치리눅스 설치가 모두 끝났죠. 이제는 시스템을 좀 더 편리하게 사용하고, 안정화하기 위한 작업들을 진행하도록 하겠습니다. 꼭 필요하진 않지만, 개개인에 따라 충분히 유용할 수 있는 기능들입니다. 천천히 보면서 자신에게 맞는 설정을 적용해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-98c55469-245e-4a99-bfea-5d94c72ac933&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6aafd843-287b-4aba-bc56-2261a98fee0d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;LTS 커널 설치&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;유용한 프로그램 설치&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;기타 설정 및 프로그램&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;유용한 설정들&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;SE-fb5c1e09-2dfe-47bf-a290-551f2fedc9ca&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-92d3259f-7cfe-4f99-9284-371b140a12fd&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 id=&quot;SE-4abc3a63-ea48-4404-9767-8eb0ebb5aba4&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;LTS 커널 설정&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-ff43e9dc-6602-4a88-b5e3-be0ec340a345&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;459&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7HwZE/btsJSd1Qa4S/eVEhaQb0qMfA0tmIBRTAuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7HwZE/btsJSd1Qa4S/eVEhaQb0qMfA0tmIBRTAuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7HwZE/btsJSd1Qa4S/eVEhaQb0qMfA0tmIBRTAuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7HwZE%2FbtsJSd1Qa4S%2FeVEhaQb0qMfA0tmIBRTAuk%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;773&quot; height=&quot;459&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;459&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-043be8f6-ce05-47a7-a22b-64b95cf2d587&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-fdebb8cc-672e-47fd-9dd2-0948924ef19d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://kernel.org&quot;&gt;https://kernel.org&lt;/a&gt;&lt;/span&gt;&lt;span&gt; 은 리눅스 커널을 모아둔 곳입니다. 대부분의 배포판들은 리눅스 커널을 가져다가 커스텀하거나 해서 사용하죠. 아치의 경우엔 kernel.org에 있는 모든 커널을 AUR또는 기본 저장소에서 받을 수 있습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8de607fa-a9c5-4820-a678-c20da62144fd&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f542abfd-d18c-418d-bb40-39e0c482c647&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Mainline은 현재 개발중인 커널입니다. 아직 안정화 전이므로 고급 사용자가 아니라면 함부로 다운받지 않는 것을 추천드립니다. AUR에 linux-mainline이라는 패키지로 들어있습니다. 이 외에도 실제로 우리가 사용하는 리눅스 커널은 stable 버전입니다. 최소한의 안정화만 거치고 Testing에서 Core 저장소로 내려옵니다. 놀랄 만큼 업데이트가 빠르죠.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-890cbe1b-cd51-4bb1-99b6-ee2ea8e4fcae&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 조금 더 안정적인 시스템을 구축하고 싶다면, LTS 패키지를 설치하시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680248569&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -Syu linux-lts{,-headers}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-79106548-7a42-42d9-89ed-2491157495ef&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;GRUB을 사용하신다면 설정 파일만 업데이트 하면 되나, 저처럼 systemd-boot를 사용하신다면 엔트리를 새로 생성해주어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680319558&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo cp /boot/loader/entries/arch.conf /boot/loader/entries/archlts.conf
$ sudo nano !$&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d2be6666-8a98-4c68-9aac-b6addc4f3e97&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;pre id=&quot;code_1727680355296&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## /boot/loader/entries/arch-lts.conf
title Arch Linux LTS
linux /vmlinuz-linux-lts
initrd /intel-ucode.img
initrd /initramfs-linux-lts.img
options root=UUID=XXXXXXXXXXXXXX rw&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f90fd450-f4e8-41cf-9078-be4e56d09b22&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3번째 줄에서 AMD CPU를 사용하신다면 amd-ucode로 바꿔주시고, root 파티션의 UUID도 자신의 파티션에 맞게 수정해주시면 됩니다. 아마 기존 arch.conf를 복사했다면 title과 linux, initrd만 수정해주시면 될 겁니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680362205&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo nano /boot/loader/loader.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-ba7b8239-189c-4caf-8e29-63452ca77f97&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;pre id=&quot;code_1727680392044&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## /boot/loader/loader.conf
default archlts    # 또는 @saved
timeout 0
console-mode max
editor 0&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-3a3aad79-01d4-4684-a811-363dc5c490bb&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;부트로더 기본값을 설정합니다. 이렇게 하면 기본값이 LTS 커널로 선택됩니다. 일반 커널로 부팅하고자 하는 경우, 전원 버튼을 누름과 동시에 스페이스바를 꾹 누르고 있으면 커널을 선택할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680408841&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ bootctl list 
$ sudo bootctl set-default archlts.conf
$ bootctl list
$ reboot&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-29bf277a-fed2-4f6f-b1e0-2ec9d6e04c8c&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-33d106c9-aa64-4d7e-8fd6-d97487ab145d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;처음에는 그냥 Arch Linux가 (defualt)로 표시되어 있을 겁니다. 기본값을 다시 설정하고 확인합니다. 확인이 되었으면 재부팅합니다. 이제 linux, linux-headers 패키지를 삭제하고 systemd-boot에서 arch.conf를 삭제하면 stable 커널은 완전히 삭제됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0724c56f-b64e-48ff-906a-6eca27d7cfcf&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-11a63a96-3267-432c-88ce-1d270757b7a4&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 id=&quot;SE-0ee0139e-9ea6-45d8-b690-01a42a18bbb8&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;유용한 프로그램 설치&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-bc5d427c-205c-439a-a4e2-8d3e22190097&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;1. The Fuck 설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680424906&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S thefuck&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-61c418ee-ec8a-4dd9-be70-3d05161658f5&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;명령어를 잘못 입력했을 때, 자동으로 고쳐주는 프로그램입니다. 단순한 철자오류부터 sudo를 빼먹었다든가, 이러한 상황에서 굉장히 auto correction을 잘 해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680445022&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ fuck
$ fuck
$ source ~/.bashrc    # bash 사용시
$ source ~/.zshrc     # zsh 사용시&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-53a9d7ea-7f37-44e5-acc8-bd74f9f5d036&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-f3af4894-6e99-4021-a0bc-13b3b0c157db&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;참고로 저 fuck은 꼭 두 번 쳐야 합니다(...) fuck을 두 번 실행시킨 후 bashrc / zshrc를 새로고침하면 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d226f2b6-cc93-4e2e-a00a-7e7e615dfd19&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgSItd/btsJRCVb4Zp/GCoLuk2MxrCtUR1NM67Pe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgSItd/btsJRCVb4Zp/GCoLuk2MxrCtUR1NM67Pe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgSItd/btsJRCVb4Zp/GCoLuk2MxrCtUR1NM67Pe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgSItd%2FbtsJRCVb4Zp%2FGCoLuk2MxrCtUR1NM67Pe1%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;936&quot; height=&quot;254&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-7f4cbc1e-07bc-45ef-bc98-3ed659828838&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-1cfd7851-77f3-44c1-9e74-d4f22651708d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;pacman을 pacmna으로 잘못 입력했군요. 이럴 때 fuck을 입력해주면 됩니다. 사실 이 정도는 zsh 확장으로 자동으로 sudo를 입력해주기도 하지만, 뭐.. 저는 익숙한 거 쓰겠습니다. &lt;/span&gt;&lt;span&gt;&lt;s&gt;이쪽이 더 손맛이 좋기도 하고요&lt;/s&gt;&lt;/span&gt;&lt;span&gt;. 이 뿐만 아니라 위/아래 방향키로 다른 명령어 제안을 확인할 수도 있습니다. 올바르면 엔터 키를 눌러서 계속 진행할 수 있고, 종료하고 싶으면 ^C를 누르면 됩니다. 참.. 쓰면서 계속 정신나간 프로그램이라는 생각을 지울 수가 없네요. 심지어 정확도까지 높습니다. 이걸 잘 이용하면 Command not found 에러가 났을 때 자동으로 fuck을 실행시킬 수도 있겠네요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-338039c5-0e5b-44bd-bcc9-f23690b93d8e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;2. Howdy 설치 (FaceID / Windows Hello)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680462150&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ yay -S howdy v4l-utils&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-31fb948a-f0e7-4984-ac3d-b6acf3104ba9&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;macOS에 Face ID가 있고 윈도우에 Windows Hello가 있다면 리눅스에는 Howdy가 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680470071&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo nano /etc/pam.d/gdm-password&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-300fa4c8-9a14-44c4-890d-ae89b38e07fd&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;pre id=&quot;code_1727680490247&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## /etc/pam.d/gdm-password
#%PAM-1.0
auth	sufficient		pam_unix.so try_first_pass likeauth nullok
auth	sufficient		pam_python.so /lib/security/howdy/pam.py

...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-88ecbaf7-c79f-4d84-a83f-e129290c8a67&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;얼굴인식으로 잠금을 해제하고 싶다면 위 파일을 이렇게 수정합니다. 다만 이 경우 GNOME에서 Login Keyring이 언락되지 않았다면서 수시로 패스워드를 물어봅니다. 이게 조금 짜증이 나서 저는 다시 끄고 사용중입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680549921&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo nano /etc/pam.d/sudo&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-a95f4174-3a44-4551-9ce3-e7aca30e0f8c&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span&gt;1: 비밀번호 입력 없이 처음부터 얼굴인식을 하고 싶은 경우&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680566218&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## /etc/pam.d/sudo
#%PAM-1.0
auth	sufficient		pam_python.so	/lib/security/howdy/pam.py&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;/div&gt;
&lt;div id=&quot;SE-6e5f942f-5d41-4447-9826-5763a1a78523&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span&gt;2: 비밀번호 입력에 실패하거나, 입력하지 않으면 얼굴인식을 하는 경우&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680629895&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## /etc/pam.d/sudo
#%PAM-1.0
auth	sufficient		pam_unix.so 	try_first_pass nullok
auth	optional		pam_permit.so
auth	required		pam_env.so
auth	sufficient		pam_python.so	/lib/security/howdy/pam.py&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-6d344ccd-2d3e-46ef-b1e0-3856dd699389&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 위와 같이 수정하시면 됩니다. 조금 복잡합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1727680702590&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ v4l2-ctl --list-devices&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-57f957f7-2ba1-4007-8ff5-e07751473be1&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;여기서 자신의 카메라를 확인해주세요. /dev/videoX인데, 저는 video0이 일반 카메라, video2가 IR 카메라였습니다. IR 카메라 번호를 기억하세요. 아시겠지만 작동시켰을 때 빨간 불이 깜박거려야 IR 카메라입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680710952&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo howdy config&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2d8e9896-9c5b-4598-8f7e-fc9d0403e68c&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;pre id=&quot;code_1727680747238&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...
# The path of the device to capture frames from
# Should be set automatically by an installer if your distro has one
device_path = /dev/videoX
...

# 또 수정하면 좋은 것들
certainty = 5
timeout = 5
dark_threshold = 80&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-46bd7dda-eff7-4e4e-ba68-fd0a33a7e576&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;X는 각자 디바이스에 맞게 수정해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680760202&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo howdy add&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-39243057-8a70-4da5-a06d-2357999564ff&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-42b93fed-b0c4-4c7f-807a-43fd449b8c5d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;얼굴을 추가하면 끝입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6bf7b557-5cd1-4483-bfa8-50746776482d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;기타 프로그램 설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680779634&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S libreoffice-fresh gimp inkscape firefox
$ sudo pacman -S thunderbird vlc shotcut audacity virtualbox{-host-modules-arch}
$ sudo pacman -S obs-studio discord youtube-dl uget focuswriter gparted
$ yay -S google-chrome kazam timeshift (timeshift-autosnap) visual-studio-code-bin&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-60d17129-356c-4941-8b6f-68f303545af6&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;text-align: left; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;리눅스용 프로그램&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;윈도우용 프로그램&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;리눅스용 프로그램&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;윈도우용 프로그램&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;libreoffice-fresh&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Microsoft Office&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;gimp&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Adobe Photoshop&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;inkscape&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Adobe Illustrator&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;firefox&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;firefox&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;thunderbird&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Microsoft Outlook&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;vlc&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;(미디어 플레이어)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;shotcut&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Adobe Premire Pro&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;audacity&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;(오디오 편집)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;virtualbox&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;vmware-workstation&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;virtualbox&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;vmware workstation&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;obs-studio&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;OBS&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;discord&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;discord&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;youtube-dl&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;uget&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;focuswriter&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;gparted&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;diskmgmt.msc&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;google-chrome&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;Google Chrome&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;timeshift&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(백업 프로그램)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;hoffice&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;한컴오피스&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f47fc2f5-d2ad-438e-a55a-b81045ec5346&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-d759a506-3781-4e44-9280-eb614af9b56f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 외에도 kde 환경에서 사용 가능한 kdewallet이나 kdeconnect 등이 있는데, 이건 kde-applications에 함께 포함되어 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a1610112-af07-465b-8af5-833dc0a36acc&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-6a39232f-45eb-4e42-8f81-c4f5d195b5c5&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 id=&quot;SE-7eeae939-e5e7-4239-ac72-95c0d6a8b865&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;기타 설정&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-074d8b3e-f0a4-439d-aa00-0bc58672d47a&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-9d1874aa-5a07-41d4-9c07-20bbc82bdeb2&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;1. pacman 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; pacman은 아치리눅스의 패키지 매니저입니다. PACkage MANager의 약자이고, 특징이라면 역시 아치리눅스답게 공식 GUI 프론트엔드가 없다는 겁니다. 사용법도 dnf install, apt search 등 직관적인 다른 패키지 매니저와 달리 pacman -S, pacman -Qdtq, pacman -Rns 등 복잡한 옵션을 사용합니다. 그럼에도 불구하고, 잘만 쓴다면 엄청나게 많은 기능을 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680798801&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo nano /etc/pacman.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-ad76616c-789f-4b81-ae74-0842e607f76e&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-1facc857-bb7d-4b3b-aec0-4c2ad9b5b830&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;pacman의 설정 파일을 편집해봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-74fff6f5-c161-426e-ab3e-9641e290b8a0&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;223&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/epTyZ1/btsJQBXbMxr/uknDw8KXKak5xKeGN9lRK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/epTyZ1/btsJQBXbMxr/uknDw8KXKak5xKeGN9lRK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/epTyZ1/btsJQBXbMxr/uknDw8KXKak5xKeGN9lRK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FepTyZ1%2FbtsJQBXbMxr%2FuknDw8KXKak5xKeGN9lRK0%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;223&quot; height=&quot;132&quot; data-origin-width=&quot;223&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-5ffce842-890d-4f15-8db1-1a3b24d70372&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Color와 VerbosePkgLists, ParallelDownloads 앞의 주석을 해제하고, 그 다음 줄에 ILoveCandy를 추가해주세요. 대소문자에 유의하시기 바랍니다. Color는 pacman 출력에서 색상을 표시하고, VerbosePkgLists는 패키지를 나열만 하는 게 아니라 각각의 사이즈, 버전 등을 표 형식으로 출력해줍니다. ParallelDownloads는 병렬로 다운로드할 패키지 개수, ILoveCandy는 '[####---]' 형태의 바가 아닌 진짜 팩맨이 움직이는 것 같은 효과를 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680819139&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S reflector rsync
$ sudo cp /etc/pacman.d/mirrorlist{,.bak}
$ sudo reflector -c &quot;KR&quot; -f 7 -l 5 -n 7 --save /etc/pacman.d/mirrorlist&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-e4a40094-dad6-4e4a-877b-56d57be78704&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-a81470e8-aacf-4158-9647-2e2b3dc49aa0&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그리고 (1)번 글에서 했듯, reflector를 사용하여 미러리스트를 업데이트 해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d57f4baa-0d41-43c0-81c7-16e338d16926&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-06e1b286-d0ac-40e1-8517-2d5595cb74cb&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;2. Fractional Scaling&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-597609d3-24f5-4f6c-8430-820c718d14bb&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;i&gt;&lt;b&gt;&amp;gt;&amp;gt; 경고: Fractional Scailing은 꼭 필요한 경우가 아니면 사용하지 마시길 바랍니다.&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-17a2273a-55f2-441a-b7da-c9d4d903bee4&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; GNOME이 HiDPI 지원이 잘 되기는 하는데, 문제는 100%p 단위로만 설정할 수 있습니다. 아직 정식 기능은 아니지만, 실험적으로 Fractional Scaling (=정수가 아닌 비율: 125%, 150%, 175%, ...)을 활성화할 수 있습니다. X11에서는 mutter-x11-scaling (AUR)을 설치하고, Wayland에서는 다른 설정을 조금 만져주면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680844438&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Wayland
$ gsettings set org.gnome.mutter experimental-features &quot;['scale-monitor-framebuffer']&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-e5490dcf-f72a-4731-8bd0-43296633491e&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-4d7d5173-da04-40ae-9780-0a69474fcf63&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;다만 문제가 하나 있습니다. Wayland를 네이티브로 지원하는 앱들은 괜찮아요. 근데 X11 기반의 앱들은 Xorg - Xwayland - Wayland를 거쳐서 그려집니다. 이 과정에서 멀쩡히 잘 돌아가던 앱들이 Fractional Scaling을 켜기만 해도 (켠 상태에서 200% 등 정수 비율로 설정하더라도) 엄청 흐려집니다. 심지어 GParted같은 앱들도 Wayland를 지원하지 않는지 엄청 흐립니다. 그나마 다행인 건 터미널이나 기본 웹 브라우저 등 자주 사용하는 것들은 선명하게 출력됩니다. 따라서, &lt;/span&gt;&lt;span&gt;&lt;b&gt;Wayland를 지원하는 앱들은 강제로 Wayland 모드로 구동되게끔 설정&lt;/b&gt;&lt;/span&gt;&lt;span&gt;해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8eb942fb-d11d-45f0-9b4e-0fcdbbd030b1&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5236efdd-57db-4aac-a0c5-ec8bd8e8e88d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;3. 터치패드 탭, 우클릭, 스크롤&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c815b1e5-847e-4400-a712-6d46e0bfae66&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; GNOME Tweaks에서 Keyboard &amp;amp; Mouse &amp;gt; Mouse Click Emulation &amp;gt; Area로 설정해주세요. 처음에는 Fingers로 되어 있는데, Area로 바꾸어야 왼쪽/오른쪽 클릭이 됩니다. 물리적으로 터치패드에 왼쪽/오른쪽 키가 나뉘어 있는 경우에는 이 옵션을 사용할 필요가 없습니다. 또한 두 손가락 스크롤을 사용하면 스크롤이 반대로 되는 경우가 있는데, 이것도 각 DE 설정 화면에서 변경이 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-77b9d380-1f32-4d1f-a229-faf0ba958f6d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9d13fa1f-9955-48ec-a3b1-1fe52637650e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;4. sudo 경고문 활성화&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-8eda34f0-47ca-477f-a0d3-a3f42f47612a&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nNPC8/btsJQJgmRry/1carNzBXoGwnWqjHoPR8mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nNPC8/btsJQJgmRry/1carNzBXoGwnWqjHoPR8mk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nNPC8/btsJQJgmRry/1carNzBXoGwnWqjHoPR8mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnNPC8%2FbtsJQJgmRry%2F1carNzBXoGwnWqjHoPR8mk%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;556&quot; height=&quot;215&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-1d2f0730-4180-458b-a4a9-6f5a24c91234&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;sudo를 입력할 때 항상 위와 같은 안내가 나오도록 합니다. 솔직히 전혀 필요 없는 기능이긴 한데, 멋있잖아요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680856263&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo sh -c 'echo &quot;Defaults lecture = always&quot; &amp;gt; /etc/sudoers.d/privacy'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-68abc057-d2bc-4bd0-877b-d66555909101&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-fe15ed60-4757-4a98-a41e-54232ddc5d7c&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Defaults 뒤에는 탭(\t) 입니다. 이제 앞으로 sudo를 실행할 때마다 저 경고문을 볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e4675f45-847e-40c4-b6d6-acee21370498&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;5. UEFI 쉘 엔트리&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680867493&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S edk2-shell
$ sudo cp /usr/share/edk2-shell/x64/Shell_Full.efi /boot
$ sudo nano /boot/loader/entries/shell.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-51fa6208-c9e2-42b1-8b09-e8e20a389e05&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;systemd-boot를 사용한다고 가정합니다. 이때 UEFI 쉘을 부트 메뉴 엔트리에 추가할 수 있습니다. GRML을 실행시키거나 할 때 유용하게 쓸 수 있습니다. 마치 리눅스를 하나의 응용 프로그램처럼 실행하는 기분을 느껴보세요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680880546&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## /boot/loader/entries/shell.conf
title UEFI Shell efi /Shell_Full.efi&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-b31c192f-698f-48be-ae3c-ce81ce0ec963&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-0ae2963d-9efc-4830-847d-e43b481a7668&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이렇게 하면 엔트리가 생성됩니다. 이 외에도 efifs 패키지를 설치한 뒤 드라이버 폴더를 /boot/EFI/systemd/drivers에 넣으라는 얘기도 있던데, 이것 때문인진 모르겠지만 UEFI 쉘에서 ext4 파티션에 접근이 가능했습니다. 이 부분은 문서가 없어서 시행착오를 많이 해야 할 것 같네요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d45e0ee1-b220-4bec-9f8e-962145732c64&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b617bd0d-9302-4be4-accd-ac835d832b42&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;6. GRML Live Linux&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6e84b3b1-90ac-40e0-8e3a-5d0d4adbf7ec&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;문제가 생겼을 상황을 대비해서, 라이브 시스템을 컴퓨터에 내장시킬 수 있습니다. 제 경우는 종종 윈도우에서 EFI 파티션을 꼬아버려 리눅스 커널이 잘리는(...) 대참사가 종종 일어나곤 하는데, 그럴 때마다 아치리눅스 미디어에서 fsck, mount, chroot, pacman -S linux 계속 하는 게 너무 귀찮더라고요. 사실 명령어 몇 줄은 입력할 수 있어요. 문제는 그때마다 USB를 꽂아야 한다는 거.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f05d264d-d205-4e75-a3bd-355434192d1b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그럴 때 쓰는 게 GRML입니다. 이건 원래 EFI 파티션에 내장해서 쓸 수 있는데, 사이즈가 좀 커서 EFI가 1GB 이상일 때만 정상적으로 동작합니다. 그게 아니라면 편법을 써야 해요. 우선 grml iso를 다운받아 루트 디렉터리에 풀어준 뒤, /grml 폴더에 vmlinuz, initrd.img, grml64-small.squashfs 파일만 남겨줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680887619&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo nano /boot/grml.nsh&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-a2123f81-a93b-49dc-ae10-7f9b74dad164&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;pre id=&quot;code_1727680899704&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## /boot/grml.nsh
BLK6:\grml\vmlinuz initrd=\grml\initrd.img apm=poweroff boot=live live-media-path=\grml\ nomce net.ifnames=0&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-a674764f-18a0-48cb-bcbc-933e2ca53d94&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그리고 UEFI 쉘코드를 작성해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680908440&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo nano /boot/loader/entries/grml.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-b3e6bd7d-eaa0-46d5-88e9-00ceaf6c35af&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;pre id=&quot;code_1727680922941&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## /boot/loader/entries/grml.conf
title GRML Live Linux
efi /Shell_Full.efi
options -nointerrupt -noconsolein -noconsoleout grml.nsh&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-939f67b3-ab0e-4a45-838e-ecc5313df280&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-469eff31-6765-49fb-8035-d9ffdd4188a1&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;마지막으로 systemd-boot에서 엔트리를 추가해주면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6802161d-1d3a-46f9-b70a-1c66a9023869&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;7. 관상용 프로그램&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680941165&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S cmatrix &amp;amp;&amp;amp; cmatrix&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-7a50ad39-6f1b-42c4-890f-b5bb9634049b&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;해커가 되는 기분을 느낄 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727680950693&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S asciiquarium &amp;amp;&amp;amp; asciiquarium&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-e3ce8453-9e65-43cd-84bd-8bf8194dcc80&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-5aad9f8f-aff8-4122-997e-1795dd1c6f66&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;어항을 가져다 놓은 기분을 느낄 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-965ee4f7-6a6d-4577-8b02-9f3ded514c21&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d3a0a4d3-2bd8-4cce-98eb-a8a2887096a3&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;기타 재미있는 명령은 아래에서 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b6f1f9ed-7fae-4522-a4bb-5477fc0e45a6&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://www.tecmint.com/funny-linux-commands/&quot;&gt;https://www.tecmint.com/funny-linux-commands/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;figure id=&quot;og_1727680957711&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;24 Hilarious Linux Commands That Will Make You Laugh&quot; data-og-description=&quot;Linux has a rich collection of commands for various tasks, there are also some funny and whimsical commands that you can try out for amusement.&quot; data-og-host=&quot;www.tecmint.com&quot; data-og-source-url=&quot;https://www.tecmint.com/funny-linux-commands/&quot; data-og-url=&quot;https://www.tecmint.com/funny-linux-commands/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/7siJm/hyXaI8regC/rG3sx9kSixkXsFyCLuoPbk/img.png?width=720&amp;amp;height=340&amp;amp;face=0_0_720_340,https://scrap.kakaocdn.net/dn/bnHjSt/hyXaJfdjh7/V5cKWd5QWn05kB8xFVKMf1/img.png?width=720&amp;amp;height=340&amp;amp;face=0_0_720_340,https://scrap.kakaocdn.net/dn/BG4l0/hyXawfTDrk/MesKFPHyDnHs1qGDcQ1ah0/img.png?width=783&amp;amp;height=512&amp;amp;face=0_0_783_512&quot;&gt;&lt;a href=&quot;https://www.tecmint.com/funny-linux-commands/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.tecmint.com/funny-linux-commands/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/7siJm/hyXaI8regC/rG3sx9kSixkXsFyCLuoPbk/img.png?width=720&amp;amp;height=340&amp;amp;face=0_0_720_340,https://scrap.kakaocdn.net/dn/bnHjSt/hyXaJfdjh7/V5cKWd5QWn05kB8xFVKMf1/img.png?width=720&amp;amp;height=340&amp;amp;face=0_0_720_340,https://scrap.kakaocdn.net/dn/BG4l0/hyXawfTDrk/MesKFPHyDnHs1qGDcQ1ah0/img.png?width=783&amp;amp;height=512&amp;amp;face=0_0_783_512');&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;24 Hilarious Linux Commands That Will Make You Laugh&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Linux has a rich collection of commands for various tasks, there are also some funny and whimsical commands that you can try out for amusement.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.tecmint.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-5aa85809-73b0-4da4-a7aa-278d2fec46c0&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-85eea343-9b5f-4c1f-9f70-205364e7ca36&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #040404;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-02e85de1-7cb8-4ddd-8670-eb486ffa1154&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #040404;&quot;&gt;&lt;b&gt;추가 팁&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #040404;&quot;&gt;가끔가다 터미널이 멈추는 경우가 있습니다. 특히 Nano를 쓰다 무심코 Ctrl+S를 눌렀을 때 발생하는데, Ctrl+Q를 누르면 해제시킬 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #040404;&quot;&gt;파일을 읽는 프로그램은 몇 가지가 있습니다. cat은 통째로 보여주고, less 또는 more은 한 화면에 다 나오지 않는 파일을 볼 때 유용하게 쓸 수 있습니다. 아주 짧은 파일을 잠깐 보기만 할 때, 혹은 grep을 사용할 때는 cat이 좋고, 텍스트를 읽기만 할 때는 less나 more, 편집까지 할 때는 nano나 vim이 좋습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #040404;&quot;&gt;제가 늘 하는 거, !$이죠. 윗 줄에서 사용한 마지막 매개변수를 그대로 사용할 때 씁니다. 이 외에도 Alt 키를 누른 상태에서 '.'을 몇 번 눌러도 비슷한 효고를 볼 수 있습니다. 만약 윗 줄 전체를 사용해야 할 때는 !!을 사용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #040404;&quot;&gt;터미널에서 복사, 붙여넣기는 Ctrl+Shift+C, Ctrl+Shift+V를 사용합니다. 검색은 Ctrl+Shift+F입니다. 그냥 Ctrl+C는 프로그램을 죽여버려요.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #040404;&quot;&gt;파일을 지우지 않고 비워버릴 수 있습니다. 특히 아주 큰 파일을 삭제할 때 유용합니다. 다만 파일을 잘 확인하고 사용하세요.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1727680966172&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ &amp;gt; file&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d16ad649-0859-40dd-a437-0127b90aeb50&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;nbsp;&lt;/div&gt;</description>
      <category>Linux</category>
      <author>카루-R</author>
      <guid isPermaLink="true">https://karupro.tistory.com/127</guid>
      <comments>https://karupro.tistory.com/127#entry127comment</comments>
      <pubDate>Mon, 30 Sep 2024 16:22:48 +0900</pubDate>
    </item>
    <item>
      <title>Arch Linux 설치 가이드 2: Wayland GUI 환경설정과 드라이버 설치</title>
      <link>https://karupro.tistory.com/126</link>
      <description>&lt;div id=&quot;SE-0a490f43-a3d1-4805-b62d-b2e02c1553df&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-b71ddea5-19cb-4def-bad5-14ad1288863c&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;환영합니다, Rolling Ress의 카루입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a7c52032-983a-495a-91ff-79236ecadd64&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9bdd62f0-448b-4941-a10f-65e52e3d97d8&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 지난번에 아치리눅스 설치까지는 끝냈습니다. 그런데 지금은 컴퓨터를 켜봤자 bash만 깜빡일 뿐입니다. 서버가 아닌 이상 이런 화면을 원하지 않죠. 당장 크롬 브라우저도 안 돌아갑니다. 이제 GUI를 입혀줄 데스크탑 환경을 설치하고, 중요한 설정들을 마무리해봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0a961587-899d-404a-bd25-c8aca53011d3&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ac60d92c-5eac-4011-ac5c-f80dd3d71af0&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #54b800;&quot;&gt;&lt;u&gt;&lt;b&gt;※ 2024. 09. 29 업데이트:&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;span style=&quot;color: #54b800;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #54b800;&quot;&gt;​&lt;/span&gt;&lt;span style=&quot;color: #36851e;&quot;&gt;새롭게 수정한 부분이 있어 글을 업데이트합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2899a9b0-b74a-4a2e-b593-06c72b94c9db&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3a18fee1-9aa7-4d6b-9a34-1ff62e975651&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;데스크탑 환경 or 윈도우 매니저 설치&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;한글 입출력 설정&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;기타 프로그램 및 드라이버 설치&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;Wayland 환경설정&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;Zsh 설치&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;SE-e48c5144-6bd3-41ad-a694-38b762e15f24&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-5e11a268-f776-4e28-8d7d-3ab691de6951&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 id=&quot;SE-404e57fd-d0e7-4ae8-8d9d-592d901b389f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;데스크탑 환경 or 윈도우 매니저 설치&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-11344dc3-9c96-447f-9791-e22fbf522afd&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-92a6f0fe-2507-46d6-8760-b1ea1d499641&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-96816956-10de-41ad-9c87-3a01fde979a8&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;데스크탑 환경 설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b1e3026a-a60c-49cc-bd11-a8e776b2a8b0&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 데스크탑 환경에는 크게 GNOME, KDE Plasma, Xfce 등이 있습니다. 일반적으로는 저 3개 중 하나를 고르지만, Budge, Cinnamon, MATE, LXDE, LXQt등도 사용이 가능합니다. &lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;&lt;s&gt;저는 GNOME을 메인으로 사용하고 있고, KDE Plasma를 가끔 사용하고 있습니다.&lt;/s&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #36851e;&quot;&gt;최근에 KDE Plasma로 완전히 넘어오며 상당히 만족하고 있습니다. 강력한 커스터마이징과 화려한 인터페이스를 원하시는 분들께는 KDE를 적극 추천합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727664165408&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -Syu gnome gnome-extra       # GNOME 사용시
$ sudo pacman -Syu plasma kde-applications # KDE Plasma 사용시&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-324c7bd1-1aad-49b2-a2b9-586abc92d160&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-240f302a-ee63-46cf-9f42-2531af29748b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;GNOME&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6d3345ba-e88e-459e-8e2f-dc8f6cc2382c&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; gnome 패키지는 필수적인 패키지만 포함하고 있고, gnome-extra는 주변 패키지까지 포함하고 있습니다. 워낙 사이즈가 큰 패키지들이라 설치에 시간이 꽤 걸릴 겁니다. 중간에 무언가를 자꾸 물어보는데, 엔터만 눌러도 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2874ef60-dd35-4d67-94b3-88e869b52893&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b55b794e-27d7-4886-90ae-6bc2c3d74a0f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;KDE Plasma&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; plasma-meta의 경우 메타 패키지 역할을 합니다. 혹은 plasma를 통해 그룹으로 설치할 수도 있습니다. kde-applications는 gnome-extra처럼 다른 프로그램들을 함께 설치합니다. kde-applications-meta를 통해 메타 패키지로 설치할 수도 있습니다. 모든 프로그램이 필수적인 건 아니지만, 이를 설치하지 않으면 Konsole, dolphin 등 기본적인 터미널과 파일탐색기조차 설치되지 않습니다. &lt;/span&gt;&lt;span style=&quot;color: #36851e;&quot;&gt;메타패키지와 그룹의 차이점은 (1) 메타패키지는 구성요소 선택이 불가능하고 새 요소가 추가되면 자동으로 설치되며 (2) 패키지 그룹은 구성요소를 선택할 수 있고 개별 삭제가 가능하다는 점입니다. 취향에 맞게 사용하시기 바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727664174199&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S archlinux-wallpaper&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-46e64553-89af-40df-aa51-a3278cb7dbdf&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아치리눅스에서 제공하는 배경화면입니다. 이 패키지를 설치하면 GNOME이나 KDE에서 배경화면을 선택할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727664256327&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo systemctl enable gdm      # GNOME 사용시
$ sudo systemctl enable sddm     # KDE Plasma 사용&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f0abe436-6ae8-4b79-b338-13df57899221&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-d28eca33-9742-46d2-b4b5-1b0d9025fbbb&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 설치가 되었다면 DM을 활성화하고, 재부팅해줍니다. DM은 하나만 쓰실 수 있습니다. GDM을 쓴다고 KDE Plasma에 못 들어가는 건 아닌데, 맞지 않는 DM을 쓰면 절전모드나 잠금화면이 안 된다든지 하는 오류가 있을 수 있습니다. 자주 쓰는 DE에 맞춰 DM을 켜주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-39d626c2-31b8-4738-bfcf-0b1b85d3573a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&amp;lt;KDE Plasma 사용자&amp;gt; SDDM 추가 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727664272427&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ yay -S archlinux-themes-sddm
$ sudo mkdir /etc/sddm.conf.d
$ sudo nano /etc/sddm.conf.d/hidpi.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-1b92892c-47e6-4d66-bf83-41e6e0a1d3c6&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;pre id=&quot;code_1727664297942&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[Wayland]
EnableHiDPI=true

[X11]
EnableHiDPI=true

[General]
GreeterEnvironment=QT_SCREEN_SCALE_FACTORS=2,QT_FONT_DPI=192&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d2e7632a-5276-4b98-b28a-3edc230df552&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;본인 모니터의 해상도가 QHD 이상이라면, HiDPI와 배율을 설정해주시는 게 좋습니다. 다만, &lt;/span&gt;&lt;span&gt;&lt;b&gt;SDDM만 해당됩니다.&lt;/b&gt;&lt;/span&gt;&lt;span&gt; GDM은 자동으로 배율을 적용해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727664581645&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo echo &quot;[Theme]&quot; &amp;gt;&amp;gt; /etc/sddm.conf.d/theme.conf
$ echo &quot;Current=archlinux-simplyblack&quot; | sudo tee -a !$ &amp;gt; /dev/null
$ sudo nano /etc/sddm.conf.d/10-wayland.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-ddae82ad-a11c-4ef2-acae-fc4ce8c1e441&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;pre id=&quot;code_1727664600790&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[General]
DisplayServer=wayland 
GreeterEnvironment=QT_WAYLAND_SHELL_INTEGRATION=layer-shell

[Wayland]
CompositorCommand=kwin_wayland --drm --no-lockscreen --no-global-shortcuts --locale1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2843a534-76b5-4c20-bf02-6a6675f1fabe&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-2a754f22-3bd0-44c3-920c-723ef01bbcc8&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Wayland 및 테마 설정도 마무리 해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f3339ec8-723a-42a7-9190-0f9cb4a6c255&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0aaedd55-227c-4b10-9836-02654583a088&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&amp;lt;GNOME 사용자&amp;gt; GNOME 커스텀&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-77e2f911-b5c9-4c54-ae39-0ccd26b67996&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2421e1cb-b3e8-4e8a-bd9c-f3927eeff37f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 제가 예전같았으면 이쯤에서 cairo-dock을 설치했겠지만, GNOME이 4x 버전에 들어서면서 상당히 인터페이스가 좋아져 더 이상 쓸 필요가 없어졌습니다. 그럼에도 불구하고 macOS와 같은 독을 사용하길 원하신다면 cairo-dock 과 cairo-dock-plug-ins 패키지를 설치하시기 바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-a6bea55b-e5b1-4d0c-8b58-6ce56c0d4aa0&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czD1FH/btsJPTi9KIJ/8JWL3EYKJs6MONnjqvEF90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czD1FH/btsJPTi9KIJ/8JWL3EYKJs6MONnjqvEF90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czD1FH/btsJPTi9KIJ/8JWL3EYKJs6MONnjqvEF90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczD1FH%2FbtsJPTi9KIJ%2F8JWL3EYKJs6MONnjqvEF90%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;773&quot; height=&quot;434&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;434&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-c88a84fc-4f96-4c9c-9ca4-7b1ff3cb0c3b&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Configuration 탭의 Behaviour 메뉴에서는 독과 아이콘의 애니메이션을, Appearance 탭에서는 독의 모양과 아이콘의 크기를 설정할 수 있습니다. Cairo 말고 Plank라는 프로그램도 있는데, Wayland 환경에서 동작하지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727664610323&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ yay -S gnome-browser-connector&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-a0784604-fa98-401a-b10e-3e7648fe5110&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-8ad48365-69da-4256-b8a7-4bec82869b5d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;원래 chrome-gnome-shell이라는 이름으로 GNOME의 확장 브릿지 패키지가 존재했는데, 공식 레포에서 삭제되고 gnome-browser-connector가 AUR에 등록되었습니다. 이것을 설치하고, GNOME extension 사이트에서 원하는 확장을 설치할 수 있습니다. 저는 Coverflow Alt-Tab을 사용중입니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-7734b210-dbc3-4b7b-9d24-f5766e1315be&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBWrfC/btsJQipgiMK/IK38SFkVizR5ufbv7VKH1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBWrfC/btsJQipgiMK/IK38SFkVizR5ufbv7VKH1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBWrfC/btsJQipgiMK/IK38SFkVizR5ufbv7VKH1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBWrfC%2FbtsJQipgiMK%2FIK38SFkVizR5ufbv7VKH1k%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;773&quot; height=&quot;428&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d0dc51e6-2e49-425b-8da2-cfeec0976110&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;원래는 Dynamic Panel Transparency라고, 상단바를 유동적으로 투명하게 만드는 확장이 있었는데 이게 44버전은 지원을 안 합니다. 아쉽군요. 아무튼 이 사이트에서 확장을 설치하면 extensions 앱에서 관리가 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727664617645&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ yay -S gnome-shell-extension-clipboard-indicator-git&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f947efaf-e0b3-4f2e-8150-70622907e40c&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-f6b4a676-6140-47a9-842f-e83af7611d31&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;클립보드 히스토리를 지원하는 확장입니다. 이건 AUR에서 설치가 가능합니다. 설치 후 extensions 프로그램에서 해당 확장을 켜주시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-acc05d85-b088-4bfb-9017-4be100756cc3&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;483&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EnPwz/btsJRELqos1/r4N99uVHSIj2DxLgyylgb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EnPwz/btsJRELqos1/r4N99uVHSIj2DxLgyylgb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EnPwz/btsJRELqos1/r4N99uVHSIj2DxLgyylgb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEnPwz%2FbtsJRELqos1%2Fr4N99uVHSIj2DxLgyylgb1%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;773&quot; height=&quot;483&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;483&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-e1172578-6ba6-4a29-aca0-02391e96fde3&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;p id=&quot;SE-cbf6b82d-6522-43b9-a140-327088934e30&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;KDE는 별다른 확장 필요 없이 자체적으로 상당한 양의 커스터마이징을 지원합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;p id=&quot;SE-c1c1aa53-2b36-4394-b2f9-c5ffca740bdf&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;systemd-boot v256 버그&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; systemd v256부터 절전 모드에 들어가기 전 user.slice를 freeze 시킵니다. 그런데 이 프로세스가 커널 버그 등으로 실패하는 경우가 있어요. 특히 kmv이 사용중일 때 그럴 확률이 크다고 합니다. 로그를 보면 Failed to freeze unit 'user.slice'라는 메시지가 있을 거예요. 일단 문제가 생기면 &lt;/span&gt;&lt;span&gt;&lt;b&gt;전원 LED만 들어오고, 키보드와 마우스, 모니터가 동작하지 않습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727677892496&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ echo '[Service]' &amp;gt;&amp;gt; disable_freeze_user_session.conf
$ echo 'Environment=&quot;SYSTEMD_SLEEP_FREEZE_USER_SESSIONS=false&quot;' &amp;gt;&amp;gt; !$
$ sudo mkdir /etc/systemd/system/systemd-{hibernate,hybrid-sleep,suspend{,-then-hibernate}}.service.d
$ sudo cp disable_freeze_user_session.conf /etc/systemd/system/systemd-hibernate.service.d
$ sudo cp disable_freeze_user_session.conf /etc/systemd/system/systemd-hybrid-sleep.service.d 
$ sudo cp disable_freeze_user_session.conf /etc/systemd/system/systemd-suspend.service.d
$ sudo cp disable_freeze_user_session.conf /etc/systemd/system/systemd-suspend-then-hibernate.service&lt;/code&gt;&lt;/pre&gt;
&lt;div id=&quot;SE-6ffeecaa-d955-4ae0-9394-0b430d986737&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-542fed93-0566-4119-b9c1-79bd617b5c84&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 4~7줄을 입력할 때는 방향키를 사용하세요. 위쪽 방향키를 누르면 이전에 입력한 명령이 자동으로 입력됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p id=&quot;SE-de4da570-fea6-4b0e-8945-87ff7c39a333&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;[선택] sway 윈도우 매니저 설치 (+TTY neofetch)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727664632808&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ yay -S wlroots0.17-nvidia     # NVIDIA 사용자
$ sudo pacman -S sway{,bg} foot {w,d}menu
$ mkdir ~/.config/sway &amp;amp;&amp;amp; cp /etc/sway/config ~/.config/sway
$ mkdir ~/.config/foot &amp;amp;&amp;amp; cp /etc/xdg/foot/foot.ini ~/.config/foot
$ sway&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-707a321a-3616-4bc5-a5ee-f8a79ce2a9c9&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-65c4d111-cd73-47ec-bf70-84dbf4d9afc2&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;사실 기회가 된다면 DE(Desktop Environment) 말고 Window Manager/Compositor를 사용해보시기 바랍니다. 특히 타일링 윈도우 매니저는 그 특유의 간결함과 강력함으로 인해 인기가 높습니다. 가벼움을 중시하는 아치리눅스의 미학에 따라 i3 (X11 Window Manager) 또는 sway (Wayland Compositor)를 사용해보시는 걸 추천드립니다. &lt;/span&gt;&lt;span&gt;&lt;b&gt;원한다면 DE가 설치된 상황에서 WM만 교체할 수도 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9a6e2673-9d34-4d91-876b-e09257cb220d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; Desktop Environment를 설치했다는 걸 전제로, DE와 별개로 sway를 사용하는 법을 알려드리겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727664718994&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S neofetch
$ nano .zprofile 			# bash 사용자의 경우 .bash_profile&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-8ed6747d-c2ea-448b-af26-2dbf5bfd4b21&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;pre id=&quot;code_1727664762132&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;neofetch --os_arch off --speed_shorthand on --cpu_temp C --shell_version off

if [ -z &quot;$WAYLAND_DISPLAY&quot; ] &amp;amp;&amp;amp; [ &quot;$XDG_VTNR&quot; -eq 6 ]; then
	exec sway      # nvidia 사용자는 --unsupported-gpu를 추가해야 합니다 (하단 참조)
fi&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-05c4923d-4cec-43f1-bd3e-7b31b1ff7a51&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-e45b6f09-6186-4a5d-a26f-1db86027b988&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; neofetch는 지난번 글에서 다룬 내용이라 여기선 설명하지 않겠습니다. 이 스크립트는 TTY6에서 로그인 시 자동으로 sway를 실행합니다. Ctrl+Alt+F6을 눌러 TTY6로 이동한 뒤, 로그인 해보세요. sway가 실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-1edaa85f-8ca4-4e45-a520-142e11e0b719&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d2a285a5-4d6d-4f6c-a541-0dbaaae43175&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 빈 화면에 마우스만 덩그러니 떠서 뭔가 싶을텐데, 그게 바로 윈도우 매니저의 특징입니다. 프로그램 실행은 Win+D 키를 눌러 프로그램명을 직접 입력하여 실행할 수 있습니다. Win+Enter 키를 눌러 foot(터미널)을 실행시킨 후, sway exit를 입력하여 종료해보세요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-04dc65b3-b5e0-4e9d-b475-869b548e3ef7&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;[선택] 노트북 사용자 전용&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727664773077&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo nano /etc/UPower/UPower.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-7075d9da-3be5-4a4e-8256-7ea9d3e643ad&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;pre id=&quot;code_1727664784105&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PercentageLow=15
PercentageCritical=5
PercentageAction=3&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-021691fa-395f-4332-ba1d-d0c8722d4cd3&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;위 파일을 생성해주세요. 이 파일이 이미 생성된 경우도 있는데, 그렇다면 아래 값들을 검색(^W)하여 바꾸시면 됩니다. 자신의 노트북에 맞추어 이 값을 적절하게 수정해주세요. Low는 배터리 부족 알림, Critical은 부족 경고, Action은 전원이 꺼지는 값입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727664814230&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ echo 80 | sudo tee /sys/class/power_supply/BAT0/charge_conrol_end_threshold &amp;gt; /dev/null&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;SE-2ce4db5f-1d15-44fe-a055-e45d2a262e85&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-e9243a8a-0bbe-4dcd-ae18-42c3f5278d7e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;추가로, 배터리 수명 증진을 위해 80%만 충전하고자 할 경우 위 명령어를 입력하시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4c7c1bc5-091b-4e94-a987-464260f636d6&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;[선택] NVIDIA 그래픽카드 사용자 전용&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727664827462&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S nvidia bva-vdpau-driver # Turing 이상 버전은 nvidia-open
$ sudo nano /etc/mkinitcpio.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-c2cba355-4ad5-47cc-85a7-bc5eaa49704f&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;pre id=&quot;code_1727664842426&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## /etc/mkinitcpio.conf

MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)

HOOKS=(..... ....)       # 'kms' 항목 삭제&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;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;NVidia 드라이버 설치 후, 편집기가 뜨면 HOOKS에서 kms를 삭제합니다. 그리고 MODULES에 위와 같이 nvidia들을 추가해주세요.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-26d152e2-aa9c-484b-bb4b-d3a61e14da6b&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div style=&quot;background-color: #fdfdfd;&quot;&gt;
&lt;pre id=&quot;code_1727664862834&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo mkinitcpio -P
$ sudo systemctl enable nvidia-suspend nvidia-hibernate nvidia-resume&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텍스트 편집기(nano, vi, ...)를 이용하여 다음 파일들을 생성(or&amp;nbsp; 수정)합니다.&lt;/p&gt;
&lt;div id=&quot;SE-a5693871-6734-42bc-b34a-deee5d07a4e8&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;pre id=&quot;code_1727664888910&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## /etc/modprobe.d/nvidia_drm.conf
options nvidia_drm modeset=1 fbdev=1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1727751200116&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## /etc/modprobe.d/nvidia.conf
options nvidia NVreg_PreserveVideoMemoryAllocations=1&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1727751367478&quot; class=&quot;ini&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;## /etc/environment
GBM_BACKEND=nvidia-drm
__GLX_VENDOR_LIBRARY_NAME=nvidia&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;커널 모듈에서 nvidia_drm의 modeset과 fbdev의 값을 설정해주고, NVreg_PreserveVideoMemoryAllocations도 설정합니다. 이를 하지 않으면 SDDM 자체가 뜨지 않을 수 있으며(!) 절전모드 후 재부팅 시 화면이 깨지는 문제가 발생합니다.&lt;/p&gt;
&lt;div id=&quot;SE-9324d6ae-668f-447c-92ef-1fcc232878c9&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;SE-9ad324af-a871-43cc-a008-10350ce10d55&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;환경 변수 설정까지 마친 후, 재부팅하여 잘 동작하는지 확인합니다. 단순히 NVidia만 설치하면 화면이 안 뜨거나, 해상도가 낮아지는 문제가 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727745459573&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## ~/.zprofile 또는 ~/.bash_profile
...
	exec sway --unsupported-gpu&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-78a4d527-5e57-4f1f-93fa-7317b8822fb8&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그리고 Sway는 nouveau 드라이버만 지원하고, nvidia 드라이버는 공식적으로 지원하지 않습니다. 강제로 실행하려면 --unsupported-gpu 옵션을 추가해주세요. wlroots0.17 대신 wlroots0.17-nvidia가 설치되었는지도 확인합니다. 만약 wlroots0.17이 설치되었다면&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727745568168&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git clone https://aur.archlinux.org/wlroots0.17-nvidia
$ cd wlroots0.17-nvidia
$ makepkg -sr
$ sudo pacman -Udd wlroots0.17-nvidia-0.17.4-1-x86_64.pkg.tar.zst&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;이 명령어를 통해 wlroots0.17-nvidia로 교체할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1727664882017&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ reboot
$ sudo nano /etc/mkinitcpio.conf    # 삭제했던 kms 다시 추가&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-6234c1a6-e233-4238-b230-7982398d8dfc&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;재부팅 후, 삭제했던 kms를 추가해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-a0aafd22-4421-4737-aed7-8bca29d9a715&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;한글 입출력 설정&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1727664974003&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ yay -S ttf-ibm-plex adobe-source-han-sans-kr-fonts ttf-kopubworld
$ yay -S ttf-nanum           # 나눔폰트를 좋아하지 않습니다만, 필요시 설치하세요.
$ yay -S ibus{,-hangul}      # GNOME 사용시
$ yay -S fcitx5-{im,hangul}  # KDE Plasma 사용&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-fe3d352b-d068-4e03-b27d-281b3620e8bb&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-0839debc-bb28-45dc-a490-4bc1daada9fe&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;한글 폰트와 입력기를 설치합니다. 여기서는 ibus와 fcitx5를 사용하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f4cbc1a6-dc74-4a76-a3d5-ef0c0e405666&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e9c7d4a4-79f1-40c2-a1e6-bf10732f6b49&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;[선택 1] GNOME 및 GTK 기반 DE 사용자 (ibus)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d1a7b346-0799-4373-84e8-8b9675df87e2&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;497&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cePXaJ/btsJPPHXDNf/UDPKXs2OaqNOKnJI1TJXUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cePXaJ/btsJPPHXDNf/UDPKXs2OaqNOKnJI1TJXUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cePXaJ/btsJPPHXDNf/UDPKXs2OaqNOKnJI1TJXUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcePXaJ%2FbtsJPPHXDNf%2FUDPKXs2OaqNOKnJI1TJXUK%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;773&quot; height=&quot;497&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;497&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-cc4ea248-5a78-4428-b5b8-f18adfd7cffb&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;GNOME 설정 &amp;gt; Keyboard &amp;gt; Input Sources에서 + 를 선택하고, Korean (Hangul)을 추가합니다. 기존에 English가 있었다면 삭제해줍니다. 우측 점 세 개를 눌러 Preferences를 선택하면 ibus 설정이 나옵니다. 적당히 설정해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727664984658&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo nano /etc/environment&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-5ae15aac-f309-4699-bc56-784c45ede889&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;pre id=&quot;code_1727665002155&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## /etc/environment
GTK_IM_MODULE=ibus
QT4_IM_MODULE=ibus
QT5_IM_MODULE=ibus
QT_IM_MODULE=ibus
XMODIFIERS=&quot;@im=ibus&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-a989cf49-2c5e-4269-a2ad-d6a6639d1265&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;/etc/environment에서 환경변수를 설정해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727665010024&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S dconf-editor&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d7b9f02d-0ba6-488d-85c8-8893001f688e&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-b68e2a02-dac0-4681-90da-e0bd48a18e67&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;IBus의 경우, 이대로 그냥 사용하면 일부 앱에서 백스페이스와 엔터 키가 안 먹히는 버그가 있습니다. 일단 dconf-editor를 설치해줍니다. 그리고 실행해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-af78f358-d467-4ea8-a3aa-0796953578f9&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;587&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqJtxl/btsJRyq4Qw9/U7eAwqkZkMAiMOSMHXmEB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqJtxl/btsJRyq4Qw9/U7eAwqkZkMAiMOSMHXmEB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqJtxl/btsJRyq4Qw9/U7eAwqkZkMAiMOSMHXmEB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqJtxl%2FbtsJRyq4Qw9%2FU7eAwqkZkMAiMOSMHXmEB1%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;773&quot; height=&quot;587&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;587&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-a6df8eec-5d48-46a8-ba0c-c818dbc89c07&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-32db33d6-949e-4582-bf1e-8504132bb252&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;org.freedesktop.ibus.engine.hangul에 들어가서 use-event-forwarding 항목을 꺼줍니다. 이렇게 하면 정상적으로 사용이 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5e232398-ad50-4737-818e-b09be4087f52&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;[선택 2] KDE 및 Qt 기반 DE 사용자 (fcitx5)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727665022148&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## /etc/environment
XMODIFIERS=&quot;@im=fcitx&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-32f9cd6e-3fc1-46f0-bf8a-3a236381e02c&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-50aba7cf-efe3-43a3-9aef-79a3cf1ecdea&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;fcitx5를 사용하는 경우 위 한 줄만 설정해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-6cc48682-2b31-4138-88af-52a623caf0f8&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biXGVr/btsJQIgGOVh/Jk7crndT3eOg1vm0Gx9dM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biXGVr/btsJQIgGOVh/Jk7crndT3eOg1vm0Gx9dM0/img.png&quot; data-height=&quot;528&quot; data-width=&quot;693&quot; data-lazy-src=&quot;&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;294&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.0819%; margin-right: 10px;&quot; data-widthpercent=&quot;50.67&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biXGVr/btsJQIgGOVh/Jk7crndT3eOg1vm0Gx9dM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiXGVr%2FbtsJQIgGOVh%2FJk7crndT3eOg1vm0Gx9dM0%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;386&quot; height=&quot;294&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sSGIU/btsJRA97DQJ/WTXuwoCXG9vRzlr3blrL4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sSGIU/btsJRA97DQJ/WTXuwoCXG9vRzlr3blrL4k/img.png&quot; data-height=&quot;542&quot; data-width=&quot;693&quot; data-lazy-src=&quot;&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;302&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.7553%;&quot; data-widthpercent=&quot;49.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sSGIU/btsJRA97DQJ/WTXuwoCXG9vRzlr3blrL4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsSGIU%2FbtsJRA97DQJ%2FWTXuwoCXG9vRzlr3blrL4k%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;386&quot; height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xgkvf/btsJQJtaFPX/PN06L7BVC6Ov7QAjkR7emK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xgkvf/btsJQJtaFPX/PN06L7BVC6Ov7QAjkR7emK/img.png&quot; data-height=&quot;509&quot; data-width=&quot;693&quot; data-lazy-src=&quot;&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;568&quot; data-is-animation=&quot;false&quot; style=&quot;text-align: center; caret-color: transparent; letter-spacing: 0px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xgkvf/btsJQJtaFPX/PN06L7BVC6Ov7QAjkR7emK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXgkvf%2FbtsJQJtaFPX%2FPN06L7BVC6Ov7QAjkR7emK%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;773&quot; height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-4f030aa5-db11-4c3e-8bc0-7c418ded7855&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-a7ab5068-f990-4ada-9f22-4642aca357a0&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그리고 System Settings &amp;gt; Virtual Keyboard 에서 Fcitx 5 Wayland Luncher를 선택하시면 됩니다. 그리고 Input Method 메뉴에 들어가서 'Hangul'을 찾아 추가해주시면 끝납니다. 세부설정에서 Korean을 입력하셔도 되는데, 건너뛰어도 큰 문제는 없는 듯 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e65c3bdb-c051-42e2-9c23-7ee8667466d2&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-bdfb35e1-d5bc-4aa5-91bb-3e76525db7cf&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 환경변수를 기반으로 동작하는 ibus와 달리 fcitx는 KDE에서 Wayland 기본 입력기를 기반으로 동작합니다. 이에 따라 electron 앱을 실행할 때는 Wayland IME를 활성화해주어야 하는데, 이 내용은 글 하단에 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7c54cfeb-58b4-4825-aeb6-525a3474559a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5a9b49fd-b18e-4601-8967-66eeadf18ed8&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; X11 앱의 경우 GTK_IM_MODULE과 QT_IM_MODULE를 앱별로 설정해야 합니다. 전역으로 설정하면 안 됩니다. 또한 Keyboard &amp;gt; Key Bindings &amp;gt; Korean Hangul/Hanja Keys에서 R_Alt를 한영 키로, R_Ctrl을 한자 키로 매핑해두면 좋습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3a57bc79-5800-4031-b642-bb4171493cd3&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2120ed15-8619-4b3a-a039-1f207c890974&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 id=&quot;SE-49d832a9-5821-4a12-bc55-a57523bf90ce&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;기타 프로그램 및 드라이버 설치&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-4b510e36-7bfd-4045-815b-fba2e8ee42f9&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-779f0ac2-cdcd-4dbe-8a61-4817ad471924&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-38b6bf27-671c-400f-aadc-2df753113724&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 문단에서는 다양한 프로그램 및 드라이버를 설치합니다. 쭉 읽어보시고 자신이 사용할 것들만 설치하시기 바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-54d8e227-2c04-4e23-9202-2673db9973c0&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;사운드 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727665054892&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S alsa-{utils,plugins,oss}
$ sudo pacman -S {sof,alsa}-firmware
$ reboot&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d167ae4f-8297-4122-8ab6-ee2628a6c8c5&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-0a252b0f-83f6-4a21-9809-c6599b11583f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;소리가 안 나는 시스템들이 있을 겁니다. 그런 경우에는 위 명령어를 차례로 입력해주세요. 사실 위에서 나열한 모든 패키지가 필요한 건 아닐텐데, 삽질이 싫다면 다 설치하는 게 속 편합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9f1d7e5f-f63f-4af4-8845-0041ea1b9560&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;터치패드 및 펜 입력 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727665088480&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S libinput libwacom
$ swaymsg -t get_inputs         # 여기서 Identifier: 이후에 나오는 걸 확인하고,
$ swaymsg -t get_outputs        # 여기서 Output &amp;lt;name&amp;gt; 'Product Name...'을 확인하세요
$ echo &quot;input &amp;lt;Identifier&amp;gt; map_to_output &amp;lt;name&amp;gt;&quot; &amp;gt;&amp;gt; ~/.config/sway/config&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-471b449f-b74f-474e-9da6-752dd6bd489d&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-3701d8ac-7605-46c7-b420-6fe6ad177a2a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; Wayland 환경에서는 별도의 보정 툴이나 설정 도구가 없으며, 필요하지 않습니다. GNOME 또는 KDE 설정에서 조작하시기 바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3df19ea7-6177-4611-87b0-61225f327a7b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;mkinitcpio.conf 수정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727665110246&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo nano /etc/mkinitcpio.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-431b7a64-131a-4baa-9f5a-2711a494367a&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;pre id=&quot;code_1727665127184&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## /etc/mkinitcpio.conf
MODULES=(asus_wmi)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-515986d5-40ca-4865-8207-74118ed9db54&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;노트북 사용자의 경우&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 각 노트북 제조사의 모듈을 넣어주세요.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;그래픽카드 사용자의 경우&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 인텔, AMD, NVIDIA 등 사용하는 그래픽카드의 드라이버를 설치하고, 모듈을 넣어주세요. 인텔 GPU의 경우 Plug-and-play가 지원됩니다. 사실 별로 만져줄 건 없어요. NVIDIA가 좀 삽질입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;저는 i915, asus_wmi, simpledrm 세 개를 두고 쓰는 중입니다. simpledrm은 KDE 사용자의 경우 필요하다고 하는데, 없어도 잘 동작하는 걸로 봐서 꼭 필요한지는 모르겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727665149715&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ yay -S mkinitcpio-firmware 
$ sudo pacman -S btrfs-progs      # btrfs 사용자 
$ sudo mkinitcpio -P&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-71127741-3cc2-48e4-90cd-5e494d3d8cae&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-9eb4247f-ad37-431b-904c-21d8b3638a6e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; mkinitcpio-firmware를 설치한 뒤 initramfs를 다시 생성합니다. 참고로 btrfs-progs를 설치한 경우 mkinitcpio.conf의 HOOKS에 btrfs를 추가해주어야 합니다. autodetect 앞에 쓰시면 됩니다. 그리고 fsck 앞에 resume을 넣어주시면 hibernation 기능을 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-857cde8e-b113-4df1-9362-bfbcc7fa87c1&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;프린터 및 스캐너 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727665163800&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S cups cups-pdf splix 
$ sudo systemctl enable --now cups 
$ yay -S samsung-unified-driver{,-{common,printer,scanner}}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-c59f3dee-8710-4cfc-bca6-48089980e7c9&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;프린터 시스템도 설치해야 합니다. 맨 마지막 줄의 경우 삼성 프린터 드라이버이므로, 삼성 프린터를 이용하지 않는다면 설치할 필요가 없습니다. 설치가 끝나면 localhost:631 에 접속하여 cups 프린터를 추가할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727665172717&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S nss-mdns
$ sudo systemctl enable --now avahi-daemon&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-6d108fbb-7560-484a-97cc-6b78f9da02d8&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;네트워크 프린터는 조금 더 설정이 까다롭습니다. 호스트네임 설정을 해준 뒤,&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727665179986&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo nano /etc/nsswitch.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-e6dd028d-3cbe-492b-bb89-7b79a2a0fd06&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;pre id=&quot;code_1727665219311&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## /etc/nsswitch.conf
hosts: mymachines mdns_minimal [NOTFOUND=return] resolve ...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-9215a270-1250-4949-a245-97031ffafa51&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;resolve 앞에 mdns_minimal [NOTFOUND=return]을 추가해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727665227819&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S sane-airscan ipp-usb&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-25f1a603-7edc-41ca-aeed-62fa88b69bbd&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-92b728f3-bcfe-424f-83c3-4b6434469def&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;다음은 스캐너입니다. ipp-usb는 USB 스캐너인 경우만 설치하면 됩니다. 이제 simple scan등의 프로그램을 사용하여 스캔이 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6f0ae301-fcc6-4671-98e3-aef83fca436d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;방화벽 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727665248855&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S ufw 
$ sudo pacman -S gufw       # GNOME만 설치 
$ sudo systemctl enable --now ufw&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-96216630-7cb3-4a4e-9a49-e703a621d2d9&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-cd7fff1d-4845-47b9-b3f6-bde9a3ae4c4e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;방화벽도 설치해줍니다. KDE Plasma의 경우 설정 앱을 통해 방화벽을 제어할 수 있어서 매우 편리합니다. GNOME의 경우 대신 gufw를 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-16f50992-ba2a-44f4-9d7c-1a38543633b6&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-980852af-bf22-4420-a21a-b7d4d138175f&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;Wayland 환경설정&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1727665281294&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S pipewire{,-audio,-alsa,-pulse} 
$ nano ~/.config/electron-flags.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-6d45f421-28aa-42e9-b6b3-7b7285a07008&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;pre id=&quot;code_1727665309193&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## ~/.config/electron-flags.conf
--enable-features=WaylandWindowDecorations,WebRTCPipeWireCapturer,UseOzonePlatform
--ozone-platform-hint=auto
--ozone-platform=wayland
--enable-wayland-ime&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-46ab5c13-d125-486c-a643-a73129d18987&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;위와 같이 입력하고, 저장합니다. 여기서 Wayland IME를 설정하게 됩니다. KDE를 사용하신다면 필수적인 작업입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727665323577&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cd ~/.config
$ cp electron-flags.conf chrome-flags.conf     # Chrome 사용시 
$ nano !$&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f9191969-64b2-4fb1-8aa5-9cc1ccb82ef7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;pre id=&quot;code_1727665342021&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## ~/.config/chrome-flags.conf
--enable-features=TouchpadOverscrollHistoryNavigation,(이것저것)
--gtk-version=4&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-168d6a78-05ac-4f12-836d-1452f7c7de16&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div style=&quot;background-color: #fdfdfd;&quot;&gt;
&lt;pre id=&quot;code_1727665351653&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cp electron-flags.conf code-flags.conf # VS Code 사용시&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-a0e31b97-6056-4f30-9054-7c99f9a1b99d&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-7d091fde-def6-41d2-ab83-1549fd31c48f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; Wayland는 아직 사용하기 까다롭습니다. 세부 설정을 직접 만져줘야 해서요. 그렇지만 제 글을 보러 오신 분들은 모두 Wayland를 사용하셨으면 좋겠습니다. Arch Linux의 롤링 릴리즈 특성상 항상 bleeding-edge 한 프로그램들이 설치되기 마련입니다. 최신 프로그램들의 변화가 낯설고 불편하다면, 우분투 LTS 등 다른 배포판으로 갈아타시기 바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ae3ac741-233c-4079-8f61-046fb2f0914e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-62881582-ca63-41fa-b03e-709d34e0efc5&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 id=&quot;SE-989a800d-9ce9-44bc-88d3-83772bb0d4a1&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;Zsh 설치&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-98673531-1fd1-4686-8032-62c538fbd596&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-3131b3fc-bd7b-43d4-8c2e-780858e42866&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 개인적으로 Bash를 별로 안 좋아합니다. 안 예쁘거든요. 아치리눅스 설치 미디어에서도 Zsh가 기본으로 탑재되어 있었죠. Zsh을 설치해서 터미널을 예쁘게 꾸며봅시다. 관심 없으시다면 bash를 계속 쓰셔도 무방합니다. 단, root 계정만큼은 bash를 고수하기 바랍니다. zsh 특성상 기능이 많아 버그가 발생하기 쉬운데, root 터미널을 실행할 수 없으면 정말 난감한 상황이 일어납니다. (1)번 글에서 Zsh를 설치했는데, 혹시 설치하지 않으신 분들은 여기서 설치하실 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727665369357&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo pacman -S zsh zsh-completions
$ chsh -s /bin/zsh
$ zsh&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-fee8d9ec-0279-4741-8382-5116788c1c23&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;처음에 뭐가 뜨면 q를 눌러서 나가줍니다. ZSH의 강점은 Bash보다 기능이 많고 예쁘다는 건데, 전혀 예쁘지 않은 쉘이 나오죠. 하나씩 설정해줘야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727665403918&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ yay -S oh-my-zsh-git zsh-{z-git,syntax-highlighting,autosuggestions} pkgfile
$ cat /usr/share/oh-my-zsh/zshrc &amp;gt;&amp;gt; ~/.zshrc # 플러그인을 등록하는 과정입니다. 아래에서 zshrc를 수정해야 적용됩니다.

$ cd /usr/share/oh-my-zsh/custom/plugins
$ sudo ln -s /usr/share/zsh/plugins/zsh-autosuggestions .
$ sudo ln -s /usr/share/zsh/plugins/zsh-syntax-highlighting .
$ sudo ln -s /usr/share/doc/pkgfile/command-not-found.zsh .

$ source ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-4184e7ce-fd39-4e08-b46b-4bdd69f52f62&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-59bf190b-9a8a-4492-bd45-280b9fb1fe05&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;oh-my-zsh라는 zsh 확장을 설치하고 zshrc를 설정합니다. zshrc를 리프레시하면서 아마 테마가 새롭게 바뀔 겁니다. zshrc 내부에 ZSH_THEME라는 변수가 있는데, 여기에서 테마를 지정할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/ohmyzsh/ohmyzsh/wiki/Themes&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/ohmyzsh/ohmyzsh/wiki/Themes&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1727665424108&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;Themes&quot; data-og-description=&quot;  A delightful community-driven (with 2,400+ contributors) framework for managing your zsh configuration. Includes 300+ optional plugins (rails, git, macOS, hub, docker, homebrew, node, php, pyth...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/ohmyzsh/ohmyzsh/wiki/Themes&quot; data-og-url=&quot;https://github.com/ohmyzsh/ohmyzsh/wiki/Themes&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/johM4/hyXaCf1rgd/47brfdI06slcYiX42LuPoK/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/G9dBx/hyXaIAxxF1/9fObK3drYLU1cusbn18KW1/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640&quot;&gt;&lt;a href=&quot;https://github.com/ohmyzsh/ohmyzsh/wiki/Themes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/ohmyzsh/ohmyzsh/wiki/Themes&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/johM4/hyXaCf1rgd/47brfdI06slcYiX42LuPoK/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/G9dBx/hyXaIAxxF1/9fObK3drYLU1cusbn18KW1/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640');&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;Themes&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  A delightful community-driven (with 2,400+ contributors) framework for managing your zsh configuration. Includes 300+ optional plugins (rails, git, macOS, hub, docker, homebrew, node, php, pyth...&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;div id=&quot;SE-6eddbbd0-5477-426a-8321-4df8acbc64d1&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;테마 목록은 위 사이트에서 찾아볼 수 있습니다. 저는 xiong-chiamiov-plus 테마를 변형해서 사용중입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727665436027&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cd /usr/share/oh-my-zsh/themes
$ cp &amp;lt;원하는 테마&amp;gt;.zsh-theme ../custom/themes/&amp;lt;자신만의 이름&amp;gt;.zsh-theme&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-13c0bb78-e418-47e6-88b8-4e9ea4fcd0a3&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-f5e32f32-778b-43a4-8a9a-2467273f849c&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;원하는 테마가 있다면 위와 같이 복사한 뒤, 수정하시기 바랍니다. 이제 테마 이름은 여러분이 지은 이름이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-b2426b88-dc7a-4747-b6c8-2938e0558752&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SIvnZ/btsJQWsn8E2/KMga8o7DU9gHH7DsNBwVOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SIvnZ/btsJQWsn8E2/KMga8o7DU9gHH7DsNBwVOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SIvnZ/btsJQWsn8E2/KMga8o7DU9gHH7DsNBwVOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSIvnZ%2FbtsJQWsn8E2%2FKMga8o7DU9gHH7DsNBwVOk%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;936&quot; height=&quot;340&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;340&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-e892da71-c5a6-4593-9cb1-ac2c7d32d5df&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;참고로 이게 좀 어렵습니다. 공식 문서 참고하면서 좀 삽질을 하다보면 그래도 어느 정도 익혀지긴 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727665478612&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## ~/.zshrc
ZSH_THEME=&quot;&amp;lt;아까 만든 테마 이름&amp;gt;&quot; 

...

ENABLE_CORRECTION=&quot;true&quot;
HIST_STAMPS=&quot;yyyy-mm-dd&quot;

...

plugins=(
	git
	command-not-found 
	zsh-autosuggestions
	zsh-syntax-highlighting
)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2c488bce-2dcb-4067-a7e6-3cc009507949&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-6b339ce6-23c2-43ba-80b0-5906c208c404&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;.zshrc에서 위와 같이 바꾸어주세요. ZSH_THEME와 plugins는 필수적으로 바꿔야 합니다. 또한, ENABLE_CORRENCTION=&quot;true&quot; 앞의 주석을 해제하시는 것도 좋습니다. 다만 후술할 The Fuck과 역할이 약간 겹치기 때문에 이 부분은 본인 선택에 맡기겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-5dc50df8-4ecc-4419-8c2a-b56938419cd0&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-64941134-cc07-4991-a6f5-d91ebb1dc407&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-7fc28982-f63b-4bdf-aa69-bfac40c449e7&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이쯤되면 이제 거의 사용 가능한 수준이 되었습니다. 다음 글에서는 세세한 설정을 알아보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Linux</category>
      <author>카루-R</author>
      <guid isPermaLink="true">https://karupro.tistory.com/126</guid>
      <comments>https://karupro.tistory.com/126#entry126comment</comments>
      <pubDate>Mon, 30 Sep 2024 12:04:45 +0900</pubDate>
    </item>
    <item>
      <title>Arch Linux 설치 가이드 1: 파티션 분할과 부트로더 설치까지</title>
      <link>https://karupro.tistory.com/125</link>
      <description>&lt;div id=&quot;SE-36b70b9f-e199-41f0-afc3-95dc5b85f208&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-683e8948-b93b-4731-81cd-6b5636741daf&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;환영합니다, Rolling Ress의 카루입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a287ce4d-2c42-43fe-a61e-1b114bce960a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-971c3b05-c556-4784-aac3-ed2a83318575&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이전에 써둔 아치리눅스 설치 포스트가 너무 오래되어서, 다시 써보려고 합니다. 확실히 롤링 릴리즈 배포판이라 그런지 설치 방법도 계속 변하네요. 여튼, 시작하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-bd82ecd4-0517-4cd9-9b3e-6dcb770ddd7d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-872119ea-f52d-40fd-bbd5-39ec9bfd86fe&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #54b800;&quot;&gt;&lt;u&gt;&lt;b&gt;※ 2024. 09. 29 업데이트:&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;span style=&quot;color: #54b800;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #54b800;&quot;&gt;​&lt;/span&gt;&lt;span style=&quot;color: #36851e;&quot;&gt;새롭게 수정한 부분이 있어 글을 업데이트합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;&lt;u&gt;&lt;b&gt;※2026. 02. 12 업데이트:&lt;/b&gt;&lt;/u&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;수정 내역 업데이트&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-897b9828-779d-4a2f-bbbe-e154ccd6fb7c&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6a613abb-3d49-4d1e-aee0-6aabb62410d1&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-58bb1cd8-2b30-4d7f-b82d-d7ad5332c671&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;라이브 부팅 및 설치 준비&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;파티션 분할 및 마운트&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;베이스 시스템 설치 및 설정&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;부트로더 설치&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;AUR 헬퍼 설치&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-5faf18b1-e9a0-40ae-a3a9-ae913ce2673b&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-0b5a7fa7-7fd7-4d6e-84a8-da8993704bd6&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-a16784e5-2176-4fa0-947c-0f7bfff107bb&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;만약 새로 Windows와 Arch Linux를 같이 설치하신다면, EFI 파티션은 적어도 512 MiB, 넉넉하게 1 GiB정도는 잡아두시기 바랍니다.&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;아치리눅스는 커널을 모두 EFI 파티션에 담아두기에, EFI 파티션이 작으면 큰 불상사가 일어날 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-dbcf6970-de70-44ed-9d9f-fa5e3ffab29e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a96d7bb1-18c4-4969-a9ab-696f815fd47a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아래 링크에서 아치리눅스를 다운받으시기 바랍니다. Rolling Release 배포판이므로 항상 최신 버전이 게시되어 있습니다. 이 글을 작성하는 시점에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;*2026. 02. 01.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;버전이 최신이군요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-fed45d7f-1407-458f-95e8-d21016fd559f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://archlinux.org/download/&quot;&gt;https://archlinux.org/download/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;figure id=&quot;og_1770897712442&quot; contenteditable=&quot;false&quot; data-og-image=&quot;&quot; data-og-url=&quot;https://archlinux.org/download/&quot; data-og-source-url=&quot;https://archlinux.org/download/&quot; data-og-host=&quot;archlinux.org&quot; data-og-description=&quot;Arch Linux Downloads Release Info The image can be burned to a DVD, mounted as an ISO file, or be directly written to a USB flash drive. It is intended for new installations only; an existing Arch Linux system can always be updated with pacman -Syu. Curren&quot; data-og-title=&quot;Arch Linux - Downloads&quot; data-og-type=&quot;website&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://archlinux.org/download/&quot; data-source-url=&quot;https://archlinux.org/download/&quot;&gt;
&lt;div style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;Arch Linux - Downloads&lt;/p&gt;
&lt;p style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;Arch Linux Downloads Release Info The image can be burned to a DVD, mounted as an ISO file, or be directly written to a USB flash drive. It is intended for new installations only; an existing Arch Linux system can always be updated with pacman -Syu. Curren&lt;/p&gt;
&lt;p style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;archlinux.org&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;/div&gt;
&lt;div id=&quot;SE-60ea53b9-343b-4ba0-a749-a83cc211c3da&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-f924be95-0a2a-4a3f-b072-1e45ed1193dd&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;다운받은 후 rufus를 이용하여 USB에 담아주시면 됩니다. Secure Boot를 해제하고 USB로 부팅해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;SE-a073c0dc-30c6-4585-8cc7-9e640354f0b4&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-a3e81936-8f3e-4714-aa16-aa1918475c13&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;라이브 부팅 및 설치 준비&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-8dbbf180-3bce-4e54-beab-cef79cdacbfe&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-c23b2c01-1b23-4968-901a-c1322bcfd8f5&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;첫 화면에서 Arch Linux Installation Media ~ 가 써있는 첫 번째 항목을 선택하시면 됩니다. 라이브 미디어인만큼, 시간이 좀 걸립니다. 램디스크를 만들고 부팅하는 작업이 필요하기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-3c19174e-28c6-472f-8c84-4e7d5cbbcbb7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qa2p9/btsJQFqQAFa/OwwIxSmxxW2t8KKar0pTe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qa2p9/btsJQFqQAFa/OwwIxSmxxW2t8KKar0pTe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qa2p9/btsJQFqQAFa/OwwIxSmxxW2t8KKar0pTe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqa2p9%2FbtsJQFqQAFa%2FOwwIxSmxxW2t8KKar0pTe1%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;607&quot; height=&quot;269&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;269&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d36f7671-dc29-4c30-bdae-ed63ae93f52b&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-a8954d9e-0161-4900-8fe1-5f97cec90d03&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;성공적으로 부팅이 되었다면 Zsh이 맞이해줍니다. 맞습니다. GUI 따위는 없습니다. 모든 걸 CLI에서 해야 합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #36851e;&quot;&gt;*최근 들어&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #36851e;&quot;&gt;&lt;b&gt;archinstall&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #36851e;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이라는 인스톨러가 기본적으로 내장되어 더 이상 삽질을 하지 않아도 됩니다. 다만 일반적인 아치리눅스의 설치와는 다른 방식으로 진행되며 기본 설정값 또한 차이가 있습니다. 본 가이드를 통해 아치리눅스를 설치할 수 있다면 굳이 인스톨러를 이용하는 건 추천드리지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-97776065-69b3-47ee-84fc-fe3268eeff7d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;부팅 모드 확인&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712443&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;cat /sys/firmware/efi/fw_platform_size&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&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;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;위 명령어를 입력해주세요. 64가 뜬다면, 성공적으로 UEFI 64bit 부팅이 된 겁니다. 에러가 뜬다면 UEFI 모드로 부팅이 안 된 겁니다.&lt;/span&gt;&lt;/p&gt;
&lt;div id=&quot;SE-11f4bd9f-8ef5-4e69-9480-bcfb5dd167ac&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;p id=&quot;SE-a09342c9-8caa-4bff-bf43-9d57b1ae5eab&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6abceb79-6988-407b-9ee5-012a792897b8&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;인터넷 연결&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-12b00a60-7192-4853-a8f5-2294d3b23550&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;다음으로 와이파이에 연결해야 합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;유선 인터넷이 연결되어 있다면 이 절차(iwd)를 생략하셔도 됩니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;무선 인터넷을 사용하는 경우, iwctl을 이용해 직접 인터넷에 연결해주어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712443&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;iwctl&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f0382e32-3e3e-4d1a-ab7a-65791011db05&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이제 Zsh이 아니라 iwctl 쉘이 뜨게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712443&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;device list&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-06c61c98-8eb2-419e-bba5-d680ba83b5cb&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;무선 랜카드를 출력하는 명령어입니다.&amp;nbsp;저는 wlan0이 잡혔습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712443&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;station wlan0 scan
station wlan0 get-networks&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f55a887b-1570-41d9-a223-a263812acabb&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;본인의 무선 랜카드가 wlan0이 아니라 다른 것으로 잡힌 경우, 해당 이름으로 바꿔주세요. 이 두 줄을 입력하면 네트워크를 스캔하고, 사용 가능한 네트워크 SSID를 출력해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712444&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;station wlan0 connect SSID&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-8d38ff8d-2a78-441e-ac24-3ed1af23ccd8&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;wlan0은 자신의 무선 어댑터 이름으로, SSID는 연결하고자 하는 네트워크의 이름으로 바꾸어주세요. 비밀번호가 걸려있는 경우 이 명령어 입력 후 Passphrase를 입력하는 칸이 나옵니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712444&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;exit&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-94ece263-c24b-476f-aeea-cfc4b72dd995&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;iwd 쉘을 나갑니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712444&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;ping -c 3 archlinux.org&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-6c3b7632-e32e-4446-bf79-f42ac380439c&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-876955df-0858-44cc-a73b-f18974f616c6&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;인터넷 연결을 확인합니다. 연결이 제대로 되지 않은 경우 다시 iwd 쉘을 실행해서 확인해보세요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-57a8f64d-f654-4e40-b55c-65598ba7cc5c&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;시간 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712444&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;timedatectl&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-7e366212-a7ea-472b-87af-4d1c822c4b48&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-ca775fe7-7e2b-4c15-b611-12478c22c2b7&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;timedatectl을 통해 시간이 정확한지 확인해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712444&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;timedatectl set-ntp true
timedatectl status
hwclock --systohc --utc&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-03f97621-8b79-4d69-9ff2-d6cd62c4f261&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-887e5c1d-2e5e-486b-80f9-8393a918c013&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그냥 이 상태로 설치를 진행하면 나중에 Windows에서 시간이 안 맞는 경우가 생깁니다. 위 명령어를 입력해주세요.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;인터넷에서 시간을 받아와 동기화하는 코드입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ea0d4394-8973-422d-ab9e-2b2c88c5f5a2&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-da9f5cbf-76dc-43df-bf43-abbda39d9e91&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-c13f6927-345c-4ce3-9fc9-201995e75b2f&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-1eabbc3d-84c4-4a86-aa8f-58b7903b88ed&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;파티션 분할 및 마운트&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-6aa37d33-b4f5-46a6-a535-a6f385827c14&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-861725f8-1996-4f51-9fee-53c22431840c&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;EFI 환경에서 윈도우는 최소 4개의 파티션, 아치리눅스는 최소 3개의 파티션을 사용합니다. 이때 두 운영체제에서 EFI 파티션은 공용으로 사용할 수 있습니다. 즉, 다음과 같은 파티션으로 구성됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-36aef8e7-5bf9-4de7-9e19-a75b0330bb11&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;윈도우 파티션: EFI(시스템), MSR, 주 파티션, 복구 파티션&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;리눅스 파티션: EFI(/boot), /(루트), swap&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;EFI(윈도우, 리눅스 공용) / MSR(윈도우) / 윈도우 / 복구(윈도우) / 루트(리눅스) / 스왑(리눅스)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1770897712445&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;fdisk -l # 파티션 타입 확인
lsblk -f # 파티션 레이블 확인&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-512e1c29-f391-423c-9509-a2e7399c287b&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;SE-86080c06-94d9-46c1-8e94-3bb0d49466c6&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;두 명령어 중 아무거나 쓰셔도 됩니다. 장착된 스토리지를 확인합니다. SATA 장치를 쓰고 있다면 /dev/sdX (sda, sdb, ...)와 같이 뜨고, NVMe SSD를 쓰고 있다면 /dev/nvme0n1 등으로 뜹니다. 저는 /dev/nvme0n1 장치를 사용하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712445&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;sfdisk /dev/nvme0n1 &amp;gt; nvme0n1.dump&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-840ac6d0-2754-4909-bbc9-4b052888840b&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-6838a4f6-c29f-458a-a664-64a71b730425&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;혹시 모를 상황을 대비해 파티션 테이블을 백업합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5ec2de4c-4a67-4099-8c5c-2d774750c357&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9b3fba90-fbaa-4e94-b42f-3d5711788a26&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이후부터는 각자 상황에 따라 다르게 진행해야 합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;아예 초기화하고 아치리눅스만 설치한다면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;조금 더 쉽긴 합니다. cfdisk /dev/nvme0n1 입력 후 파티션 설정해주면 되는데&lt;/span&gt;&lt;span&gt;, 여기선 윈도우와 부팅할 것이므로 파티션 테이블을 건드리지 않는 선에서 작업해야 합니다. 할당되지 않은 공간이 있다면 새로 할당해주세요. 이때, 파티션에 해당하는 코드를 지정해주어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-b967bd3f-5892-4bf6-bfb4-40daa753e5af&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-03c75e02-d615-4400-8c92-2f5fdec26df0&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;EFI 파티션: 코드 EF00 (EFI system partition)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;SWAP 파티션: 코드 8200 (Linux Swap)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;나머지(/ 파티션 등): 기본값&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1770897712446&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;mkfs.fat -F 32 /dev/nvme0n1p1
mkfs.ext4 /dev/nvme0n1p6      # 또는 mkfs.btrfs /dev/nvme0n1p6
mkswap /dev/nvme0n1p5&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-fbebc8bc-cf0f-408c-8328-fdc3f8eaef69&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-b43826bf-52fb-4cfd-aca3-76c58578e662&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;파티션 작업이 완료되면 포맷을 해주세요. ext4가 가장 무난하나, 고급 사용자의 경우 BtrFS를 추천드립니다. 파티션 번호와 파일시스템을 잘 확인해주세요. 파일시스템에 따라 안정성이나 성능 등에서 차이를 보일 수 있으므로 자신의 상황을 잘 고려하여 파일시스템을 선택하기 바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712446&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;e2label /dev/nvme0n1p6 &quot;Arch Linux&quot;                # ext4
btrfs filesystem label /dev/nvme0n1p6 &quot;Arch Linux&quot; # BtrFS
xfs_admin -L &quot;Arch Linux&quot; /dev/nvme0n1p6           # XFS
fatlabel /dev/nvme0n1p1 &quot;EFI&quot;                      # fat
ntfslabel &amp;lt;device&amp;gt; &amp;lt;label&amp;gt;                         # NTFS
swaplabel -L &quot;Linux Swap&quot; /dev/nvme0n1p5           # SWAP&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-31092f07-22ab-4b59-88a2-da6a8e8a166b&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;파티션 레이블을 지정합니다. 파일시스템에 따라 명령어가 다르니 잘 확인하세요. 필수적인 부분은 아닙니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712447&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;swapon !$     # !$: 위의 마지막 매개변수를 그대로 사용&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-fbd918e4-3d9a-48f2-9551-b72522a1c4fa&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Swap을 작동시킵니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712447&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;mount /dev/nvme0n1p6 /mnt
mount --mkdir /dev/nvme0n1p1 /mnt/boot
mount --mkdir /dev/nvme0n1pX /mnt/home # 다른 파티션도 마운트하는 경우&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-7e19a56e-7ddc-4392-9de3-a355320ee4bc&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;/ 파티션을 /mnt 폴더에 마운트해주세요. 이후 efi 파티션을 마운트합니다. mount에 --mkdir 옵션을 주면 자동으로 디렉터리를 생성하여 마운트해줍니다. /home, /usr/local, /tmp 등 별도의 파티션을 생성한 경우 여기서 모두 마운트합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712447&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;lsblk -f&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-be596cbc-5b70-41ee-909a-eac063dfd7a7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-ef26bd50-8fdf-4bc1-8d6b-946fe6e9718d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;lsblk를 이용하여 원하는 곳에 잘 마운트 되었는지 확인합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d2c85510-a334-4986-9cc6-0ba39ec633e4&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d70c79f6-a85f-4be1-b895-91bbe48691ab&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f1f2e5b4-808f-439f-9eeb-0f5ae5ff5532&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-28c3d3c5-8bdc-4c01-b152-757b2bdd4f26&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;베이스 시스템 설치 및 설정&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-cb302047-6d49-4333-8fc5-96a134cdb22d&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-06abf0ab-f28a-42f5-af48-2c8764a95e0e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;본격적으로 아치리눅스를 설치하겠습니다. 그 전에 빠른 다운로드를 위해 reflector를 설치하겠습니다. Syu가 아닌 Syy이므로 잘 보고 입력하시기 바랍니다. (Syy: 강제 갱신) 그리고 미러리스트를 업데이트합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712447&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;pacman -Syy reflector
cp /etc/pacman.d/mirrorlist{,.bak}
reflector -c &quot;KR&quot; -f 7 -l 5 -n 7 --save /etc/pacman.d/mirrorlist&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-719358a8-ffc3-404e-8f33-9d4590984f0e&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-7c8fb395-99ba-4e22-b86d-498270f588b2&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;c는 country, f는 fastest, l은 latest, n은 number의 축약형 옵션입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-76b18089-9985-44d8-b68a-d346b34727be&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;기본 패키지 설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712447&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;pacstrap -K /mnt base linux linux-firmware      # 반드시 설치해야 하는 패키지입니다.
pacstrap /mnt vim nano networkmanager man-{db,pages} git ntfs-3g # 중요한 패키지입니다.
pacstrap /mnt base-devel      # AUR을 사용하는 경우 설치해야 할 수 있습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-bd239e56-f157-479b-abfc-6ba6f78e73ea&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btayCe/btsJQWeOOhJ/95kaBSuKTmm3UAAznCKzx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btayCe/btsJQWeOOhJ/95kaBSuKTmm3UAAznCKzx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btayCe/btsJQWeOOhJ/95kaBSuKTmm3UAAznCKzx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtayCe%2FbtsJQWeOOhJ%2F95kaBSuKTmm3UAAznCKzx0%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;773&quot; height=&quot;317&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-daae3c2f-604c-40cf-af45-663c709813c0&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-b5650435-0888-45f5-b56b-4247c61bd98d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-K 플래그는 pacman의 키링을 새로 설정하는 플래그입니다. base 패키지는 커널이나 펌웨어 등 기초적인 것들을 모아둔 패키지입니다. 여기에 추가로 텍스트 에디터(nano), man 페이지, 네트워크 매니저 등을 추가로 설치해주겠습니다. 또한 아치리눅스의 경우 AUR을 사실상 필수로 사용하게 되므로, base-devel 패키지도 설치하도록 하겠습니다. 각자 상황에 맞게 조정하기 바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7efa0226-ad96-4d62-b093-2294b52d23bb&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;fstab 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712448&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;genfstab -U /mnt &amp;gt;&amp;gt; /mnt/etc/fstab
nano !$&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-bf61c44b-2231-4160-9161-765f992d1d2f&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-6e1cc1a5-8658-46c3-a83d-8e8806d7e63f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;fstab을 설정합니다. 부팅시 fstab 설정에 따라 파티션을 자동으로 마운트합니다. 이 파일이 잘못되는 경우 제대로 부팅이 되지 않습니다. -U 대신 -L을 이용해 UUID가 아닌 Label을 이용해 fstab을 생성할 수도 있으나, 저는 충돌할 일이 없는 UUID를 선호합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-68a69a8f-e791-4896-92bc-d6c225935ce1&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;fstab이 열렸으면, /boot 파티션의 umask와 dmask가 0022로 되어 있을 텐데 이걸 0077로 바꾸어주세요. 이렇게 하지 않으면 systemd-boot 부트로더를 설치할 때 경고가 발생합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #36851e;&quot;&gt;원래는 여기서 추가로 discard 옵션을 넣었으나, 최근 들어 자동으로 TRIM 옵션을 넣어주는 것을 확인했습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Windows와 Arch Linux가 공유할 파티션을 사용하는 경우, 이 파티션을 임의의 폴더에 마운트한 뒤 Download, Document, Pictures 등의 폴더를 bind하여 마운트할 수도 있습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #36851e;&quot;&gt;이때 ntfs-3g로 마운트한 파티션에는 windows_names 옵션을 넣어주어야 나중에 Windows에서 문제가 발생하지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712448&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;UUID=xxxxxx /home/shared ntfs-3g defaults,windows_names,discard,uid=1000,gid=984,umask=022 0 0

/home/shared/Downloads /home/karu/Downloads none defaults,uid=1000,gid=984,umask=022,bind 0 0&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-7667c162-65ac-43bc-99c4-388db0d63629&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-0f799387-4d20-4ca6-8861-2d9e30e0d64a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #36851e;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;시스템 진입&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712448&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;arch-chroot /mnt&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-e7aa9426-7812-40f0-961d-c304ed3d9114&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-ce05f13b-dac6-46ee-838d-f3da05deb56f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;모든 설정이 끝났으면 새로 설치한 아치리눅스 시스템으로 진입합니다. Zsh에서 Bash로 쉘이 바뀝니다. 이제 여기는 우리가 실제로 사용할 아치리눅스가 설치된 공간입니다. 여길 망가뜨리면 컴퓨터가 멀쩡할 리가 없으니 조심해서 다뤄주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f310e2ec-4375-4600-8e7f-5fdf2a89db76&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;시간대 및 로케일 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712448&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;ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
hwclock --systohc&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-a887596e-358f-46f4-a01f-b61dcc6f98b1&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;시간대와 UTC를 설정합니다. 한국이 아닌 다른 지역에서 거주하는 경우 적당히 zoneinfo를 바꾸어주세요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712448&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;nano /etc/locale.gen&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-505d7031-1d8e-4fa5-b8c8-85c9d1e1957f&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;214&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ESs63/btsJQV732XP/oHd3Qx97GM7fnlEIRqOWhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ESs63/btsJQV732XP/oHd3Qx97GM7fnlEIRqOWhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ESs63/btsJQV732XP/oHd3Qx97GM7fnlEIRqOWhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FESs63%2FbtsJQV732XP%2FoHd3Qx97GM7fnlEIRqOWhK%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;214&quot; height=&quot;97&quot; data-origin-width=&quot;214&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-0804467d-3403-45c4-b136-327c3892fc23&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;locale.gen 파일을 수정합니다. Ctrl+W 키를 누른 뒤 ko_KR을 입력한 뒤 엔터를 눌러주세요. 그 후 ko_KR.UTF-8 앞의 주석을 지워주시면 됩니다. Ctrl+X, Y, (엔터)를 순서대로 눌러주시면 저장됩니다. 저는 ko_KR.UTF-8, en_US.UTF-8 두 가지를 사용중입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712449&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;locale-gen
echo LANG=en_US.UTF-8 &amp;gt; /etc/locale.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-84e06f91-20d7-4f19-9b3b-bbcad267bcfd&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-897f2be3-8c4f-4d3d-b928-fdafd1e8edee&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;설정한 로케일을 생성 후 기본 로케일을 설정합니다. 저는 en_US를 사용하겠습니다. ko_KR로 사용하면 tty 콘솔 모드에서 글자가 와장창 깨지더라고요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-359a2c7e-7156-4c10-a1c5-868b468c1b1a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;호스트 네임 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712449&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;echo ArchLinux &amp;gt; /etc/hostname&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-eafec3c1-ce6f-4ef7-814a-4f6f1384e67b&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-9c171821-9a63-482b-a3b1-a0d362e3e1d4&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;호스트 이름을 설정합니다. 여러분이 사용하는 컴퓨터의 이름이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-12030e28-7e19-48ec-9e08-8558e2483499&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;계정 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712449&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;passwd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-79d2cef9-874f-46cf-aba2-52708790501e&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;루트 계정의 패스워드를 설정합니다. 두 번 입력하시면 됩니다. 패스워드는 보이지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712449&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;pacman -S zsh                         # zsh 사용자
useradd -m -G wheel -s /bin/zsh karu  # /bin/bash도 좋습니다
passwd karu&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-6623745a-979f-43e6-9c69-7310cbe3ae27&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-fa7fc4cd-271d-4840-8d6d-d7dab0e4c063&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-m : 홈 디렉터리를 생성합니다. 제 경우 /home/karu가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c7df3f5a-7139-475e-82f3-6e37ab6fe840&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-G : 그룹을 설정합니다. wheel은 sudo를 사용할 수 있습니다. (추가 설정 필요)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c584fad2-2180-4a35-a70f-a08bdbb0995e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-s : 기본 쉘을 설정합니다. bash를 사용하신다면 /bin/zsh 대신 /bin/bash를 사용하시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-fc9d4007-e304-4c87-aa15-219cca9d642e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그리고 새로 생성한 계정의 패스워드를 설정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-cbb378e2-53be-461f-942b-f2711e4dfbd7&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #36851e;&quot;&gt;일부 설치 가이드의 경우 wheel 외에 audio,video 등 다른 그룹에도 사용자를 넣으라고 하는데, 그렇게 하면 안 됩니다. 나중에 충돌이 일어나 시스템이 망가질 위험이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712449&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;EDITOR=nano visudo&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-39ceacc0-13f9-4e8a-ae17-0a266ea5717c&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-b5a53a46-87e7-48ab-8817-ca04582c13ce&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;참고로 그냥 저렇게 끝내면 나중에 사용자 계정에서 sudo를 사용할 때 sudoers 파일에 없다는 오류가 뜹니다. /etc/sudoers 파일을 편집해줘야 하는데, 이 파일을 직접 손대면 안 되고 visudo라는 명령어를 통해 편집해야 합니다. 이름 그대로 vi로 편집하게 되는데, nano로 편집하고자 한다면 앞에 EDITOR=nano를 붙여주세요.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-cfedd48e-0a9a-40c7-9b2c-a3a566c413e8&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3E31T/btsJQaSuWAN/bTpmNyM5eAS9pSCVnCRkOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3E31T/btsJQaSuWAN/bTpmNyM5eAS9pSCVnCRkOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3E31T/btsJQaSuWAN/bTpmNyM5eAS9pSCVnCRkOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3E31T%2FbtsJQaSuWAN%2FbTpmNyM5eAS9pSCVnCRkOk%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;548&quot; height=&quot;121&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-8cbb4aa5-0116-4a18-9d0c-4e53bd212ebd&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-1da15cea-7930-43b8-b1ff-b3f20462c25f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;%wheel ALL=(ALL:ALL) ALL 앞의 주석을 지워줍니다. 패스워드를 사용하고 싶지 않다면 이것 말고 하단의 주석을 삭제하시면 되는데, 추천하지는 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-eebbe232-6554-496e-947a-95c73ed00eac&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-9203051f-d0df-4fb1-ae80-3b7e28a9029f&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-ae7bb7d2-267f-4e31-a53e-35495fc707a8&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;부트로더 설치&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-b04cf6a3-7890-4e3e-a136-84d7deea10a5&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-6e2cb6e5-6f02-4096-907a-5e3f84535441&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-cc8969b5-fc9b-49ec-93ea-94cbbf78d755&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;GRUB이 아닌, systemd-boot를 사용합니다. 일반적인 리눅스는 대부분 GRUB을 사용하고 있죠. 아치리눅스는 미니멀함이 철학인 배포판인 만큼, systemd-boot를 선호하는 분들이 많습니다. 가볍고, 빠릅니다. 여기선 systemd-boot로 설치하는 방법을 소개하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-35d8e650-1881-496a-a36d-523c424379f0&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-678bb8ed-fd6c-4a0d-a1e7-40cd9a934ecc&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;참고로 원하는 경우&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;부트로더 없이 UEFI에서 커널을 직접 부팅(!)시킬 수도 있습니다&lt;/b&gt;&lt;/span&gt;&lt;span&gt;. EFI stub이라고 하는데, 여기에 파라미터나 마이크로코드를 작동할 수 있게 얹은 게 UKI입니다. 다만 EFI stub이나 UKI를 사용하는 경우 윈도우와 듀얼부팅이 안 됩니다. 아치리눅스만 쓸 경우 좋은 선택이 될 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-64d6f8d0-50f4-4586-8f4e-47cdd8e5ea14&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[선택 1] EFI boot stub 설치 (efibootmgr)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712450&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;pacman -S efibootmgr
efibootmgr --create --disk /dev/nvme0n1 --part (efi파티션 숫자) --label &quot;Arch Linux&quot; --loader /vmlinuz-linux --unicode 'root=/dev/nvme0n1pX initrd=\initramfs-linux.img'

## 예시
efibootmgr --create --disk /dev/nvme0n1 --part 1 --label &quot;Arch Linux&quot; --loader /vmlinuz-linux --unicode 'root=/dev/nvme0n1p6 initrd=\initramfs-linux.img'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-5a383ba1-4db4-4e73-bfb9-5c312ca37974&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-83541b73-a3e5-41f5-8b49-c717171c342c&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;경고: 위 구문은 efibootmgr를 이용하여 EFISTUB를 이용하실 분들만 입력하세요. 그렇지 않은 분들은 아래의 systemd-boot를 설치하시기 바랍니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-aa3851e1-7acf-4f67-bdbd-0e4c9cfb8d01&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[선택 2] systemd-boot 설치 (bootctl)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712450&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;bootctl install
systemctl enable systemd-boot-update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-33b2c9c2-b0db-472b-b4b1-ade5d13d67d3&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;systemd-boot 부트로더를 설치하고, 자동 업데이트를 설정합니다. systemd 버전 250부터 자동 업데이트 서비스를 지원하기에 이걸 켜주면 부팅시마다 자동으로 업데이트 해줍니다. 이 외에 pacman hook을 설정하는 방법도 있지만, 생략하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712450&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;nano /boot/loader/loader.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-ba9c99a9-a1e4-4488-b49b-971021086509&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;pre id=&quot;code_1770897712450&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;## /boot/loader/loader.conf
default @saved         # auto-windows
timeout 0
console-mode max       # max, keep : FHD 이하는 max 추천
editor 0&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-1ba944f3-65e7-4197-9007-84f9353cce3c&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-3e98a9cb-551f-4506-8e40-16b262aff747&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;loader.conf를 설정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d9d7f930-4be9-4e3d-94b5-4e73c88e0174&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-470db446-5e08-4f74-97b4-77e0ae08ef73&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;default: 기본 부팅 옵션입니다. 윈도우를 원하는 경우 auto-windows로, 리눅스로 설정하는 경우 arch.conf로 설정합니다. 뒤에서 작성할 파일명과 이름이 같아야 합니다. 지난번에 부팅한 옵션을 원하는 경우 @saved를 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;editor : 엔트리 수정 가능 여부입니다. 1은 수정 가능, 0은 수정 불가입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712451&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;pacman -Syu intel-ucode     # Intel CPU 사용자
pacman -Syu amd-ucode       # AMD CPU 사용자&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-76801fc3-11cb-4ebd-bff3-aba39db9a539&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;다음으로 마이크로코드를 설치합니다. 자신의 CPU에 맞추어 둘 중 하나의 명령어를 입력합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712451&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;nano /boot/loader/entries/arch.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-ba2042ce-5529-400b-84d6-fb1159400fa6&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;pre id=&quot;code_1770897712451&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;title Arch Linux
sort-key arch
linux /vmlinuz-linux
initrd /intel-ucode.img         # 인텔 사용자
initrd /amd-ucode.img           # AMD 사용자
initrd /initramfs-linux.img
options root=UUID=XXXXXXXXXXXXXXXXXX rw&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-a6dedeac-1d22-4336-afc5-c23cdfc05f4e&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;새로운 부팅 엔트리를 작성하겠습니다. 2행에서 vmlinu'&lt;/span&gt;&lt;span&gt;&lt;b&gt;Z&lt;/b&gt;&lt;/span&gt;&lt;span&gt;'가 맞으니 잘 보고 적어주세요. 3, 4행은 둘 중 하나만 작성해야 합니다. 마지막 줄은 자신의 루트 파티션이 맞도록 수정하시면 됩니다. UUID는 fstab을 보면 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712451&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;nano /boot/loader/entries/arch-fallback.conf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f0db4aa0-9818-4ced-a002-264641765b98&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;pre id=&quot;code_1770897712451&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;title Arch Linux (fallback initfamfs)
sort-key arch-fallback
linux /vmlinuz-linux
initrd /intel-ucode.img           # 인텔 사용자 
initrd /amd-ucode.img             # AMD 사용자
initrd /initramfs-linux-fallback.img
options root=UUID=XXXXXXXXXXXXXXXXXX rw&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-814f7677-f471-4209-8346-52598ba8a9fe&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;혹시 모를 상황을 대비하여 fallback 엔트리도 만들어줍니다. fallback이 추가된 것을 확인할 수 있습니다. 이 정도 되면 이제 기본 설치는 거의 끝났다고 보시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712451&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;bootctl list&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-31d5e8f6-8f3e-46b0-a72d-076ae254cde9&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-eb6c0396-f392-44b7-a811-37e44b903f21&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;우리가 등록한 옵션이 잘 등록되었는지 확인합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f276089e-7eb0-4da4-80e7-1d46ba57fd2e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;네트워크 및 블루투스 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712451&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;pacman -S bluez{,-utils}
systemctl enable NetworkManager bluetooth
exit
umount -R /mnt
reboot&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-e61d8143-92e6-4ba6-8937-7b83c84fb29f&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-a63ffb30-e19b-41ec-951e-23f32801b028&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이제 본격적으로 설치 시스템과 현재의 아치 시스템을 분리하겠습니다. NetworkManager과 블루투스를 실행해준 뒤, chroot된 시스템을 나갑니다. 그럼 다시 Zsh이 뜰 거예요. 여기서 마운트 된 모든 디스크를 분리해주고, 재부팅합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;이제 설치 USB는 제거하셔도 됩니다&lt;/b&gt;&lt;/span&gt;&lt;span&gt;. 굳이 재부팅하지 않고 systemctl start 해서 계속 진행할 수도 있는데, 추천드리지는 않습니다. 특히 하단에서 root를 쓰면 안 되는 상황이 생겨서요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ee0677d5-0dc5-4922-a2e2-389fe5527fff&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;재부팅 후, 이제부터는 root가 아닌 자신의 계정으로 로그인하시기 바랍니다. 저는 karu 계정을 사용하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712452&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;$ ping -c 3 archlinux.org
$ nmcli device wifi list
$ nmcli device wifi connect &amp;lt;SSID&amp;gt; password &amp;lt;PASSWORD&amp;gt;
$ nmcli connection show&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-cf04062b-34a8-4c4b-bbb7-1bcb6bc4a5e2&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-86ece290-012e-4385-8a22-86c45ad193de&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;재부팅 하고, 아까 만든 계정으로 로그인합니다. Zsh을 설치한 경우 처음에 안내문이 나올텐데, q를 눌러 나가주시면 됩니다. 이 설정은 다음 글에서 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5f237a25-65dd-4137-9040-520eeb3cd960&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2c947b26-e1f0-41f8-8e5a-f585ce21d858&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Wi-Fi가 다시 안 될 겁니다. 거듭 말씀드리지만 랜선을 이용하신다면 문제가 없습니다. ping을 해보고, 오류가 나면 수동으로 Wi-Fi 네트워크에 연결해주세요. 명령어 자체는 비슷합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a17636a4-6f4b-429b-a697-e1c830c5874d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-7b6061f4-cd17-47e5-b8fb-a9eda25941b4&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-005080ce-09fa-4ec9-a0c8-706522d7670e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;AUR 헬퍼 설치&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-bd110401-28d8-4d96-a590-8374d899a801&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-ed9687d5-783b-414f-be5f-6d91cdf09725&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2d05cebb-7af0-4639-95a5-95eb5b1a3786&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;원래 여기서 끊고 2편으로 넘어갔으나, yay 설치까지는 끝내도 될 것 같아서 내용을 추가합니다. 아&lt;/span&gt;&lt;span&gt;치리눅스의 꽃은 AUR, Arch User Repository입니다. 사실 아치 공식 레포만 치면 패키지가 그렇게 많은 편은 아니에요. 그러나 AUR 덕분에 아치에서는 수없이 많은 패키지를 사용할 수 있습니다. 다만 말 그대로 Official이 아닌 User 레포이기 때문에, 패키지 설치 및 사용시 문제가 발생할 수 있습니다. AUR과 관련된 문제는 아치위키나 포럼 등에서 도움을 받을 수 있기에 이를 이용하면 도움이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-bc073902-0b05-4ce4-87df-dbcd627364a1&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;AUR 헬퍼가 없다면 브라우저에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;a href=&quot;https://aur.archlinux.org&quot;&gt;https://aur.archlinux.org&lt;/a&gt;&lt;/span&gt;&lt;span&gt;에 접속하여 검색 후 일일이 패키지를 다운받아야 하지만, 우린 그런 수고를 하지 않겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712452&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;su karu&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-049cbd01-17f9-406c-90a8-df5615e960b1&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;재부팅하지 않고 여기까지 계속 내려왔다면, 이제는 새 계정을 사용해주세요. karu 대신 여러분의 아이디를 넣으면 됩니다. 비밀번호는 아까 정한 비밀번호를 입력해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712452&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;$ git clone https://aur.archlinux.org/yay-bin
$ cd yay-bin
$ makepkg -si
$ cd ..
$ rm -rf yay-bin&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-8efc1655-b472-4faa-8381-6b87c75c980f&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;makepkg는 패키지를 만들어 설치하는 명령입니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;절대로 여기에 sudo를 쓰시면 안 됩니다. root 계정으로 makepkg를 실행하셔도 안 됩니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;보안상의 위험 때문에 그렇습니다. 혹여나 PKGBUILD 파일에 시스템을 날려버릴 수 있는 코드가 삽입되었을 수도 있으니까요. (AUR은 공식 레포가 아닌, 이용자들이 자유롭게 올리는 레포임을 항상 명심해두어야 합니다) 이런 이유 때문에 root 계정으로 makepkg를 실행하는 건 막혀 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712453&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;$ yay&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-3e70b8fa-444c-48a5-93a8-99305d63129c&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-a8cc4970-b528-469f-aac7-e8a7c41c04fd&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;시스템 업데이트는 yay 한 방이면 끝납니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2e52a3f0-b4ae-470c-a2d8-0418ec682084&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;[선택사항] 부팅시 neofetch 자동 실행&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770897712453&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 pacman -S neofetch
$ echo &quot;neofetch --os_arch off --speed_shorthand on --cpu_temp C --shell_version off&quot; &amp;gt;&amp;gt; ~/.zprofile&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-fadbf78e-cd19-4d2b-9655-794bf41bec3e&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-3a6b6276-3288-4022-abf8-b8b27bd589bb&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;.zprofile은 Zsh로 로그인을 했을 때 실행되는 파일입니다. Bash를 쓴다면 .bash_profile이 그 역할을 합니다. TTY에서 로그인한 경우 neofetch를 실행하여 Welcome Screen을 만들 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f85b8dfe-cb8b-4e66-aa27-457ddf83bf43&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-61bd3de2-09c2-40d7-909a-4ef27af5029e&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-6fabf42e-4f32-40a0-9137-7923798ecab1&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;수고하셨습니다. 이제 아치리눅스 설치에 성공하셨습니다. 다만 이대로 사용하기에는 무리가 있죠. 아직 GUI 환경도 설치하지 않았으니까요. 이어서, 필수적이지는 않지만 중요한 설정들을 다루고자 합니다. 다음 글에서 뵙겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Linux</category>
      <author>카루-R</author>
      <guid isPermaLink="true">https://karupro.tistory.com/125</guid>
      <comments>https://karupro.tistory.com/125#entry125comment</comments>
      <pubDate>Mon, 30 Sep 2024 11:38:39 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 코딩 효율을 높여주는 10가지 문법들 (ft. Pythonic한 코드란?)</title>
      <link>https://karupro.tistory.com/124</link>
      <description>&lt;div id=&quot;SE-8082bfb0-f922-4ea1-96f6-5ffaea0c59cf&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-0093edb4-de1e-4a26-989d-472a02c9d7ac&quot; style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;환영합니다, Rolling Ress의 카루입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-fd9b182f-6105-4982-8793-e3fe91cdf34b&quot; style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a9ea0725-45b7-4493-a3bc-cd7c6d9130d2&quot; style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 파이썬에서는 'Pythonic'이라는 형용사가 있습니다. 말 그대로, &lt;/span&gt;&lt;span&gt;&lt;b&gt;파이썬스러운&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 코드를 의미해요. 기존 파이썬 문법들과 크게 차이가 나지 않고, 간결하며 의미를 명확하게 이해하기 쉽다면 그런 코드는 모두 Pythonic하다고 볼 수 있겠습니다. 귀찮은 문법을 간결하게 표현할 수 있는 'Syntax sugar'와 어느 정도 일맥상통한다고 볼 수 있겠어요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9ddd56d6-e332-4647-93c4-836d6e871056&quot; style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-dc52cb6d-6a8c-4733-b546-1c8f30b53ed3&quot; style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 오늘은 Python의 코딩 효율을 높여주는 편리한 문법들을 살펴보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-a601bf72-0261-4bb9-8e43-2af803d2aaef&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-b2aa583c-4ae5-48a7-8b5e-9d432291edba&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-405b501f-eac4-428e-882a-f0d0b10bf959&quot; style=&quot;color: #000000; text-align: var(--se-sectionTitle-default-title-text-align);&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;1. List comprehension&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-6b2618c5-eacc-41c7-89a8-408b8a718ccd&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-2bd5bd62-c4be-484c-91f7-2bd2d5441abc&quot; style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2의 배수를 리스트(배열)에 저장하는 코드를 작성해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727111631039&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;l = [] # 리스트를 선언하고
for x in range(1, 21): # 반복문을 돌며
  if x % 2 == 0: # 짝수라면
    l.append(x) # 추가한다&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-e797b01e-86e6-4dd9-8e66-73ec7a622978&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아마 다들 이런 코드를 생각하셨을 겁니다. 그러나, 이 코드는 복잡하고 귀찮습니다. 다음 코드를 보시죠.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727111643418&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;l = [x for x in range(1, 21) if x % 2 == 0]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-484860c6-ab56-4b6e-9dae-2e32e4000da8&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-54684f9c-a55c-4389-8817-8190b8c93657&quot; style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 한 줄로 간결하게 for문을 축약했습니다. if 키워드는 생략이 가능하고, for 키워드만 있어도 됩니다. 미리 iterable한 객체를 만들어두고 이를 list에 담아둔다고 생각할 수도 있어요. 이름은 'list' comprehension이지만, set이나 dict 등에서도 사용이 가능합니다. 처음 보면 어색할 수도 있지만, 알고 난 뒤엔 애용하게 될 겁니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-96d1fb32-c480-48ca-b8b4-8abba9bb5d96&quot; style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-fc53f229-2b18-46af-bb64-663b81739faa&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-a2c6768f-c4a6-4480-834f-edc986b9c343&quot; style=&quot;color: #000000; text-align: var(--se-sectionTitle-default-title-text-align);&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;2. * (asterisk)&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-be3d6f4d-7c6c-4390-ac31-15070cabb1a7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1부터 10까지 수를 리스트에 저장해봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727111650020&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;l = [x for x in range(1, 11)]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-1817cd38-cba2-466e-89b8-ce544301d5e5&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;오, 바로 위에서 list comprehension을 배웠으니 이렇게 한 줄로 간결하게 작성할 수 있다고요? 아쉽지만, 이 코드도 아직 지저분합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727111656606&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;l = [*range(1, 11)]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-fe579e98-51d5-4e8d-bd14-86e1e6c168ba&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-b6e5156c-40c4-4eb2-87ac-3d861446ea74&quot; style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; '묶음' 앞에 '*'를 붙이면 묶음을 개별 요소로 풀어줍니다. 여기서 말하는 '묶음'은 다음과 같은 것들이 들어갈 수 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;리스트 =&amp;gt; 개별 원소로 해체&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;가변인수 =&amp;gt; 개별 원소로 해체&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;제너레이터 =&amp;gt; 개별 원소로 해체 (range 등)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: inherit;&quot;&gt;&lt;span&gt;딕셔너리 =&amp;gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;key만 해체&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1727111675069&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;d = {k: str(k) for k in range(1, 11)}
print(*d) # result: 1 2 3 4 5 6 7 8 9 10&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-40b29c72-cce6-4d0a-a126-dd97948452e1&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;SE-ae0bcd5c-2af4-4f70-b6c0-fc897c4dee26&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 여기서 주의할 점은, 딕셔너리에 *를 붙인 경우 value가 아니라 key값만 해체됩니다. 가변인수 중 키워드=&quot;값&quot; 형태로 쓰는 키워드 매개변수&lt;/span&gt;&lt;span&gt;(**kwargs)&lt;/span&gt;&lt;span&gt;의 경우 *를 두 개 (**) 붙여 key, value를 모두 끄집어낼 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727111699355&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def func(**kwargs):
  for k, v in kwargs.items():
    print(k, v)

d = {'a': 1, 'b': 2, 'c': 3}
func(**d)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-3254b16d-b77e-41f4-8735-9ffc722dff14&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;p style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;div id=&quot;SE-3254b16d-b77e-41f4-8735-9ffc722dff14&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;슬라이싱 대신으로 사용하는 것도 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776832789897&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;scores = [95, 80, 75, 60, 55]
first, *rest = scores

print(first) # 95
print(rest)  # [80, 75, 60, 55]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-5952e295-1694-4178-abbe-ebf1926a2b11&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-bf251bb8-dc3e-4624-87ba-4eb4f97a9bea&quot; style=&quot;color: #000000; text-align: var(--se-sectionTitle-default-title-text-align);&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;3. 반복문에서 인덱스 사용하기&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-937fd534-2238-4894-a0ad-b74495d9e82e&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Python에서는 반복문을 사용할 때 for를 사용합니다. while은 무한반복문을 제외하고는 거의 안 쓰여요. 그렇지만, 이런 경우가 있죠.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727111714516&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;l = [*&quot;abcdefg&quot;]
i = 0
while i &amp;lt; len(l):           # 또는 for i in range(len(l))
  print(i, l[i])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-7ddcd078-46a2-4d7d-8ee8-bdfbd1c85d26&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 배열에서 요소를 하나씩 가져오는데, 인덱스가 필요할 때. 이럴 때 별도의 변수 i를 선언하여 인덱스를 출력하고, 배열의 [ ] 연산을 이용하여 값에 접근하는 경우가 있습니다. 이런 방식은 제발 사용하지 마시길 바랍니다. 이건 파이썬스러운(Pythonic) 코드가 아니에요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727111722740&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;l = [*&quot;abcdefg&quot;]

for i, e in enumerate(l)
  print(i, e)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f71572b1-e3d0-4e03-8e6c-d112af49c0ae&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 파이썬에서는 문법적으로 두 개 이상의 값을 반환할 수 있습니다. 그 말은 함수의 결과를 두 개 이상의 변수에 바로 대입할 수 있다는 뜻입니다. enumerate를 이용하면 인덱스와 값을 한번에 받을 수 있습니다. 이 경우 i에는 인덱스 번호가(0, 1, 2, 3, ...) e에는 값이 (a, b, c, d, ...) 들어갑니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727111731402&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;l1 = [1, 2, 3, 4, 5]
l2 = ['A', 'B', 'C', 'D', 'E']

for a, b in zip(l1, l2):
  print(a, b)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f9103610-ef19-4d9b-861a-52d45f311d6f&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-0ee6cc52-c407-48da-a94d-81057f53c96f&quot; style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 이와 비슷하게, 두 개의 리스트를 &lt;/span&gt;&lt;span&gt;&lt;b&gt;묶어(zip)&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 동시에 순회할 수 있는 기능도 존재합니다. 이런 경우도 인덱스 변수를 도입할 필요가 없다는 점에서 강점을 가지죠. 인덱스 변수가 필요하신가요? zip을 enumerate로 감싸시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e0bd5717-a876-41dc-b5bf-4f0fa33638ab&quot; style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-c6078739-cddd-4d1f-9b61-0089be5e7d57&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-9303b30c-7bfb-4508-9ed1-ba3fff4e9a46&quot; style=&quot;color: #000000; text-align: var(--se-sectionTitle-default-title-text-align);&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;4. 병렬 할당과 분해&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2903c4c9-1c8a-4aa3-a276-1864f6fd9e22&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 바로 위에서 enumerate() 함수를 배웠습니다. 여기서 좌변에 두 개 이상의 값을 사용했죠.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727111745447&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;l = ['월', '화', '수']
mon, tue, wed = l&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-541b5806-6954-4486-8f5a-95423f7e3a95&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 리스트, 튜플 등에서 값을 분해할 수도 있습니다. enumerate가 실제로 값을 두 개 반환하는지, 리스트를 반환하는지, 튜플을 반환하는지 궁금해하지 않아도 돼요. 어쨌든 &lt;/span&gt;&lt;span&gt;&lt;b&gt;두 개의 값을 반환하므로&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 두 개의 변수를 통해 값을 각각 받아올 수 있다는 사실만 기억하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727111753154&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a, b = b, a&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-7e79f88a-1878-4ffe-8856-58a7a0e25f59&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-373db6e4-25ed-40d0-99c4-c0901d2a8b1a&quot; style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 이것을 응용하면 별도의 함수 없이 두 변수의 값을 간단히 바꿀 수 있습니다. 이 경우 오른쪽의 b, a는 자동으로 &lt;/span&gt;&lt;span&gt;&lt;b&gt;튜플&lt;/b&gt;&lt;/span&gt;&lt;span&gt;이 됩니다. 즉, 우측은 (b, a)인 튜플이 되고 좌측은 그 튜플이 분해되어 값이 바뀌는 겁니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4f9f908f-85d6-473e-a025-bd03dec08916&quot; style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-2a5956b9-5ca5-4c4f-b1b2-35d536aa785a&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 style=&quot;color: #000000; text-align: var(--se-sectionTitle-default-title-text-align);&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;5. 자원 해제는 with으로&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1727111764682&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;f = open(&quot;test.txt&quot;, 'r')
may_raise_error(f)
f.close()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-38503a1c-9228-4e95-a1bb-d886548750c6&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 이 코드의 문제점은 무엇인가요? open()으로 파일을 열었지만, may_raise_error() 함수가 에러를 raise 하는 경우 파일이 닫히지 않아 문제가 생길 수 있습니다. 이를 해결하기 위해 다른 언어에서는 try ~ finally를 쓰거나, 소멸자를 사용하죠.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727111772014&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;f = open(&quot;test.txt&quot;, 'r')
try:
  may_raise_error(f)
finally:
  f.close()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-9b6b0d28-eaa5-45d1-aa52-1b4841cbf9ed&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 이 코드가 잘못되었다는 건 아닙니다. 다만 'Pythonic'하지 못한 코드입니다&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727111783755&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;with open(&quot;test.txt&quot;, 'r') as f:
  may_raise_error(f)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-b5b22416-50ca-4463-9174-7fcf63b3a6ee&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-27c21388-d570-4dab-8b92-5eb42ac6d612&quot; style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 단 두 줄 만에 작성이 끝납니다. with 구문을 벗어날 때, 선언한 변수(여기선 f)를 자동으로 닫아주기 때문에 우리가 직접 관리할 필요가 없어요. 예외 처리는 어디서 하냐고요? with 구문의 밖에서 하면 됩니다. 일관적인 예외처리를 할 수 있기 때문에 가독성이 좋아지는 건 덤입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d7227867-6707-4d91-8f27-c81b9e2685ec&quot; style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-c4842e24-4ac0-468d-9742-6ac40433c83d&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-5550e58d-771c-4cca-a98d-bfd3a9a61f88&quot; style=&quot;color: #000000; text-align: var(--se-sectionTitle-default-title-text-align);&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;6. 무한집합을 정의하는 방법&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-fb737211-e5c3-44b7-aa5c-d9bc68f0cb06&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-0b595a83-f482-4ddf-b72b-bb5b859114b1&quot; style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 컴퓨터는 일반적으로 튜링 완전(turing-complete)하지만, 기억장치의 유한성으로 인해 한계가 있습니다. (느슨한 튜링 완전) 이에 따라 함수형 프로그래밍 언어가 아닌 이상 무한집합을 정의하고 저장하는 건 사실 불가능에 가깝죠.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b4c6413b-e369-4314-abcf-49d1774fc0fa&quot; style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 그렇지만, 농도(cardinality)가 &lt;/span&gt;&lt;span&gt;&amp;alefsym;_0(알레프 널)인 가산무한집합의 경우 수열의 귀납적 정의를 통해 무한집합을 정의할 수 있습니다. &lt;/span&gt;&lt;span&gt;&lt;s&gt;아주 고등수학부터 대학수학까지 골고루 개념이 나옵니다. 쒯&lt;/s&gt;&lt;/span&gt;&lt;span&gt;. 계산을 미리 해서 저장장치(리스트, 튜플, ...)에 집어넣는 게 아니라, 그때그때 필요한 만큼만 계산하는 방식입니다. 파이썬에서는 &lt;/span&gt;&lt;span&gt;&lt;b&gt;yield&lt;/b&gt;&lt;/span&gt;&lt;span&gt;를 통해 이러한 지연 평가(lazy evaluation)를 지원합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727111798839&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def Natural(n):
  for i in range(1, n+1):
    yield i

for i in Natural(1000):
  print(i)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-fef4387b-10b9-4914-a262-d4244c9d2712&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 이렇게 자연수의 무한 집합을 만들어 1000개를 꺼내올 수도 있고요. 엄밀히 말하면 제너레이터와 yield를 사용해서 그때그때 연산하는 방식에 가깝지만, 우리는 개념적으로 '무한집합'을 정의할 수 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727111810897&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def Fibo(n):
    a, b = 0, 1
    for i in range(n):
        yield a
        a, b = b, a + b
  
for i in Fibo(10):
  print(i)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-7d29a618-67c2-4549-b146-c1ae7fa78f6d&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-e063c348-74aa-4b26-8b31-6108e6154cf3&quot; style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 이를 응용하면 피보나치 수열도 &lt;/span&gt;&lt;span&gt;&lt;b&gt;저장 공간의 제약 없이&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 구현이 가능합니다. 자연수의 응용으로 만들 수 있는 집합은 모두 구현이 가능하다고 보시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ef1ae103-30a0-4bf9-bd99-544fcf09a81c&quot; style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-7e9efa99-1363-4d71-a836-071bd7833c6d&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 style=&quot;color: #000000; text-align: var(--se-sectionTitle-default-title-text-align);&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;7. 직관적인 비교&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1727111826437&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if 10 &amp;lt; a and a &amp;lt; 20:
  print('A is bigger than 10 and less than 20')&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-0d724a6a-c23d-441a-8773-95f3136049e8&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 10 초과 20 미만을 표기할 때, 프로그래밍에서는 일반적으로 이항 비교연산자와 논리연산자를 결합하여 위와 같은 방법으로 많이 사용합니다. 사실 C 계열 언어에서는 선택지가 없어요. 저렇게 써야만 합니다. 그런데 파이썬은 다르죠.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727111834067&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if 10 &amp;lt; a &amp;lt; 20:
  print('A is between 10 and 20')&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-fa82f2d2-9b9d-4e3a-8bef-2d1fa315c6ae&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; 위와 같은 구문도 정상적으로 동작합니다. 마찬가지로, 아래와 같은 비교도 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727111842230&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if a == b == c:
  print('a, b and c are all equal.')&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&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;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;여러 개의 조건을 비교하려면, 아래와 같이 in을 사용하여 비교할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776832822601&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;color = &quot;red&quot;
# if color == &quot;red&quot; or color == &quot;blue&quot; or color == &quot;green&quot;: # 이것보다는
if color in (&quot;red&quot;, &quot;blue&quot;, &quot;green&quot;): # 이와 같이 깔끔하게
    print(&quot;RGB&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;SE-df8310d6-94d3-471e-8dbd-0ef493ecaa47&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;8. 비어 있는 컬렉션&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1776832856857&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;my_list = [] 
if len(my_list) == 0:
	print(&quot;my_list is empty.&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-010e623e-d7c9-47a4-89bc-068bcc96b605&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;일반적으로 비어 있는 컬렉션은 if문에서 False로 취급됩니다. 리스트 [], 딕셔너리 {}, 문자열 &quot;&quot;, 숫자 0 모두 그렇습니다. 길이를 재지 않아도 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776832872085&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;my_list = []
if not my_list:
    print(&quot;my_list is empty.&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-32369b6e-3900-4973-b84b-c77b677aabc1&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;9. 딕셔너리의 값을 안전하게 get하기&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1776832882285&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;user = {&quot;name&quot;: &quot;Python&quot;}
if &quot;age&quot; in user:
    age = user[&quot;age&quot;]
else:
    age = 20&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-c41b7512-8e24-43bc-b92e-e7ec9bac4601&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;딕셔너리에 키가 없을 때 에러를 방지하기 위해 if문으로 키가 있는지 검사합니다. 하지만, get() 메서드를 사용하면 그럴 필요가 없습니다. 키가 있다면 값을 반환하고, 키가 없으면 기본값으로 주어진 인자를 반환합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776832890723&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;user = {&quot;name&quot;: &quot;Python&quot;}
age = user.get(&quot;age&quot;, 20) # age가 없으면 20을 반환&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-395ae5da-c535-4f44-8758-fddc2030eb06&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;10. 조건 만족 여부 한 번에 검사 (any, all)&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1776832899393&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;numbers = [1, 3, 5, 8, 9]
has_even = False

for num in numbers:
    if num % 2 == 0:
        has_even = True
        break

if has_even:
    print(&quot;Even number exists.&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-0a823622-ba1f-4477-a163-8086cf479706&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;리스트 안에 특정 &lt;/span&gt;&lt;span&gt;조건을 만족하는 데이터가 하나라도 있는지(any), 혹은 모두 만족하는지(all) 확인할 때 번거로운 for 문과 flag 변수를 쓸 필요가 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776832907194&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;numbers = [1, 3, 5, 8, 9]

# 제너레이터 표현식입니다. list comprehension과 비슷한 방법으로 사용합니다.
if any(num % 2 == 0 for num in numbers):
    print(&quot;Even number exists.&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;SE-c3d081a4-254d-4fc1-92fe-0d345e94a556&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-af572269-624b-4300-b6df-c646ab53ac4a&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-d8668f58-b1bd-44c6-bcc8-ad6302d64a94&quot; style=&quot;color: #000000; text-align: var(--se-text-default-value-text-align);&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 외에 decoration이라는 아주 강력한 기능이 있으나, 분량이 늘어나 다음에 소개하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Python</category>
      <author>카루-R</author>
      <guid isPermaLink="true">https://karupro.tistory.com/124</guid>
      <comments>https://karupro.tistory.com/124#entry124comment</comments>
      <pubDate>Tue, 24 Sep 2024 02:17:27 +0900</pubDate>
    </item>
  </channel>
</rss>