{"id":5560,"date":"2025-12-19T23:44:17","date_gmt":"2025-12-19T14:44:17","guid":{"rendered":"https:\/\/secondlife.lol\/?p=5560"},"modified":"2025-12-19T23:44:20","modified_gmt":"2025-12-19T14:44:20","slug":"python-project-packer-self-extracting-script","status":"publish","type":"post","link":"https:\/\/secondlife.lol\/ja\/python-project-packer-self-extracting-script\/","title":{"rendered":"Python Project Packer \uff0d \ud3f4\ub354 \ub369\uc5b4\ub9ac \ud504\ub85c\uc81d\ud2b8\ub97c \ud30c\uc774\uc36c \uc2a4\ud06c\ub9bd\ud2b8 1\uac1c\ub85c \ub9cc\ub4e4\uc5b4\uc11c \ud1b5\uc73c\ub85c \uc62e\uae30\ub294 \ubc29\ubc95"},"content":{"rendered":"<style>.kb-image5560_03e520-ed .kb-image-has-overlay:after{opacity:0.3;}<\/style>\n<div class=\"wp-block-kadence-image kb-image5560_03e520-ed\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"600\" height=\"350\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-2-600x350.jpg\" alt=\"python project packer Image\" class=\"kb-img wp-image-5561\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-2-600x350.jpg 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-2-300x175.jpg 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-2-768x449.jpg 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-2-18x12.jpg 18w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-2.jpg 856w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">1. Python Project Packer? \u201c\uc555\ucd95\ud30c\uc77c \ub9d0\uace0, \ud30c\uc774\uc36c \ud30c\uc77c \ud558\ub098\ub9cc \uac00\uc838\uc624\uc138\uc694\u201d<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ud68c\uc0ac \ub0b4\ubd80\ub9dd, \ubcf4\uc548 \uc13c\ud130, \ud3d0\uc1c4\ub9dd \uc11c\ubc84\u2026<br>\uc5ec\ub7ec \uad70\ub370\uc5d0\uc11c \uac1c\ubc1c\uc744 \ud558\ub2e4 \ubcf4\uba74 \uc774\ub7f0 \uc21c\uac04\uc774 \uc635\ub2c8\ub2e4.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201c\ud504\ub85c\uc81d\ud2b8 \uc804\uccb4\ub97c \uc800\uae30\ub85c \uc62e\uaca8\uc57c \ud558\ub294\ub370\u2026<br>\uae43\ub3c4 \ub9c9\ud600 \uc788\uace0, \uc555\ucd95 \ud30c\uc77c \ud558\ub098 \ubcf4\ub0b4\ub294 \uac83\ub3c4 \uadc0\ucc2e\uace0, \uc124\uba85\ub3c4 \ub610 \ud574\uc57c \ud558\uace0\u2026\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub7f4 \ub54c <strong>\ud3f4\ub354 \uc804\uccb4\ub97c \ud1b5\uc9f8\ub85c \ub2f4\uc740 \ud30c\uc774\uc36c \ud30c\uc77c 1\uac1c\ub9cc \ub531 \uac74\ub124\uc904 \uc218 \uc788\ub2e4\uba74<\/strong> \uc5bc\ub9c8\ub098 \ud3b8\ud560\uae4c\uc694?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc624\ub298 \uc774\uc57c\uae30\ud558\ub294 \uac74 \ubc14\ub85c \uadf8 \uc544\uc774\ub514\uc5b4\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ub0b4 PC\uc5d0\uc11c <strong>\ud504\ub85c\uc81d\ud2b8\ub97c \uc2a4\uce94\ud574\uc11c<\/strong><\/li>\n\n\n\n<li><strong>\ud558\ub098\uc758 <a href=\"http:\/\/python.org\" target=\"_blank\" rel=\"noopener\">\u30d1\u30a4\u30bd\u30f3<\/a> \uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc77c<\/strong>\uc5d0 \ubaa8\ub450 \ub2f4\uace0<\/li>\n\n\n\n<li>\ub2e4\ub978 PC\uc5d0\uc11c\ub294 \uadf8 \ud30c\uc77c \ud558\ub098\ub9cc \uc2e4\ud589\ud574\uc11c<\/li>\n\n\n\n<li><strong>\uc6d0\ub798 \ud3f4\ub354 \uad6c\uc870 + \ud30c\uc77c\ub4e4\uc744 \uadf8\ub300\ub85c \ubcf5\uc6d0<\/strong>\ud558\ub294 \uad6c\uc870\uc608\uc694.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uac78 \uc800\ub294 \ud3b8\ud558\uac8c <strong>python project packer + self extracting script \uc870\ud569<\/strong>\uc774\ub77c\uace0 \ubd80\ub97c\uac8c\uc694.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. \uc774\uac8c \uc65c \uc774\ub807\uac8c \uc88b\uc740\uac00?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ubc29\uc2dd\uc744 \uc4f0\uba74 \uc0dd\uae30\ub294 \uc7a5\uc810\ub4e4\uc744 \uba3c\uc800 \uc815\ub9ac\ud574\ubcf4\uba74<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u201c\ud30c\uc77c \ud558\ub098\ub9cc \uc8fc\uc138\uc694\u201d\ub77c\uace0 \ub9d0\ud560 \uc218 \uc788\uc74c\n<ul class=\"wp-block-list\">\n<li>\uc218\uc2ed, \uc218\ubc31 \uac1c\uc758 \ud30c\uc77c \ub300\uc2e0 <strong>\uc2a4\ud06c\ub9bd\ud2b8 1\uac1c<\/strong>\ub9cc \uc804\ub2ec\ud558\uba74 \ub418\ub2c8\uae4c\uc694.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\ub0b4\ubd80\ub9dd \ud658\uacbd\uc5d0\uc11c \ud2b9\ud788 \uc720\uc6a9<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uae43 \uc811\uadfc\uc774 \uc548 \ub418\ub294 \ud658\uacbd\uc5d0\uc11c,<\/li>\n\n\n\n<li>\uba54\uc77c\u00b7\uba54\uc2e0\uc800\ub85c \ud30c\uc77c \uc8fc\uace0\ubc1b\uae30 \uc560\ub9e4\ud560 \ub54c \uc544\uc8fc \uc88b\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\uc2a4\ub0c5\uc0f7(\uc2dc\uc810 \ubc31\uc5c5) \uc6a9\ub3c4\ub85c\ub3c4 \ud65c\uc6a9 \uac00\ub2a5<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u201c\uc624\ub298 \uae30\uc900\uc73c\ub85c \uc774 \uc0c1\ud0dc \uadf8\ub300\ub85c \ubcf4\uad00\ud574 \ub46c\uc57c\uc9c0\u201d \ud560 \ub54c packer \ud55c \ubc88 \ub3cc\ub9ac\uba74 \ub05d.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\ub3d9\ub8cc\/\ud6c4\ubc30 onboarding\ub3c4 \uac04\ub2e8<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc138\ud305 \ubc29\ubc95\uc744 \uc7a5\ud669\ud558\uac8c \uc124\uba85\ud558\uae30\ubcf4\ub2e4<\/li>\n\n\n\n<li>\u201c\uc774 \ud30c\uc77c \uc2e4\ud589 \u2192 \ubcf5\uc6d0 \u2192 README \uc77d\uace0 \ub530\ub77c\uc640\uc694\u201d\ub85c \ub05d\ub0bc \uc218 \uc788\uc5b4\uc694.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>single file deployment \ub290\ub08c<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc9c4\uc9dc \ubc30\ud3ec\ub97c \ub300\uccb4\ud558\uc9c4 \uc54a\ub354\ub77c\ub3c4,<\/li>\n\n\n\n<li>\ud14c\uc2a4\ud2b8\uc6a9, \ub370\ubaa8\uc6a9, PoC\uc6a9\uc73c\ub85c\ub294 \uaf64 \uc4f8 \ub9cc\ud55c <strong>single file deployment<\/strong> \ub290\ub08c\uc744 \uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">3. \uc804\uccb4 \uad6c\uc870 \uba3c\uc800 \ubcf4\uae30 \u2013 packer &amp; unpacker<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc544\uc774\ub514\uc5b4 \uc790\uccb4\ub294 \uc2ec\ud50c\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>packer \uc2a4\ud06c\ub9bd\ud2b8<\/strong>\n<ul class=\"wp-block-list\">\n<li>\ud604\uc7ac \ud3f4\ub354\ub97c \uc2f9 \ud6d1\uc73c\uba74\uc11c<\/li>\n\n\n\n<li>\ud3ec\ud568\ud560 \ud30c\uc77c\ub4e4\uc744 \ud558\ub098\uc529 \uc77d\uc5b4 \u201c\ub9e4\ub2c8\ud398\uc2a4\ud2b8(manifest)\u201d\ub77c\ub294 \ud070 \ub515\uc154\ub108\ub9ac(\ub610\ub294 \ub9f5)\ub85c \ub9cc\ub4e4\uace0<\/li>\n\n\n\n<li>\uadf8 \ub9e4\ub2c8\ud398\uc2a4\ud2b8\ub97c JSON \ubb38\uc790\uc5f4\ub85c \uc9c1\ub82c\ud654\ud574\uc11c<\/li>\n\n\n\n<li>\ubbf8\ub9ac \uc900\ube44\ud574 \ub454 \ud15c\ud50c\ub9bf \uc2a4\ud06c\ub9bd\ud2b8 \uc548\uc5d0 <strong>\ubb38\uc790\uc5f4\ub85c \ubc15\uc544 \ub123\uc2b5\ub2c8\ub2e4.<\/strong><\/li>\n\n\n\n<li>\ucd5c\uc885 \uacb0\uacfc\ubb3c = <strong>\ubaa8\ub4e0 \ud30c\uc77c\uc774 \ub0b4\uc7a5\ub41c self extracting script (\uc5b8\ud329\ucee4)<\/strong><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>unpacker \uc2a4\ud06c\ub9bd\ud2b8 (self extracting script)<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc790\uc2e0 \uc548\uc5d0 \ubc15\ud600 \uc788\ub294 JSON \ub370\uc774\ud130\ub97c \ub2e4\uc2dc \uc77d\uc5b4\uc11c<\/li>\n\n\n\n<li>\uac01 \ud56d\ubaa9\ubcc4\ub85c \ud3f4\ub354\ub97c \ub9cc\ub4e4\uace0 \ud30c\uc77c\uc744 \uc368 \uc90d\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\ubcf5\uc6d0\uc774 \ub05d\ub098\uba74, \uc6d0\ub798 \ud504\ub85c\uc81d\ud2b8\uc640 \uac70\uc758 \ub611\uac19\uc740 \uad6c\uc870\uac00 \ub9cc\ub4e4\uc5b4\uc838\uc694.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\uc815\ub9ac\ud558\uba74,<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>packer<\/strong>: \u201c\ud504\ub85c\uc81d\ud2b8\ub97c \uc77d\uc5b4\uc11c \u2192 \ub370\uc774\ud130 \ub369\uc5b4\ub9ac(JSON) + \ud15c\ud50c\ub9bf\uc5d0 \ub123\uace0 \u2192 \ud558\ub098\uc758 \uc2a4\ud06c\ub9bd\ud2b8\ub85c \uc800\uc7a5\u201d<br><strong>unpacker<\/strong>: \u201c\ub0b4\uc7a5\ub41c JSON\uc744 \uc77d\uc5b4\uc11c \u2192 \ud3f4\ub354 \ub9cc\ub4e4\uace0 \u2192 \ud30c\uc77c\uc744 \ub2e4\uc2dc \uc368 \uc90c\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub807\uac8c \ub450 \ucd95\uc73c\ub85c \ub3cc\uc544\uac00\uc694.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. packer\ub294 \uad6c\uccb4\uc801\uc73c\ub85c \ubb34\uc5c7\uc744 \ud558\ub0d0?<\/h2>\n\n\n<style>.kb-image5560_e73712-92 .kb-image-has-overlay:after{opacity:0.3;}<\/style>\n<div class=\"wp-block-kadence-image kb-image5560_e73712-92\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"600\" height=\"293\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-3-600x293.jpg\" alt=\"packer image\" class=\"kb-img wp-image-5564\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-3-600x293.jpg 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-3-300x146.jpg 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-3-768x375.jpg 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-3-18x9.jpg 18w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-3.jpg 996w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\uc870\uae08\ub9cc \ub354 \uad6c\uccb4\uc801\uc73c\ub85c \ub4e4\uc5b4\uac00 \ubcf4\uba74, \uc77c\ubc18\uc801\uc778 packer\uc758 \ud750\ub984\uc740 \ub300\ub7b5 \uc774\ub807\uc2b5\ub2c8\ub2e4. (\ud30c\uc77c\/\ud3f4\ub354\/\ud504\ub85c\uc81d\ud2b8 \uc774\ub984\uc740 \uc804\ud600 \uace0\uc815\ud560 \ud544\uc694 \uc5c6\uc5b4\uc694.)<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\ud604\uc7ac \ub514\ub809\ud1a0\ub9ac \uc804\uccb4\ub97c \uc21c\ud68c<\/strong>\n<ul class=\"wp-block-list\">\n<li><code>os.walk<\/code> \uac19\uc740 \uac78\ub85c <strong>\ud558\uc704 \ud3f4\ub354\uae4c\uc9c0 \uc804\ubd80 \ud0d0\uc0c9<\/strong>\u3057\u307e\u3059\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\ubb34\uc2dc\ud560 \ub300\uc0c1\uc740 \uac74\ub108\ub6f4\ub2e4<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc608\ub97c \ub4e4\uc5b4 \uc774\ub7f0 \uac83\ub4e4\uc740 \ubcf4\ud1b5 \uc790\ub3d9\uc73c\ub85c \uc81c\uc678\ud569\ub2c8\ub2e4.\n<ul class=\"wp-block-list\">\n<li><code>.git<\/code>, \uac00\uc0c1\ud658\uacbd \ud3f4\ub354, <code>__pycache__<\/code><\/li>\n\n\n\n<li>\uc5d0\ub514\ud130 \uc124\uc815 \ud3f4\ub354, \uce90\uc2dc \ud30c\uc77c<\/li>\n\n\n\n<li>\uc774\ubbf8 \ub9cc\ub4e4\uc5b4\uc9c4 packer\/unpacker \uad00\ub828 \ud30c\uc77c, \uc124\uba85\uc11c \ub4f1<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\ud544\uc694\ud558\uba74 \uc5ec\uae30\uc5d0 <strong>\ub85c\uadf8 \ud3f4\ub354, \ub300\uc6a9\ub7c9 \ub370\uc774\ud130 \ud3f4\ub354<\/strong>\ub3c4 \ucd94\uac00\ud560 \uc218 \uc788\uc8e0.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\ud30c\uc77c\ubcc4\ub85c \ud14d\uc2a4\ud2b8\/\ubc14\uc774\ub108\ub9ac \uad6c\ubd84<\/strong>\n<ul class=\"wp-block-list\">\n<li>\ud14d\uc2a4\ud2b8\ub85c \uc5f4\uc5b4\uc11c \uc77d\uc5b4\ubcf4\uace0(\uc608: UTF-8), \uc798 \uc77d\ud788\uba74 <strong>\ud14d\uc2a4\ud2b8 \ud30c\uc77c<\/strong>\ub85c \uc800\uc7a5.<\/li>\n\n\n\n<li>\uc608\uc678\uac00 \ub098\uac70\ub098 \uc778\ucf54\ub529\uc774 \uc548 \ub9de\uc73c\uba74 <strong>\ubc14\uc774\ub108\ub9ac \ud30c\uc77c<\/strong>\ub85c \uac04\uc8fc\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\ud14d\uc2a4\ud2b8 \ud30c\uc77c\uc740 \uadf8\ub300\ub85c, \ubc14\uc774\ub108\ub9ac\ub294 Base64 \uc778\ucf54\ub529<\/strong>\n<ul class=\"wp-block-list\">\n<li>\ud14d\uc2a4\ud2b8 \ud30c\uc77c \u2192 \ubb38\uc790\uc5f4 \uadf8\ub300\ub85c <code>\u5185\u5bb9<\/code>\uc5d0 \uc800\uc7a5<\/li>\n\n\n\n<li>\ubc14\uc774\ub108\ub9ac \ud30c\uc77c \u2192 \ubc14\uc774\ud2b8\ub97c \uc77d\uc5b4\uc11c <strong>Base64 \ubb38\uc790\uc5f4<\/strong>\ub85c \ubc14\uafd4\uc11c \uc800\uc7a5<\/li>\n\n\n\n<li>\uadf8\ub9ac\uace0 \uac01 \ud30c\uc77c\ub9c8\ub2e4\n<ul class=\"wp-block-list\">\n<li><code>{\"content\": \"...\", \"binary\": False\/True}<\/code><br>\uc774\ub7f0 \uc2dd\uc73c\ub85c \ub9e4\ub2c8\ud398\uc2a4\ud2b8\uc5d0 \ub123\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\ub9e4\ub2c8\ud398\uc2a4\ud2b8\ub97c JSON\uc73c\ub85c \uc9c1\ub82c\ud654\ud574\uc11c self extracting script \ud15c\ud50c\ub9bf\uc5d0 \uc0bd\uc785<\/strong>\n<ul class=\"wp-block-list\">\n<li>\ud070 \ub515\uc154\ub108\ub9ac\ub97c <code>json.dumps<\/code>\ub85c \ubb38\uc790\uc5f4\ud654\ud558\uace0<\/li>\n\n\n\n<li>\ubbf8\ub9ac \uc900\ube44\ud574 \ub454 \ud15c\ud50c\ub9bf \ucf54\ub4dc \uc548\uc758 <code>{data_placeholder}<\/code> \uac19\uc740 \uc704\uce58\uc5d0 \ub123\uc5b4\uc11c<\/li>\n\n\n\n<li>\ucd5c\uc885 <strong>self extracting script<\/strong> \ud30c\uc77c \ud558\ub098\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c \uc774 \uacb0\uacfc\ubb3c \ud30c\uc77c \ud558\ub098\ub9cc \uc788\uc73c\uba74, \uc5b4\ub514\uc5d0\uc11c\ub4e0 \ubcf5\uc6d0\uc774 \uac00\ub2a5\ud574\uc9d1\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code language-python\"><code>#packer.py \uc608\uc2dc\n#\ud504\ub85c\uc81d\ud2b8 \ub8e8\ud2b8\uc5d0\uc11c py manage.py packer \ub77c\uace0 \uba85\ub839\uc744 \uce58\uc2dc\uba74 \ub429\ub2c8\ub2e4.\n#\uc704 \uba85\ub839\uc73c\ub85c \uc0dd\uc131\ub41c \ud30c\uc77c(unpacker.py)\uc744 \uc6d0\ud558\uc2dc\ub294 \ud3f4\ub354\uc5d0 \ub450\uace0 \uc704\uc640 \uac19\uc774 \ud30c\uc77c\uba85\ub9cc \ub2ec\ub9ac\ud574\uc11c \ud558\uc2dc\uba74 \ub429\ub2c8\ub2e4.  \n\nimport os\nimport json\nimport base64\nimport argparse\nimport sys\n\n# --- Configuration ---\n# \uc774 \ub9ac\uc2a4\ud2b8\uc5d0 \ud3ec\ud568\ub41c \ud30c\uc77c\/\ud3f4\ub354\ub294 \uc544\uce74\uc774\ube0c\uc5d0 \ud3ec\ud568\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\nFILES_TO_IGNORE = &#91;\n    \".git\",\n    \".venv\",\n    \"__pycache__\",\n    \".DS_Store\",\n    \".vscode\",\n    \"*.pyc\",\n    \"*.pyo\",\n    \"*.pyd\",\n]\n\n# \uc544\uce74\uc774\ube0c \uacb0\uacfc\ubb3c \ud30c\uc77c\uba85\nOUTPUT_FILENAME = \"unpacker.py\"\n\n# --- Unpacker Script Template ---\n# \uc774 \ud15c\ud50c\ub9bf\uc740 \ucd5c\uc885 \uacb0\uacfc\ubb3c\uc778 unpacker.py\uc5d0 \ud3ec\ud568\ub420 \ucf54\ub4dc\uc785\ub2c8\ub2e4.\nUNPACKER_TEMPLATE = \"\"\"\nimport os\nimport json\nimport base64\n\n# \uc784\ubca0\ub4dc\ub41c \ub370\uc774\ud130 (Base64\ub85c \uc778\ucf54\ub529\ub428)\nEMBEDDED_DATA = '''\n{data_placeholder}\n'''\n\ndef unpack_project():\n    '''\n    \uc784\ubca0\ub4dc\ub41c \ub370\uc774\ud130\ub97c \uc77d\uc5b4 \uc6d0\ubcf8 \ud504\ub85c\uc81d\ud2b8 \uad6c\uc870\uc640 \ud30c\uc77c\ub4e4\uc744 \ubcf5\uc6d0\ud569\ub2c8\ub2e4.\n    '''\n    print(\"\ud504\ub85c\uc81d\ud2b8 \ubcf5\uc6d0\uc744 \uc2dc\uc791\ud569\ub2c8\ub2e4...\")\n    \n    try:\n        # 1. Base64 \ub370\uc774\ud130\ub97c \ub514\ucf54\ub529\n        decoded_data = base64.b64decode(EMBEDDED_DATA.encode('utf-8')).decode('utf-8')\n        # 2. JSON \ud30c\uc2f1\n        manifest = json.loads(decoded_data)\n    except (json.JSONDecodeError, TypeError, base64.binascii.Error):\n        print(\"\uc624\ub958: \ub0b4\uc7a5\ub41c \ub370\uc774\ud130\uac00 \uc190\uc0c1\ub418\uc5c8\uac70\ub098 \ub514\ucf54\ub529\uc5d0 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. \ubcf5\uc6d0\uc744 \uc911\ub2e8\ud569\ub2c8\ub2e4.\")\n        return\n\n    total_files = len(manifest)\n    restored_count = 0\n\n    for file_path, info in manifest.items():\n        try:\n            # 1. \ud3f4\ub354 \uad6c\uc870 \uc0dd\uc131\n            dir_name = os.path.dirname(file_path)\n            if dir_name and not os.path.exists(dir_name):\n                os.makedirs(dir_name)\n                print(f\"  - \ud3f4\ub354 \uc0dd\uc131: {dir_name}\")\n\n            # 2. \ud30c\uc77c \ub0b4\uc6a9 \ubcf5\uc6d0\n            content = info&#91;'content']\n            is_binary = info.get('binary', False)\n\n            if is_binary:\n                # Base64\ub85c \uc778\ucf54\ub529\ub41c \ubc14\uc774\ub108\ub9ac \ud30c\uc77c \ub514\ucf54\ub529 \ubc0f \uc4f0\uae30\n                file_content = base64.b64decode(content.encode('utf-8'))\n                with open(file_path, 'wb') as f:\n                    f.write(file_content)\n            else:\n                # \ud14d\uc2a4\ud2b8 \ud30c\uc77c \uc4f0\uae30\n                with open(file_path, 'w', encoding='utf-8') as f:\n                    f.write(content)\n            \n            restored_count += 1\n            # print(f\"  - \ud30c\uc77c \ubcf5\uc6d0: {file_path}\")\n\n        except Exception as e:\n            print(f\"\uc624\ub958: '{file_path}' \ud30c\uc77c \ubcf5\uc6d0 \uc911 \ubb38\uc81c \ubc1c\uc0dd - {e}\")\n\n    print(f\"\\\\n\ucd1d {total_files}\uac1c\uc758 \ud30c\uc77c \uc911 {restored_count}\uac1c \ud30c\uc77c \ubcf5\uc6d0 \uc644\ub8cc!\")\n    if restored_count == total_files:\n        print(\"\ud504\ub85c\uc81d\ud2b8 \ubcf5\uc6d0\uc774 \uc131\uacf5\uc801\uc73c\ub85c \uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\")\n    else:\n        print(\"\uc77c\ubd80 \ud30c\uc77c \ubcf5\uc6d0\uc5d0 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. \ub85c\uadf8\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.\")\n\nif __name__ == \"__main__\":\n    unpack_project()\n\"\"\"\n\ndef is_ignored(path, ignore_list):\n    \"\"\"\n    \uc8fc\uc5b4\uc9c4 \uacbd\ub85c\uac00 \ubb34\uc2dc \ubaa9\ub85d\uc5d0 \ud574\ub2f9\ud558\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4.\n    \"\"\"\n    path_parts = path.split(os.sep)\n    for pattern in ignore_list:\n        if any(part == pattern for part in path_parts):\n            return True\n        # \uc640\uc77c\ub4dc\uce74\ub4dc \ud328\ud134 \ub9e4\uce6d (\uc608: *.pyc)\n        if pattern.startswith('*') and path.endswith(pattern&#91;1:]):\n            return True\n    return False\n\ndef is_text_file(filepath):\n    \"\"\"\n    \ud30c\uc77c\uc774 \ud14d\uc2a4\ud2b8 \ud30c\uc77c\uc778\uc9c0 \uac04\ub2e8\ud788 \ud655\uc778\ud569\ub2c8\ub2e4.\n    \"\"\"\n    try:\n        with open(filepath, 'r', encoding='utf-8') as f:\n            f.read(1024) # \uccab 1KB\ub9cc \uc77d\uc5b4\ubd04\n        return True\n    except (UnicodeDecodeError, IOError):\n        return False\n\ndef pack_project():\n    \"\"\"\n    \ud604\uc7ac \ud504\ub85c\uc81d\ud2b8\ub97c \uc2a4\uce94\ud558\uace0 \ud30c\uc77c\ub4e4\uc744 \ub370\uc774\ud130\ub85c \ubcc0\ud658\ud558\uc5ec\n    \uc790\uac00 \uc555\ucd95 \ud480\ub9bc \uc2a4\ud06c\ub9bd\ud2b8(unpacker.py)\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.\n    \"\"\"\n    print(\"\ud504\ub85c\uc81d\ud2b8 \uc544\uce74\uc774\ube59\uc744 \uc2dc\uc791\ud569\ub2c8\ub2e4...\")\n    manifest = {}\n    \n    current_directory = os.getcwd()\n\n    for root, _, files in os.walk(\".\"):\n        # \uc0c1\ub300 \uacbd\ub85c\ub85c \ubcc0\ud658\n        relative_root = os.path.relpath(root, current_directory)\n        if relative_root == \".\":\n            relative_root = \"\" # \ub8e8\ud2b8 \ud3f4\ub354\ub294 \uacbd\ub85c\uc5d0 \ud3ec\ud568\ud558\uc9c0 \uc54a\uc74c\n\n        # \ubb34\uc2dc\ud560 \ud3f4\ub354\uc778\uc9c0 \ud655\uc778\n        if is_ignored(relative_root, FILES_TO_IGNORE):\n            print(f\"  - \ud3f4\ub354 \ubb34\uc2dc: {relative_root}\")\n            continue\n\n        for filename in files:\n            file_path = os.path.join(relative_root, filename)\n\n            # \ubb34\uc2dc\ud560 \ud30c\uc77c\uc778\uc9c0 \ud655\uc778\n            if is_ignored(file_path, FILES_TO_IGNORE):\n                # print(f\"  - \ud30c\uc77c \ubb34\uc2dc: {file_path}\")\n                continue\n\n            try:\n                if is_text_file(file_path):\n                    # \ud14d\uc2a4\ud2b8 \ud30c\uc77c \ucc98\ub9ac\n                    with open(file_path, 'r', encoding='utf-8') as f:\n                        content = f.read()\n                    manifest&#91;file_path] = {'content': content, 'binary': False}\n                else:\n                    # \ubc14\uc774\ub108\ub9ac \ud30c\uc77c \ucc98\ub9ac (Base64 \uc778\ucf54\ub529)\n                    with open(file_path, 'rb') as f:\n                        binary_content = f.read()\n                    encoded_content = base64.b64encode(binary_content).decode('utf-8')\n                    manifest&#91;file_path] = {'content': encoded_content, 'binary': True}\n                \n                print(f\"  - \ud30c\uc77c \ucd94\uac00: {file_path}\")\n\n            except Exception as e:\n                print(f\"\uc624\ub958: '{file_path}' \ud30c\uc77c \ucc98\ub9ac \uc911 \ubb38\uc81c \ubc1c\uc0dd - {e}\")\n\n    if not manifest:\n        print(\"\uacbd\uace0: \uc544\uce74\uc774\ube59\ud560 \ud30c\uc77c\uc744 \ucc3e\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4.\")\n        return\n\n    # \uc804\uccb4 manifest\ub97c JSON \ubb38\uc790\uc5f4\ub85c \ubcc0\ud658 \ud6c4, \ub2e4\uc2dc Base64\ub85c \uc778\ucf54\ub529\n    manifest_json = json.dumps(manifest)\n    encoded_manifest = base64.b64encode(manifest_json.encode('utf-8')).decode('utf-8')\n    \n    # \ud15c\ud50c\ub9bf\uc5d0 Base64\ub85c \uc778\ucf54\ub529\ub41c \ub370\uc774\ud130 \uc0bd\uc785\n    unpacker_script = UNPACKER_TEMPLATE.replace(\"{data_placeholder}\", encoded_manifest)\n\n    # \ucd5c\uc885 unpacker.py \ud30c\uc77c \uc0dd\uc131\n    try:\n        with open(OUTPUT_FILENAME, 'w', encoding='utf-8') as f:\n            f.write(unpacker_script)\n        print(f\"\\\\n\uc131\uacf5: \ud504\ub85c\uc81d\ud2b8\uac00 '{OUTPUT_FILENAME}' \ud30c\uc77c\uc5d0 \uc131\uacf5\uc801\uc73c\ub85c \uc544\uce74\uc774\ube59\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\")\n        print(f\"\ucd1d {len(manifest)}\uac1c\uc758 \ud30c\uc77c\uc774 \ud3ec\ud568\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\")\n    except IOError as e:\n        print(f\"\\\\n\uc624\ub958: \ucd5c\uc885 \uc544\uce74\uc774\ube0c \ud30c\uc77c '{OUTPUT_FILENAME}'\uc744 \uc4f0\ub294 \ub370 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4 - {e}\")\n\n\nif __name__ == \"__main__\":\n    pack_project()<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">5. unpacker\ub294 \uc5b4\ub5bb\uac8c \ubcf5\uc6d0\ud560\uae4c?<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"600\" height=\"346\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-4-600x346.jpg\" alt=\"unpacker image\" class=\"wp-image-5565\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-4-600x346.jpg 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-4-300x173.jpg 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-4-768x443.jpg 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-4-18x10.jpg 18w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-4.jpg 996w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">\ubc18\ub300\ub85c, unpacker(= self extracting script)\ub294 \ub300\ub7b5 \uc774\ub7f0 \uc21c\uc11c\ub85c \ub3d9\uc791\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\ub0b4\uc7a5\ub41c JSON \ubb38\uc790\uc5f4\uc744 \uc77d\uc5b4 \ud30c\uc2f1<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc2a4\ud06c\ub9bd\ud2b8 \uc0c1\ub2e8 \uc5b4\ub518\uac00\uc5d0 <code>EMBEDDED_DATA = '''...'''<\/code> \ud615\uc2dd\uc73c\ub85c \ub9e4\ub2c8\ud398\uc2a4\ud2b8 \ubb38\uc790\uc5f4\uc774 \ub4e4\uc5b4 \uc788\uace0,<\/li>\n\n\n\n<li>\uc2e4\ud589 \uc2dc \uc774\uac78 <code>json.loads<\/code>\ub85c \ub515\uc154\ub108\ub9ac\ub85c \ubc14\uafc9\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\ud30c\uc77c \uac1c\uc218 \ud30c\uc545 \u2192 \uc9c4\ud589 \uba54\uc2dc\uc9c0 \ucd9c\ub825<\/strong>\n<ul class=\"wp-block-list\">\n<li>\ucd1d \uba87 \uac1c \ud30c\uc77c\uc774 \ub4e4\uc5b4 \uc788\ub294\uc9c0 \uc138\uace0,<\/li>\n\n\n\n<li>\ubcf5\uc6d0 \uc9c4\ud589 \uc0c1\ud669\uc744 \ucf58\uc194\uc5d0 \ucd9c\ub825\ud574\uc90d\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\ud56d\ubaa9\ub9c8\ub2e4 \ud3f4\ub354 \uc0dd\uc131 \u2192 \ud30c\uc77c \uc4f0\uae30<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uac01 \ud30c\uc77c \uacbd\ub85c\uc5d0 \ub300\ud574 \uc0c1\uc704 \ud3f4\ub354\uac00 \uc5c6\uc73c\uba74 <code>os.makedirs<\/code>\ub85c \uc0dd\uc131\ud558\uace0<\/li>\n\n\n\n<li><code>binary<\/code> \ud50c\ub798\uadf8\uc5d0 \ub530\ub77c\n<ul class=\"wp-block-list\">\n<li>\ud14d\uc2a4\ud2b8\uba74 \uadf8\ub0e5 \ubb38\uc790\uc5f4\uc744 \ud30c\uc77c\ub85c \uc4f0\uace0,<\/li>\n\n\n\n<li>\ubc14\uc774\ub108\ub9ac\uba74 Base64 \ubb38\uc790\uc5f4\uc744 \ub2e4\uc2dc \ub514\ucf54\ub529\ud574\uc11c \ubc14\uc774\ub108\ub9ac\ub85c \uc501\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\uc694\uc57d \ucd9c\ub825<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u201c\ucd1d N\uac1c \uc911 M\uac1c \ubcf5\uc6d0 \uc644\ub8cc\u201d \uac19\uc740 \uc694\uc57d \uba54\uc2dc\uc9c0\ub97c \ucd9c\ub825\ud558\uba74\uc11c \uc885\ub8cc\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\uacb0\uad6d \uc774 self extracting script \ud558\ub098\ub9cc \uc788\uc73c\uba74,<br>\uc5b4\ub514\uc5d0\uc11c\ub4e0 <strong>\u201c\ud3f4\ub354 \uad6c\uc870 + \ud30c\uc77c \ub0b4\uc6a9\u201d\uc744 \uc7ac\ud604\ud558\ub294 \uc790\ub3d9 \uc124\uce58 \ud504\ub85c\uadf8\ub7a8<\/strong>\ucc98\ub7fc \ub3d9\uc791\ud558\uac8c \ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. \uc2e4\uc81c\ub85c \uc4f0\ub294 \uc6cc\ud06c\ud50c\ub85c\uc6b0 \uc608\uc2dc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c \ud604\uc5c5\uc5d0\uc11c \uc4f4\ub2e4\uace0 \uac00\uc815\ud558\uace0, \ucd5c\ub300\ud55c \uac04\ub2e8\ud558\uac8c \uc801\uc5b4\ubcfc\uac8c\uc694.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\ub0b4 PC\uc5d0\uc11c<\/strong>\n<ul class=\"wp-block-list\">\n<li>\ud504\ub85c\uc81d\ud2b8 \ub8e8\ud2b8\uc5d0\uc11c packer \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc2e4\ud589<\/li>\n\n\n\n<li>\uacb0\uacfc\ubb3c\ub85c \u201c\ubaa8\ub4e0 \uac78 \ud488\uc740 self extracting script\u201d\uac00 \uc0dd\uc131<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\ud30c\uc77c \uc804\ub2ec<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc774 \uacb0\uacfc\ubb3c \ud30c\uc77c <strong>1\uac1c\ub9cc USB\ub098 \ub0b4\ubd80\ub9dd\uc73c\ub85c \ubcf5\uc0ac\/\uc804\ub2ec<\/strong><\/li>\n\n\n\n<li>\ucd94\uac00 \ud3f4\ub354, \uc555\ucd95 \ud574\uc81c, \uae43 \ud074\ub860\u2026 \uc544\ubb34\uac83\ub3c4 \ud544\uc694 \uc5c6\uc74c<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\ub300\uc0c1 PC\uc5d0\uc11c<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uacb0\uacfc\ubb3c \ud30c\uc77c\uc744 \uc2e4\ud589<\/li>\n\n\n\n<li>\uc790\ub3d9\uc73c\ub85c \ud3f4\ub354\uc640 \ud30c\uc77c\ub4e4\uc774 \ucad9 \ud480\ub9ac\uba74\uc11c <strong>\uc6d0\ub798 \uad6c\uc870\uc640 \uac70\uc758 \ub3d9\uc77c\ud55c \ud504\ub85c\uc81d\ud2b8<\/strong>\uac00 \ub9cc\ub4e4\uc5b4\uc9d0<\/li>\n\n\n\n<li>\uc774\ud6c4\uc5d0 \ud544\uc694\ud55c \uacbd\uc6b0\n<ul class=\"wp-block-list\">\n<li>\uac00\uc0c1\ud658\uacbd \uc0dd\uc131<\/li>\n\n\n\n<li>\uc758\uc874 \ud328\ud0a4\uc9c0 \uc124\uce58<\/li>\n\n\n\n<li>\ub370\uc774\ud130\ubca0\uc774\uc2a4 \ub9c8\uc774\uadf8\ub808\uc774\uc158 \/ \ucd08\uae30 \ub370\uc774\ud130 \ub85c\ub4dc<\/li>\n\n\n\n<li>\uc571 \uc2e4\ud589<br>\uc774\ub7f0 \uac83\ub4e4\uc744 \ucc28\ub840\ub300\ub85c \uc218\ud589\ud558\uba74 \ub429\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub807\uac8c \ud55c \ubc88 \ub9db\uc744 \ubcf4\uba74, \uc9c4\uc9dc\ub85c \u201csingle file deployment \ube44\uc2b7\ud55c \ub9db\u201d\uc774 \ub098\uae30 \ub54c\ubb38\uc5d0 \uaf64 \uc911\ub3c5\uc131\uc774 \uc788\uc2b5\ub2c8\ub2e4 \ud83d\ude04<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. \uc8fc\uc758\ud574\uc57c \ud560 \uc810 (\ubcf4\uc548\u00b7\uc6a9\ub7c9)<\/h2>\n\n\n<style>.kb-image5560_dba3ee-07 .kb-image-has-overlay:after{opacity:0.3;}<\/style>\n<div class=\"wp-block-kadence-image kb-image5560_dba3ee-07\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"600\" height=\"329\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-5-600x329.jpg\" alt=\"security image\" class=\"kb-img wp-image-5566\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-5-600x329.jpg 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-5-300x165.jpg 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-5-768x421.jpg 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-5-18x10.jpg 18w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-5.jpg 992w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ubc29\uc2dd\uc740 \uac15\ub825\ud558\uc9c0\ub9cc, \ub3d9\uc2dc\uc5d0 \uba87 \uac00\uc9c0 \uc911\uc694\ud55c \ud3ec\uc778\ud2b8\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\uc18c\uc2a4 \ucf54\ub4dc\u00b7\ub370\uc774\ud130\uac00 \uc804\ubd80 \ub4e4\uc5b4\uac04\ub2e4<\/strong>\n<ul class=\"wp-block-list\">\n<li>self extracting script \uc548\uc5d0 <strong>\ud504\ub85c\uc81d\ud2b8\uc758 \ubaa8\ub4e0 \ud30c\uc77c\u00b7\ub370\uc774\ud130\uac00 \uadf8\ub300\ub85c \ud3ec\ud568<\/strong>\ub429\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\uc989, \uc774 \ud30c\uc77c \uc790\uccb4\uac00 \uace7 \ud504\ub85c\uc81d\ud2b8 \uc804\uccb4\uc774\ubbc0\ub85c\n<ul class=\"wp-block-list\">\n<li>\uc678\ubd80 \uc720\ucd9c, \uba54\uc2e0\uc800 \uc804\uc1a1, \uba54\uc77c \ucca8\ubd80 \uc2dc <strong>\ubcf4\uc548\uc5d0 \uac01\ubcc4\ud788 \uc8fc\uc758<\/strong>\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Base64 \ub54c\ubb38\uc5d0 \uc6a9\ub7c9\uc774 \ub298\uc5b4\ub0a8<\/strong>\n<ul class=\"wp-block-list\">\n<li>\ubc14\uc774\ub108\ub9ac \ud30c\uc77c(\uc774\ubbf8\uc9c0, DB \ud30c\uc77c \ub4f1)\uc740 Base64 \ubb38\uc790\uc5f4\ub85c \ubcc0\ud658\ub418\uae30 \ub54c\ubb38\uc5d0<\/li>\n\n\n\n<li>\uc6d0\ub798\ubcf4\ub2e4 <strong>\uc57d 30% \uc774\uc0c1 \uc6a9\ub7c9\uc774 \ucee4\uc9c0\ub294 \uacbd\ud5a5<\/strong>\u304c\u3042\u308a\u307e\u3059\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\ubb34\uc5c7\uc744 \u201c\ud3ec\ud568\ud560\uc9c0\/\uc81c\uc678\ud560\uc9c0\u201d \uc804\ub7b5\uc774 \uc911\uc694<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc608\ub97c \ub4e4\uc5b4 \uc544\ub798\ub294 \ubcf4\ud1b5 \uc81c\uc678 \ud6c4\ubcf4\uc785\ub2c8\ub2e4.\n<ul class=\"wp-block-list\">\n<li>\uce90\uc2dc\/\ub85c\uadf8 \ud3f4\ub354<\/li>\n\n\n\n<li>\ub300\uc6a9\ub7c9 raw \ub370\uc774\ud130<\/li>\n\n\n\n<li>\uc790\ub3d9 \uc0dd\uc131\ub418\ub294 \ube4c\ub4dc \uacb0\uacfc\ubb3c<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\ubc18\ub300\ub85c, \ubc18\ub4dc\uc2dc \ud3ec\ud568\ud574\uc57c \ud560 \uac83:\n<ul class=\"wp-block-list\">\n<li>\uc2e4\uc81c \uc2e4\ud589\uc5d0 \ud544\uc694\ud55c \uc124\uc815 \ud30c\uc77c, \uc2a4\ud06c\ub9bd\ud2b8, \ud15c\ud50c\ub9bf, \uc815\uc801 \ud30c\uc77c \ub4f1<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\ubbfc\uac10\ud55c \uc124\uc815 \ud30c\uc77c(.env \ub4f1)\uc740 \uc0c1\ud669\uc5d0 \ub530\ub77c<\/strong>\n<ul class=\"wp-block-list\">\n<li>\ub0b4\ubd80 \uc804\uc6a9\uc774\ub77c\uba74 \ud3ec\ud568\ud574\ub3c4 \ub418\uc9c0\ub9cc,<\/li>\n\n\n\n<li>\uc678\ubd80\ub85c \ub098\uac00\uac70\ub098 \uc5ec\ub7ec \uc0ac\ub78c\uacfc \uacf5\uc720\ub418\ub294 \ud30c\uc77c\uc774\ub77c\uba74\n<ul class=\"wp-block-list\">\n<li>\ud658\uacbd \uc124\uc815\uc740 \ub530\ub85c \ubc30\ud3ec\ud558\ub3c4\ub85d \uc124\uacc4\ud558\ub294 \uac8c \uc548\uc804\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">8. \ucd08\ubcf4\uc790\ub97c \uc704\ud55c \uc6a9\uc5b4 \uc815\ub9ac<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ub9c8\uc9c0\ub9c9\uc73c\ub85c, \uc774 \uae00\uc5d0 \ub098\uc628 \uc6a9\uc5b4\ub4e4\uc744 <strong>\uc9e7\uac8c \uc815\ub9ac<\/strong>\ud574\ub458\uac8c\uc694.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\uc544\uce74\uc774\ube59(Archiving)<\/strong><br>\uc5ec\ub7ec \ud30c\uc77c\uacfc \ud3f4\ub354\ub97c <strong>\ud55c \ubc88\uc5d0 \ubb36\uc5b4\uc11c \ubcf4\uad00<\/strong>\ud558\uac70\ub098 \uc62e\uae30\uae30 \uc88b\uc740 \ud615\ud0dc\ub85c \ub9cc\ub4dc\ub294 \uac83.<br>\uc5ec\uae30\uc11c\ub294 \u201c\ud504\ub85c\uc81d\ud2b8 \uc804\uccb4\ub97c \uc2a4\uce94\ud574\uc11c \ud55c \uac1c\uc758 \uc2a4\ud06c\ub9bd\ud2b8\ub85c \ub9cc\ub4dc\ub294 \uacfc\uc815\u201d\uc744 \ub9d0\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>python project packer<\/strong><br>\ud30c\uc774\uc36c\uc73c\ub85c \uc791\uc131\ub41c,<br>\u201c\ud504\ub85c\uc81d\ud2b8\ub97c \uc77d\uc5b4\uc11c \u2192 \ub370\uc774\ud130\ub85c \ub9cc\ub4e4\uace0 \u2192 self extracting script\ub85c \ubf51\uc544\uc8fc\ub294\u201d <strong>\uc790\ub3d9 \ud3ec\uc7a5 \ub3c4\uad6c<\/strong>\ub97c \ud1b5\uce6d\ud558\ub294 \ud45c\ud604\uc785\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>self extracting script<\/strong><br>\uc548\uc5d0 <strong>\ub370\uc774\ud130\uc640 \ubcf5\uc6d0 \ub85c\uc9c1\uc744 \ub3d9\uc2dc\uc5d0 \uac00\uc9c0\uace0 \uc788\ub294 \ud30c\uc774\uc36c \uc2a4\ud06c\ub9bd\ud2b8<\/strong>.<br>\ubcc4\ub3c4\uc758 \uc555\ucd95 \ud574\uc81c \ud504\ub85c\uadf8\ub7a8 \uc5c6\uc774 <strong>\uc790\uae30 \uc790\uc2e0\uc744 \uc2e4\ud589\ud574\uc11c<\/strong> \ud3f4\ub354\uc640 \ud30c\uc77c\uc744 \ubcf5\uc6d0\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>single file deployment<\/strong><br>\uc5ec\ub7ec \ub9ac\uc18c\uc2a4\ub97c \ud558\ub098\uc758 \ud30c\uc77c\ub85c \ubb36\uc5b4 <strong>\ud30c\uc77c \ud558\ub098\ub9cc \ubc30\ud3ec<\/strong>\ud558\uba74 \ub418\ub294 \ubc29\uc2dd.<br>\uc5ec\uae30\uc11c\ub294 \uacb0\uacfc \uc2a4\ud06c\ub9bd\ud2b8\ub97c \ubcf5\uc0ac\ud558\uace0 \uc2e4\ud589\ud558\ub294 \uac83\ub9cc\uc73c\ub85c \uac70\uc758 \ubc30\ud3ec\uc5d0 \uac00\uae4c\uc6b4 \ud6a8\uacfc\ub97c \ub0b4\ub294 \uac78 \ub73b\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>\ub9e4\ub2c8\ud398\uc2a4\ud2b8(Manifest)<\/strong><br>\u201c\uc5b4\ub5a4 \ud30c\uc77c\uc774 \uc5b4\ub514\uc5d0 \uc788\uc5c8\uace0, \ub0b4\uc6a9\uc740 \ubb34\uc5c7\uc774\uc5c8\ub294\uc9c0\u201d\ub97c \uc815\ub9ac\ud55c <strong>\ubaa9\ub85d(\uc0ac\uc804\ud615 \ub370\uc774\ud130)<\/strong>.<br>unpacker\uac00 \uc774 \ub9e4\ub2c8\ud398\uc2a4\ud2b8\ub97c \ubcf4\uace0 \ud3f4\ub354\uc640 \ud30c\uc77c\uc744 \uc7ac\uad6c\uc131\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>\ud14d\uc2a4\ud2b8 \ud30c\uc77c \/ \ubc14\uc774\ub108\ub9ac \ud30c\uc77c<\/strong>\n<ul class=\"wp-block-list\">\n<li>\ud14d\uc2a4\ud2b8 \ud30c\uc77c: \uc0ac\ub78c \ub208\uc73c\ub85c \uc77d\uc744 \uc218 \uc788\ub294 \ubb38\uc790 \uae30\ubc18 \ud30c\uc77c (\ucf54\ub4dc, \uc124\uc815, \ubb38\uc11c \ub4f1).<\/li>\n\n\n\n<li>\ubc14\uc774\ub108\ub9ac \ud30c\uc77c: \uc774\ubbf8\uc9c0, DB, \uc2e4\ud589 \ud30c\uc77c\ucc98\ub7fc <strong>\uc784\uc758\uc758 \ubc14\uc774\ud2b8 \ub370\uc774\ud130<\/strong>\ub85c \uad6c\uc131\ub41c \ud30c\uc77c.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Base64 \uc778\ucf54\ub529<\/strong><br>\ubc14\uc774\ub108\ub9ac \ub370\uc774\ud130\ub97c \ud14d\uc2a4\ud2b8(\ubb38\uc790\uc5f4)\ub85c \ubc14\uafb8\ub294 \ubc29\ubc95.<br>\uc774 \ub355\ubd84\uc5d0 \ubc14\uc774\ub108\ub9ac\ub3c4 JSON \uc548\uc5d0 \uc548\uc804\ud558\uac8c \ub123\uc744 \uc218 \uc788\uc9c0\ub9cc, \uc6a9\ub7c9\uc774 \uc57d\uac04 \ub298\uc5b4\ub0a9\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>\ubb34\uc2dc \ubaa9\ub85d(ignore list)<\/strong><br>\uc544\uce74\uc774\ube59\uc5d0\uc11c <strong>\uc81c\uc678\ud560 \ud30c\uc77c\/\ud3f4\ub354 \ud328\ud134<\/strong> \ubaa9\ub85d.<br><code>.git<\/code>, \uac00\uc0c1\ud658\uacbd, \uce90\uc2dc \ud3f4\ub354 \ub4f1\uc740 \uc5ec\uae30\uc5d0 \ub123\uc5b4\ub450\uba74 \uc88b\uc2b5\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>\uc2a4\ub0c5\uc0f7(Snapshot)<\/strong><br>\ud2b9\uc815 \uc2dc\uc810\uc758 \ud504\ub85c\uc81d\ud2b8 \uc0c1\ud0dc\ub97c \uadf8\ub300\ub85c \uc800\uc7a5\ud574 \ub454 \uac83.<br>\ub098\uc911\uc5d0 \ubb38\uc81c\uac00 \uc0dd\uacbc\uc744 \ub54c, \uc774 \uc2dc\uc810\uc73c\ub85c \ub418\ub3cc\uc544\uac00\ub294 \uae30\uc900\uc810 \uc5ed\ud560\uc744 \ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ud639\uc2dc \ub610 \ub2e4\ub978 \ud301\uc774 \uad81\uae08\ud558\uc2dc\uba74 <a href=\"https:\/\/secondlife.lol\/ja\/cmd-powershell-file-list-to-csv\/\" data-type=\"post\" data-id=\"2206\">CMD\u30b3\u30de\u30f3\u30c9\u3092\u5229\u7528\u3057\u305f\u30d5\u30a9\u30eb\u30c0\u30d5\u30a1\u30a4\u30eb\u30ea\u30b9\u30c8\u3092\u62bd\u51fa\u3059\u308b\u65b9\u6cd5(feat.PowerShell)<\/a> \ud3ec\uc2a4\ud2b8\ub3c4 \ucc38\uace0\ud574\ubcf4\uc138\uc694!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>","protected":false},"excerpt":{"rendered":"<p>1. Python Project Packer? \u201c\uc555\ucd95\ud30c\uc77c \ub9d0\uace0, \ud30c\uc774\uc36c \ud30c\uc77c \ud558\ub098\ub9cc \uac00\uc838\uc624\uc138\uc694\u201d&#8230;<\/p>","protected":false},"author":3,"featured_media":5561,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[15],"tags":[1097,34,1096,1095,1093,1099,1100,1094,1098,1101],"class_list":["post-5560","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-it-jewel","tag-project-archive","tag-python","tag-python-project-packer","tag-self-extracting-script","tag-single-file-deployment","tag-1099","tag-1100","tag-1094","tag-1098","tag-1101"],"taxonomy_info":{"category":[{"value":15,"label":"D \ubcf4\ubb3c\ucc3d\uace0(Jewel)"}],"post_tag":[{"value":1097,"label":"project archive"},{"value":34,"label":"python"},{"value":1096,"label":"python project packer"},{"value":1095,"label":"self extracting script"},{"value":1093,"label":"single file deployment"},{"value":1099,"label":"\uac1c\ubc1c \uc790\ub3d9\ud654"},{"value":1100,"label":"\uac1c\ubc1c\ud301"},{"value":1094,"label":"\ub0b4\ubd80\ub9dd \ubc30\ud3ec"},{"value":1098,"label":"\ud30c\uc774\uc36c \uc2a4\ud06c\ub9bd\ud2b8"},{"value":1101,"label":"\ud504\ub85c\uc81d\ud2b8 \uc774\uc0ac"}]},"featured_image_src_large":["https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-14-2-600x350.jpg",600,350,true],"author_info":{"display_name":"TERE","author_link":"https:\/\/secondlife.lol\/ja\/author\/tere\/"},"comment_info":0,"category_info":[{"term_id":15,"name":"D \ubcf4\ubb3c\ucc3d\uace0(Jewel)","slug":"it-jewel","term_group":0,"term_taxonomy_id":15,"taxonomy":"category","description":"","parent":0,"count":59,"filter":"raw","cat_ID":15,"category_count":59,"category_description":"","cat_name":"D \ubcf4\ubb3c\ucc3d\uace0(Jewel)","category_nicename":"it-jewel","category_parent":0}],"tag_info":[{"term_id":1097,"name":"project archive","slug":"project-archive","term_group":0,"term_taxonomy_id":1097,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":34,"name":"python","slug":"python","term_group":0,"term_taxonomy_id":34,"taxonomy":"post_tag","description":"","parent":0,"count":21,"filter":"raw"},{"term_id":1096,"name":"python project packer","slug":"python-project-packer","term_group":0,"term_taxonomy_id":1096,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1095,"name":"self extracting script","slug":"self-extracting-script","term_group":0,"term_taxonomy_id":1095,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1093,"name":"single file deployment","slug":"single-file-deployment","term_group":0,"term_taxonomy_id":1093,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1099,"name":"\uac1c\ubc1c \uc790\ub3d9\ud654","slug":"%ea%b0%9c%eb%b0%9c-%ec%9e%90%eb%8f%99%ed%99%94","term_group":0,"term_taxonomy_id":1099,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1100,"name":"\uac1c\ubc1c\ud301","slug":"%ea%b0%9c%eb%b0%9c%ed%8c%81","term_group":0,"term_taxonomy_id":1100,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1094,"name":"\ub0b4\ubd80\ub9dd \ubc30\ud3ec","slug":"%eb%82%b4%eb%b6%80%eb%a7%9d-%eb%b0%b0%ed%8f%ac","term_group":0,"term_taxonomy_id":1094,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1098,"name":"\ud30c\uc774\uc36c \uc2a4\ud06c\ub9bd\ud2b8","slug":"%ed%8c%8c%ec%9d%b4%ec%8d%ac-%ec%8a%a4%ed%81%ac%eb%a6%bd%ed%8a%b8","term_group":0,"term_taxonomy_id":1098,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1101,"name":"\ud504\ub85c\uc81d\ud2b8 \uc774\uc0ac","slug":"%ed%94%84%eb%a1%9c%ec%a0%9d%ed%8a%b8-%ec%9d%b4%ec%82%ac","term_group":0,"term_taxonomy_id":1101,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"}],"_links":{"self":[{"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/posts\/5560","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/comments?post=5560"}],"version-history":[{"count":3,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/posts\/5560\/revisions"}],"predecessor-version":[{"id":5567,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/posts\/5560\/revisions\/5567"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/media\/5561"}],"wp:attachment":[{"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/media?parent=5560"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/categories?post=5560"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/secondlife.lol\/ja\/wp-json\/wp\/v2\/tags?post=5560"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}