<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>코딩 연습</title>
    <link>https://codepractice.tistory.com/</link>
    <description>40대 아저씨가 쓰는 코딩 이야기</description>
    <language>ko</language>
    <pubDate>Fri, 10 Apr 2026 20:28:44 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>코딩아저씨</managingEditor>
    <image>
      <title>코딩 연습</title>
      <url>https://tistory1.daumcdn.net/tistory/1942526/attach/eea81bcb2b084a3aa155b9097538b41c</url>
      <link>https://codepractice.tistory.com</link>
    </image>
    <item>
      <title>omarchy 에서 영어단어 검색하여 네이버 사전 열기 - 단축키</title>
      <link>https://codepractice.tistory.com/185</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;gnome 을 사용하면서 가장 괜찮았던 부분은 gnomes shell extesions 를 사용할 수 있었던 것이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그 중에서 word translate 였던가? 그걸 아주 잘 활용했었는데, hyprland 를 사용하는 omarchy 리눅스로 넘어오면서 이걸 사용할 수 없게 되었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 clip board 에 마지막에 저장된 단어를 네이버 사전으로 바로 연결시켜주는 스크립트와 단축키를 만들어 봤다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;먼저 ~/.config/hypr/ 에 script 라는 폴더를 하나 만들고, 다음의 내용이 담긴 naver_dict.sh 라는 파일을 생성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1764961689166&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash

# 클립보드에서 현재 내용을 가져와 변수에 저장
CLIPBOARD_CONTENT=$(wl-paste)

# 내용이 비어있지 않은지 확인
if [ -z &quot;$CLIPBOARD_CONTENT&quot; ]; then
    # 클립보드가 비어있을 경우 사용자에게 알림 (선택 사항)
    notify-send &quot;클립보드 검색&quot; &quot;클립보드에 내용이 없습니다.&quot;
    exit 1
fi

# URL 인코딩 (URL에 안전한 문자열로 변환)
# dmenu 또는 rofi와 같은 도구에 포함된 'url_encode' 함수를 사용하거나, 
# 파이썬과 같은 다른 도구를 사용하여 인코딩할 수 있습니다.
# 여기서는 간단히 검색 가능한 형태로만 처리합니다.
SEARCH_TERM=$(echo &quot;$CLIPBOARD_CONTENT&quot; | sed 's/ /+/g')

# 네이버 영어 사전 검색 URL
# 네이버 영어 사전의 검색 쿼리 형식은 'https://en.dict.naver.com/search.nhn?query=검색어' 입니다.
URL=&quot;https://en.dict.naver.com/#/search?query=$SEARCH_TERM&quot;

BROWSER_APP_NAME=&quot;firefox&quot; 

# 이 부분이 &quot;Firefox가 열려있는지 확인하고, 열려있다면 그 모든 창의 주소를 가져와라&quot; 입니다.
WINDOW_ADDRESSES=$(hyprctl clients -j 2&amp;gt;/dev/null | jq -r &quot;.[] | select(.class == \&quot;$BROWSER_APP_NAME\&quot;) | .address&quot;)

# 이 부분이 &quot;주소가 하나라도 있다면 (즉, Firefox가 열려 있다면)&quot; 입니다.
if [ ! -z &quot;$WINDOW_ADDRESSES&quot; ]; then
    # 이 부분이 &quot;가져온 모든 주소에 대해 닫기 명령을 실행하라&quot; 입니다.
    echo &quot;$WINDOW_ADDRESSES&quot; | while read -r address; do
        hyprctl dispatch closewindow address:&quot;$address&quot;
    done
    
    # 닫는 시간을 확보
    sleep 0.3
fi

# --- 3. 새 Firefox 창에서 검색 실행 ---
# '&amp;amp;'를 사용하여 스크립트가 브라우저가 완전히 로드될 때까지 기다리지 않고 즉시 종료되도록 합니다.
firefox &quot;$URL&quot; &amp;amp;&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;브라우저를 바꾸고 싶다면 23행의 BORWSER_APP_NAME=&quot;firefox&quot; 를 원하는 브라우저명으로 바꾸면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 ~/.config/hypr/binding.conf 파일을 열어서 다음의 내용을 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1764961801292&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bindd = SUPER CTRL, C, naver_dict, exec, ~/.config/hypr/script/naver_dict.sh&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;이렇게 하면 SUPER(win 키 또는 cmd키) 와 CRTL과 C키를 누르면 firefox 가 열리면서 네이버 사전으로 바로 연결이 되어 클립모드에 마지막으로 기록된 단어의 뜻을 확인할 수 있다. 물론 검색하려는 단어를 선택하여 CTRL-C로 클립보드에 보내야 한다.&lt;/p&gt;</description>
      <category>Linux</category>
      <author>코딩아저씨</author>
      <guid isPermaLink="true">https://codepractice.tistory.com/185</guid>
      <comments>https://codepractice.tistory.com/185#entry185comment</comments>
      <pubDate>Sat, 6 Dec 2025 04:12:03 +0900</pubDate>
    </item>
    <item>
      <title>omarchy 리눅스에서 마우스 연결시 touchpad 자동 on/off</title>
      <link>https://codepractice.tistory.com/184</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;일단 적당한 디렉토리에 touch_toggle.sh 라는 파일을 다음과 같은 내용을 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1764655563498&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash

# 마우스 연결 상태에 따라 터치패드를 제어하는 스크립트 (최종 수정본)

# 1. 현재 그래픽 세션을 사용하는 사용자 이름과 ID를 찾습니다.
HYPR_USER=$(pgrep -x Hyprland | xargs -r ps -o user= -p | head -n 1)
if [ -z &quot;$HYPR_USER&quot; ]; then
  # 사용자를 못 찾으면 /tmp에 로그를 남기고 종료합니다.
  echo &quot;toggle_touchpad: HYPR_USER not found at $(date)&quot; &amp;gt;&amp;gt; /tmp/toggle_touchpad_fallback.log
  exit 1
fi
HYPR_UID=$(id -u &quot;$HYPR_USER&quot;)

# 2. 로그 파일을 사용자별로 고유하게 설정하여 권한 충돌을 방지합니다.
LOG_FILE=&quot;/tmp/toggle_touchpad_${HYPR_USER}.log&quot;

# 3. Hyprland 인스턴스 서명 경로를 올바르게 설정합니다. ($XDG_RUNTIME_DIR/hypr/)
# udev(root) 환경에서는 XDG_RUNTIME_DIR이 없으므로 직접 경로를 만듭니다.
HYPRLAND_SIGNATURE_PATH=&quot;/run/user/${HYPR_UID}/hypr/&quot;

echo &quot;---&quot; &amp;gt;&amp;gt; &quot;$LOG_FILE&quot;
echo &quot;Script triggered with action: $1 at $(date)&quot; &amp;gt;&amp;gt; &quot;$LOG_FILE&quot;
echo &quot;Running as user: $(whoami), targeting user: $HYPR_USER (UID: $HYPR_UID)&quot; &amp;gt;&amp;gt; &quot;$LOG_FILE&quot;

if [ ! -d &quot;$HYPRLAND_SIGNATURE_PATH&quot; ]; then
    echo &quot;Error: Hyprland signature directory not found at $HYPRLAND_SIGNATURE_PATH&quot; &amp;gt;&amp;gt; &quot;$LOG_FILE&quot;
    exit 1
fi

export HYPRLAND_INSTANCE_SIGNATURE=$(ls -1 &quot;$HYPRLAND_SIGNATURE_PATH&quot; | head -n 1)
if [ -z &quot;$HYPRLAND_INSTANCE_SIGNATURE&quot; ]; then
    echo &quot;Error: HYPRLAND_INSTANCE_SIGNATURE is empty. Is Hyprland running?&quot; &amp;gt;&amp;gt; &quot;$LOG_FILE&quot;
    exit 1
fi
echo &quot;Found HYPRLAND_INSTANCE_SIGNATURE: $HYPRLAND_INSTANCE_SIGNATURE&quot; &amp;gt;&amp;gt; &quot;$LOG_FILE&quot;

# 4. 'su'를 사용하여 실제 hyprctl 명령을 로그인된 사용자의 권한으로 실행합니다.
# 이렇게 해야 사용자의 Hyprland 세션에 접근할 수 있습니다.
# 모든 환경 변수를 전달하여 실행 컨텍스트를 유지합니다.
run_as_user() {
    sudo -u &quot;$HYPR_USER&quot; DISPLAY=:0 HYPRLAND_INSTANCE_SIGNATURE=&quot;$HYPRLAND_INSTANCE_SIGNATURE&quot; &quot;$@&quot;
}

# 5. 터치패드 장치 이름을 설정합니다. (사용자 환경에 맞게 수정 필요)
TOUCHPAD_DEVICE=&quot;asue120d:00-04f3:31fb-touchpad&quot;

echo &quot;Touchpad device to control: $TOUCHPAD_DEVICE&quot; &amp;gt;&amp;gt; &quot;$LOG_FILE&quot;

case &quot;$1&quot; in
  add)
    echo &quot;Action: add. Disabling touchpad.&quot; &amp;gt;&amp;gt; &quot;$LOG_FILE&quot;
    run_as_user hyprctl keyword &quot;device[$TOUCHPAD_DEVICE]:enabled&quot; false
    ;;
  remove)
    echo &quot;Action: remove. Enabling touchpad.&quot; &amp;gt;&amp;gt; &quot;$LOG_FILE&quot;
    run_as_user hyprctl keyword &quot;device[$TOUCHPAD_DEVICE]:enabled&quot; true
    ;;
esac

echo &quot;Script finished successfully.&quot; &amp;gt;&amp;gt; &quot;$LOG_FILE&quot;
echo &quot;&quot; &amp;gt;&amp;gt; &quot;$LOG_FILE&quot;

exit 0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 터치패드 장치 이름은 hyprctl devices 명령으로 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mouse&amp;nbsp;at&amp;nbsp;556d6d2388f0:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;asue120d:00-04f3:31fb-touchpad&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;default&amp;nbsp;speed:&amp;nbsp;0.00000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scroll&amp;nbsp;factor:&amp;nbsp;-1.00&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노란 형광펜 부분이 touchpad 장치 이름이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 나서 touch_toggle.sh 파일을 실행 가능하게 만들어줘야 한다. touch_toggle.sh 파일이 있는 디렉토리에서 다음을 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1764655757878&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chmod +x touch_toggle.sh&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;그 다음 /etc/udev/rules.d/ 로 이동하여 99-mouse-hotplug.rules 라는 파일을 만든다. 여기서는 관리자 권한으로 파일을 만들고 수정해야 한다. sudo nvim 99-mouse-hotplug.rules 를 실행하고 관리자 암호를 입력하면 됨. 그리고 다음과 같은 내용을 채워 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1764655876415&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ACTION==&quot;add|remove&quot;, SUBSYSTEM==&quot;hid&quot;, ENV{HID_NAME}==&quot;마우스이름&quot;, RUN+=&quot;/디렉토리/touch_toggle.sh %E{ACTION}&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당연히 &quot;디렉토리&quot; 부분에는 touch_togle.sh 가 있는 디렉토리를 적어줘야 한다. 또한 &quot;마우스이름&quot; 부분에는 자신의 마우스이름을 넣어줘야 한다. ex) &quot;Logi POP Mouse&quot;&amp;nbsp;&lt;br /&gt;마우스 이름은 bluetoothctl info 를 통해서 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Device&amp;nbsp;DD:52:C4:44:F4:C4&amp;nbsp;(random)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;Name:&amp;nbsp;Logi&amp;nbsp;POP&amp;nbsp;Mouse&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Alias:&amp;nbsp;Logi&amp;nbsp;POP&amp;nbsp;Mouse&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Appearance:&amp;nbsp;0x03c2&amp;nbsp;(962)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Icon:&amp;nbsp;input-mouse&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Paired:&amp;nbsp;yes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Bonded:&amp;nbsp;yes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Trusted:&amp;nbsp;yes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Blocked:&amp;nbsp;no&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Connected:&amp;nbsp;yes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WakeAllowed:&amp;nbsp;yes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LegacyPairing:&amp;nbsp;no&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CablePairing:&amp;nbsp;no&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UUID:&amp;nbsp;Generic&amp;nbsp;Access&amp;nbsp;Profile&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(00001800-0000-1000-8000-00805f9b34fb)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UUID:&amp;nbsp;Generic&amp;nbsp;Attribute&amp;nbsp;Profile&amp;nbsp;(00001801-0000-1000-8000-00805f9b34fb)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UUID:&amp;nbsp;Device&amp;nbsp;Information&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(0000180a-0000-1000-8000-00805f9b34fb)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UUID:&amp;nbsp;Battery&amp;nbsp;Service&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(0000180f-0000-1000-8000-00805f9b34fb)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UUID:&amp;nbsp;Human&amp;nbsp;Interface&amp;nbsp;Device&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(00001812-0000-1000-8000-00805f9b34fb)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UUID:&amp;nbsp;Logitech&amp;nbsp;International&amp;nbsp;SA&amp;nbsp;(0000fd72-0000-1000-8000-00805f9b34fb)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UUID:&amp;nbsp;Vendor&amp;nbsp;specific&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(00010000-0000-1000-8000-011f2000046d)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Modalias:&amp;nbsp;usb:v046DpB030d0008&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Battery&amp;nbsp;Percentage:&amp;nbsp;0x4b&amp;nbsp;(75)&lt;br /&gt;&lt;br /&gt;노란 형광펜 부분이 마우스 이름이다.&lt;br /&gt;혹시 bluetoothctl 이란 명령어가 없다고 나온다면 bluez 와 bluez-utils 를 설치해야 한다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 터미널에서 sudo udevadm control --reload-rules 를 실행하면 마우스가 연결됨에 따라 자동으로 touchpad 가 on/off 되는 것을 확인할 수 있다.&lt;/p&gt;</description>
      <category>Linux</category>
      <author>코딩아저씨</author>
      <guid isPermaLink="true">https://codepractice.tistory.com/184</guid>
      <comments>https://codepractice.tistory.com/184#entry184comment</comments>
      <pubDate>Tue, 2 Dec 2025 15:17:37 +0900</pubDate>
    </item>
    <item>
      <title>OBS에서 화면 일부 녹화시 녹화 영역 표시하기 (Mac)</title>
      <link>https://codepractice.tistory.com/182</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;OBS 에서 화면의 일부분만 녹화할 경우, 녹화 영역이 표시 되지 않아 불편하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인공지능에게 물어봐도 그런 기능은 OBS 자체내에서는 제공하지 않는다고만 하고, 그럼 그런 기능을 갖는 플러그인이라도 찾아달라고 했는데 제대로 찾아주질 못했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 저런 검색 후에 알아낸 방법이 hammerspoon 을 이용하는 방법인데 아주 딱 마음에 든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 hammerspoon 을 설치한다. (&lt;a href=&quot;https://www.hammerspoon.org&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.hammerspoon.org&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;~/.hammerspoon/init.lua 에 다음 코드를 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1759277218990&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; -- OBS 녹화 영역 표시를 위한 Hammerspoon 스크립트
 
 -- 1. OBS 녹화 영역의 좌표 및 크기 설정 (이 값을 OBS 설정에 맞춰 변경하세요!)
 local OBS_X = 100       -- OBS 녹화 영역의 시작 X 좌표
 local OBS_Y = 50        -- OBS 녹화 영역의 시작 Y 좌표
 local OBS_WIDTH = 1280  -- OBS 녹화 영역의 너비
 local OBS_HEIGHT = 720  -- OBS 녹화 영역의 높이
 
 local BORDER_THICKNESS = 4 -- 테두리 두께 (픽셀)
 local BORDER_COLOR = {red = 1, green = 0, blue = 0, alpha = 0.8} -- 테두리 색상 (빨간색, 투명도 80%)
 
 -- 2. hs.canvas 객체 생성
 local obsBorderCanvas = nil
 
 -- 3. 테두리를 그리는 함수
 local function drawObsBorder()
     if obsBorderCanvas then
         obsBorderCanvas:delete() -- 기존 캔버스 삭제 (업데이트 시)
     end
 
     -- 캔버스 생성 및 위치/크기 설정
     obsBorderCanvas = hs.canvas.new(hs.geometry.rect(OBS_X, OBS_Y, OBS_WIDTH, OBS_HEIGHT))
 
     -- 캔버스에 테두리 그리기
     obsBorderCanvas[1] = {
         type = &quot;rectangle&quot;,
         frame = {x = 0, y = 0, w = OBS_WIDTH, h = OBS_HEIGHT}, -- 캔버스 내에서의 위치
         fillColor = {red = 0, green = 0, blue = 0, alpha = 0}, -- 채우기 색상 (투명)
         strokeColor = BORDER_COLOR, -- 테두리 색상
         strokeWidth = BORDER_THICKNESS -- 테두리 두께
     }
 
     obsBorderCanvas:show() -- 캔버스 표시
     obsBorderCanvas:setLevel(hs.canvas.windowLevels.overlay) -- 다른 창 위에 항상 표시되도록 레벨 설정
 end
 
 -- 4. 테두리를 숨기는 함수
 local function hideObsBorder()
     if obsBorderCanvas then
         obsBorderCanvas:hide()
     end
 end
 
 -- 5. 테두리 표시/숨기기를 토글하는 핫키 설정
 -- 예시: `Ctrl + Option + R` 키를 누르면 테두리가 토글됩니다.
 hs.hotkey.bind({&quot;ctrl&quot;, &quot;alt&quot;}, &quot;R&quot;, function()
     if obsBorderCanvas and obsBorderCanvas:isVisible() then
         hideObsBorder()
         hs.notify.show(&quot;Hammerspoon&quot;, &quot;&quot;, &quot;OBS 녹화 영역 표시: 숨김&quot;)
     else
         drawObsBorder()
         hs.notify.show(&quot;Hammerspoon&quot;, &quot;&quot;, &quot;OBS 녹화 영역 표시: 활성화&quot;)
     end
 end)
 
 -- Hammerspoon이 시작될 때 알림
 hs.notify.show(&quot;Hammerspoon&quot;, &quot;&quot;, &quot;OBS 녹화 영역 스크립트 로드됨. Ctrl+Alt+R로 토글.&quot;)
 
 -- (선택 사항) Hammerspoon 설정이 변경될 때마다 스크립트 다시 로드
 -- hs.reload.set=true&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&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-- 1. OBS 녹화 영역의 좌표 및 크기 설정 (이 값을 OBS 설정에 맞춰 변경하세요!)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분을 본인의 상황에 맞게 변경한다. (CMD-SHIFT-4 를 눌러서 녹화하고자 하는 영역을 선택할 때, 시작점 클리시 나오는 좌표, 드래그시 나오는 좌표들을 보면 된다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장한 다음 hammerspoon 을 상단바에서 찾아서 클릭한다음 Reload Config 를 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 OPT-CTRL-R 키를 누르면 빨간색 테두리가 나오는 것을 볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 한 번 OPT-CTRL-R 키를 누르면 테두리는 사라진다.&lt;/p&gt;</description>
      <category>잡다한 것들</category>
      <author>코딩아저씨</author>
      <guid isPermaLink="true">https://codepractice.tistory.com/182</guid>
      <comments>https://codepractice.tistory.com/182#entry182comment</comments>
      <pubDate>Wed, 1 Oct 2025 09:10:38 +0900</pubDate>
    </item>
    <item>
      <title>챕터별로 tex 파일 만들고 컴파일하기</title>
      <link>https://codepractice.tistory.com/181</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;latex 로 책을 만들 때, chap1.tex, chap2.tex, chap3.tex 로 tex 파일을 만들고 이 파일들을 book.tex 파일에서 하나로 합치는 구조로 작업을 하고 싶다면 다음과 같이 하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;book.tex 파일은 아래와 같아야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1757432352015&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;\documentclass{book}
\usepackage{subfiles}

\begin{document}

\tableofcontents

\subfile{chap1.tex}
\subfile{chap2.tex}
\subfile{chap3.tex}

\end{document}&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;chap1.tex 파일은 다음과 같아야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1757432373771&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;\documentclass[book.tex]{subfiles}

\begin{document}
\chapter{첫 번째 장}
여기에 chap1 내용이 들어갑니다.
\end{document}&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;이렇게 하면 book.tex 를 커파일하면 전체 책이 나오고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;chap1.tex 만 컴파일하면 chap1 단독 PDFㅏ 나오게 된다.&lt;/p&gt;</description>
      <category>LaTeX</category>
      <author>코딩아저씨</author>
      <guid isPermaLink="true">https://codepractice.tistory.com/181</guid>
      <comments>https://codepractice.tistory.com/181#entry181comment</comments>
      <pubDate>Wed, 10 Sep 2025 00:40:34 +0900</pubDate>
    </item>
    <item>
      <title>includepdf 사용 시 페이지가 겹치는 문제</title>
      <link>https://codepractice.tistory.com/180</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\includepdf 를 사용하여 pdf 를 삽입하는 경우, 다음 페이와 겹쳐 보이는 경우가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴 때는 다음과 같이 해 주면 페이지를 겹치지 않게 나타낼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1743405924672&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;\includepdf[pages={{}, -}]{파일이름.pdf}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>LaTeX</category>
      <category>includepdf</category>
      <category>LaTeX</category>
      <category>페이지 겹칩</category>
      <author>코딩아저씨</author>
      <guid isPermaLink="true">https://codepractice.tistory.com/180</guid>
      <comments>https://codepractice.tistory.com/180#entry180comment</comments>
      <pubDate>Mon, 31 Mar 2025 16:25:50 +0900</pubDate>
    </item>
    <item>
      <title>emcas에서 yas-snippets 사용시 로딩이 안되는 문제</title>
      <link>https://codepractice.tistory.com/179</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;emacs doom 에서 yas-snippets을 잘 사용하고 있었는데,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느날 갑자기 내가 만든 custom snippets 들이 로딩이 안되어 사용이 불가능한 상황이 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새롭게 만들어 넣으면 맨 마지막 snippet 만 로딩이 되고, 앞선 snippet 들은 모두 언로딩되는 현상이 반복되어,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색에 검색을 거듭해본 결과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;snippet 파일에서 uuid 부분을 설정해주면 해결된다는 사실을 알아냈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734417179827&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# -*- mode: snippet -*-
# name: choice box
# uuid: JK_choose_box
# key: &amp;gt;cb
# condition: t
# --
\begin{ChooseBox}{보기}
  \begin{enumerate}[ㄱ.]

  \end{enumerate}
\end{ChooseBox}&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;uuid:&amp;nbsp; &amp;lt;- 이 부분이 원래는 비어있는데, 그냥 뭐라도 하나 써주면 그때부터 제대로 동작한다.&lt;/p&gt;</description>
      <author>코딩아저씨</author>
      <guid isPermaLink="true">https://codepractice.tistory.com/179</guid>
      <comments>https://codepractice.tistory.com/179#entry179comment</comments>
      <pubDate>Tue, 17 Dec 2024 15:33:47 +0900</pubDate>
    </item>
    <item>
      <title>emacs 에서 .tex 파일 로딩시 LaTeX-mode 를 기본으로 설정하는 법</title>
      <link>https://codepractice.tistory.com/178</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;emacs doom 을 사용할 때는 config.el 에 다음을 추가해주며 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734416957081&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(add-to-list 'auto-mode-alist '(&quot;\\.tex\\'&quot; . latex-mode))&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;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <author>코딩아저씨</author>
      <guid isPermaLink="true">https://codepractice.tistory.com/178</guid>
      <comments>https://codepractice.tistory.com/178#entry178comment</comments>
      <pubDate>Tue, 17 Dec 2024 15:29:22 +0900</pubDate>
    </item>
    <item>
      <title>취소선 (cancel)</title>
      <link>https://codepractice.tistory.com/177</link>
      <description>&lt;pre class=&quot;latex&quot;&gt;&lt;code&gt;\documentclass{article}
\usepackage{cancel}
\begin{document}
$\dfrac{a \cancel{b}}{\cancel{b}}=a$
\end{document}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2024-11-19 at 13.57.41.png&quot; data-origin-width=&quot;158&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nBNiV/btsKNuWXklz/5snbrYOKa74Leidr8uf9xK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nBNiV/btsKNuWXklz/5snbrYOKa74Leidr8uf9xK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nBNiV/btsKNuWXklz/5snbrYOKa74Leidr8uf9xK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnBNiV%2FbtsKNuWXklz%2F5snbrYOKa74Leidr8uf9xK%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;158&quot; height=&quot;122&quot; data-filename=&quot;Screenshot 2024-11-19 at 13.57.41.png&quot; data-origin-width=&quot;158&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\cancel 대신 다음 것들도 사용이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\bcancel : 역슬래쉬로 지우기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\xcancel : X 로 지우기&lt;/p&gt;</description>
      <category>LaTeX</category>
      <author>코딩아저씨</author>
      <guid isPermaLink="true">https://codepractice.tistory.com/177</guid>
      <comments>https://codepractice.tistory.com/177#entry177comment</comments>
      <pubDate>Tue, 19 Nov 2024 13:59:05 +0900</pubDate>
    </item>
    <item>
      <title>enumerate 의 시작 번호를 변경하는 방법</title>
      <link>https://codepractice.tistory.com/176</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;enumerate 의 시작 번호를 2 로 하고 싶을 때는&amp;nbsp;&lt;/p&gt;

&lt;pre class=&quot;latex&quot;&gt;&lt;code&gt;\begin{enuerate}[start=2]
\item 어쩌구 저쩌구
\end{enumerate}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
과 같이 start=(원하는 번호)를 추가하면 된다. </description>
      <category>LaTeX</category>
      <author>코딩아저씨</author>
      <guid isPermaLink="true">https://codepractice.tistory.com/176</guid>
      <comments>https://codepractice.tistory.com/176#entry176comment</comments>
      <pubDate>Sat, 16 Nov 2024 15:49:42 +0900</pubDate>
    </item>
    <item>
      <title>부채꼴 &amp;quot;호&amp;quot; 를 나타내는 arc 를 제대로 표현하기</title>
      <link>https://codepractice.tistory.com/175</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;tex&quot; style=&quot;background-color: #000000; color: #0c0d0e; text-align: left;&quot;&gt;&lt;code&gt;\documentclass{article}
\usepackage{graphicx}

\makeatletter
\DeclareFontFamily{U}{tipa}{}
\DeclareFontShape{U}{tipa}{m}{n}{&amp;lt;-&amp;gt;tipa10}{}
\newcommand{\arc@char}{{\usefont{U}{tipa}{m}{n}\symbol{62}}}%

\newcommand{\arc}[1]{\mathpalette\arc@arc{#1}}

\newcommand{\arc@arc}[2]{%
  \sbox0{$\m@th#1#2$}%
  \vbox{
    \hbox{\resizebox{\wd0}{\height}{\arc@char}}
    \nointerlineskip
    \box0
  }%
}
\makeatother

\begin{document}

$\arc{AC}$ $\arc{BAD}$ $\arc{ICK}$ $\arc{GOOD}_{\arc{xyz}}$

\end{document}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J35D2/btsFRbm88W4/3tyqt0fYrL9PMxcI1hpck0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J35D2/btsFRbm88W4/3tyqt0fYrL9PMxcI1hpck0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J35D2/btsFRbm88W4/3tyqt0fYrL9PMxcI1hpck0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ35D2%2FbtsFRbm88W4%2F3tyqt0fYrL9PMxcI1hpck0%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;988&quot; height=&quot;178&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>LaTeX</category>
      <author>코딩아저씨</author>
      <guid isPermaLink="true">https://codepractice.tistory.com/175</guid>
      <comments>https://codepractice.tistory.com/175#entry175comment</comments>
      <pubDate>Mon, 18 Mar 2024 14:25:29 +0900</pubDate>
    </item>
  </channel>
</rss>