{"@attributes":{"version":"2.0"},"channel":{"title":"\ud788\ub370\ucfe0\ub9c8 \uac1c\ubc1c\ube14\ub85c\uadf8","description":"\ube7c\uc5b4\ub09c \uac83 \uc5c6\uc5b4, \ub0a8\ub4e4\ub9cc\ud07c \uc0bd\uc9c8\ud558\ub2e4 \uc2b5\ub4dd\ud55c \uac1c\ubc1c \uae30\ub85d, Python\uc744 \uac00\uc7a5 \uc0ac\ub791\ud569\ub2c8\ub2e4.\n","link":"https:\/\/hidekuma.github.io","pubDate":"Wed, 20 Dec 2023 08:44:12 +0000","lastBuildDate":"Wed, 20 Dec 2023 08:44:12 +0000","generator":"Jekyll v3.9.3","item":[{"title":"GCP: Firebase\ub97c \ud1b5\ud55c Serverless \uc6f9\uc0ac\uc774\ud2b8 \uc6b4\uc601\ud6c4\uae30","description":"<h3 id=\"firebase-\uae30\ubc18-serverless-\uc6f9-\uc571-\uc81c\uc791\">Firebase \uae30\ubc18 Serverless \uc6f9 \uc571 \uc81c\uc791<\/h3>\n<p>\uac1c\uc778\uc801\uc73c\ub85c AWS\uac00 \ub354 \uce5c\uc219\ud558\uace0 \uc0ac\uc6a9\uacbd\ud5d8\uc774 \ub9ce\uae30\uc5d0 \uc0ac\uc2e4 \ud574\ub2f9 \ud504\ub85c\uc81d\ud2b8\ub97c \uc2dc\uc791\ud560 \ub54c, AWS\ub97c \uc0ac\uc6a9\ud558\ub294 \ud3b8\uc774 \uc18d\ub3c4\ub294 \ub098\uc654\uaca0\uc9c0\ub9cc \ubb50\ub4e0 \uc5ec\uc720\ub85c\uc6b8 \ub54c \ud559\uc2b5\ud558\ub294 \uac83\uc774 \uc88b\uae30\uc5d0, \uad73\uc774 GCP\ub97c \ud0dd\ud588\ub2e4. \ub610\ud55c 1\ub144 Free Trial 300\ub2ec\ub7ec\ub294 \uc774\uac83 \uc800\uac83 \ud574\ubcf4\uae30\uc5d0 \ub531 \uc88b\uc558\ub2e4.<\/p>\n\n<h4 id=\"\uc11c\ube44\uc2a4-\uc18c\uac1c\">\uc11c\ube44\uc2a4 \uc18c\uac1c<\/h4>\n<p>\uc804\uc138 \uacc4\uc57d \uc2dc\uc5d0, \uac04\ud3b8\ud558\uac8c \uc815\ubcf4\ub97c \uc870\ud68c\ud558\uace0 \uacc4\uc57d\ud558\uae30 \uc548\uc804\ud55c \uc9d1\uc778\uc9c0 \uc18c\uc815\uc758 \uc9c0\ud45c\ub97c \uc81c\uacf5\ud558\ub294 \uc6f9 \uc0ac\uc774\ud2b8\uc774\ub2e4. \ud574\ub2f9 \ud504\ub85c\uc81d\ud2b8\ub294 2021\ub144 04\uc6d4 01\uc77c\uc744 \uae30\uc900\uc73c\ub85c \uc11c\ube44\uc2a4\ub97c \uc885\ub8cc\ud558\ubbc0\ub85c, \ub530\ub85c \ub3c4\uba54\uc778\uc744 \ub0a8\uae30\uc9c4 \uc54a\uaca0\ub2e4.<\/p>\n<iframe style=\"max-width: 320px;\" width=\"320\" height=\"240\" src=\"https:\/\/youtube.com\/embed\/IlFvkp22sqw?start=0\" allowfullscreen=\"\" frameborder=\"0\"><\/iframe>\n\n<hr \/>\n\n<h3 id=\"\uae30\uc220\uc2a4\ud0dd\">\uae30\uc220\uc2a4\ud0dd<\/h3>\n<p>\uc11c\ube44\uc2a4 \ubaa8\ub378 \uc790\uccb4\uac00 \ubcc4\ub3c4\uc758 \ud070 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub098 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc774 \ud544\uc694 \uc5c6\ub294 \ub8f0\ubca0\uc774\uc2a4 \uae30\ubc18 \uc2dc\uc2a4\ud15c\uc774\uc600\uae30\uc5d0 \uc778\ud504\ub77c \uad6c\uc131\uc740 \ub9e4\uc6b0 \uac04\ub2e8\ud558\ub2e4.<\/p>\n\n<h4 id=\"server\">Server<\/h4>\n<p>Python Flask \uae30\ubc18\uc758 \uc6f9 \uc73c\ub85c, \uc6f9 \uc11c\ubc84\uc640 API\uc11c\ubc84\ub85c \ubd84\ub9ac\ub418\uc5b4\uc788\ub2e4.\nServerless\ub85c \uad6c\uc131\ud558\uae30 \uc704\ud574\uc11c \uc544\ub798\uc640 \uac19\uc774 Cloud Run\uc744 \uc774\uc6a9\ud558\uc600\ub2e4.<\/p>\n\n<p><img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/iskangtong\/apiandweb.png\" alt=\"image-center\" class=\"align-center\" \/><\/p>\n\n<p>\uac1c\uc778 \ud504\ub85c\uc81d\ud2b8\uc600\uae30\uc5d0 \ud611\uc5c5 \uac00\ub2a5\uc131\uc740 \uc5c6\uc5c8\uc9c0\ub9cc, API \uc81c\uc791\uc2dc\uc5d0 \ud544\uc218\uc801\uc73c\ub85c \ubb38\uc11c\ud654\ub97c \uc9c4\ud589\ud558\ub294 \ud3b8\uc774\ubbc0\ub85c, \uc544\ub798\uc640 \uac19\uc774 Swagger\ub97c \ud1b5\ud574 API Documentation\uc744 \uc790\ub3d9\ud654\ud588\ub2e4.<\/p>\n\n<p><img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/iskangtong\/swagger.png\" alt=\"image-center\" class=\"align-center\" \/><\/p>\n\n<h4 id=\"deploy\">Deploy<\/h4>\n<p>Cloud Build\ub97c \ud1b5\ud574 Python Flask \uc571\uc744 \ube4c\ub4dc\ud55c \ub3c4\ucee4 \uc774\ubbf8\uc9c0(Dockerfile)\ub97c \ub9cc\ub4e4\uace0 Cloud Run\uc5d0 \ubc30\ud3ec\ud588\ub2e4.<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c\"># \ub3c4\ucee4 \uc774\ubbf8\uc9c0\ub97c \ube4c\ub4dc<\/span>\ngcloud builds submit <span class=\"nt\">--tag<\/span> gcr.io\/iskangtong\/apiv1\n\n<span class=\"c\"># \ub3c4\ucee4 \uc774\ubbf8\uc9c0\ub97c Cloud Run\uc5d0 \ubc30\ud3ec\ud558\uc5ec \uc11c\ubc84\ub9ac\uc2a4\ub85c \uc6b4\uc601<\/span>\ngcloud run deploy apiv1 <span class=\"nt\">--region<\/span> asia-northeast1 <span class=\"nt\">--platform<\/span> managed <span class=\"nt\">--image<\/span> gcr.io\/iskangtong\/apiv1\n<\/code><\/pre><\/div><\/div>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c\"># Static\ud55c \ud30c\uc77c\uc744 \ub2e4\ub8e8\ub294 Hosting\uc601\uc5ed\uc744 \ubc30\ud3ec<\/span>\n.\/node_modules\/.bin\/firebase deploy <span class=\"nt\">--only<\/span> hosting  \n<\/code><\/pre><\/div><\/div>\n\n<h4 id=\"routing\">Routing<\/h4>\n<p>Firebase\ub97c \ud1b5\ud574 \ud638\uc2a4\ud305\ub418\ub294 \ud2b8\ub798\ud53d\uc744 Cloud Run\uc5d0 \ubc30\ud3ec\ud55c \uc11c\ubc84\ub9ac\uc2a4 \uc6f9\uc73c\ub85c \uc804\ub2ec\ud574\uc57c\ud558\ub294\ub370, \uc774 \uc124\uc815\uc740 firebase.json\uc744 \ud1b5\ud574 \uc9c4\ud589\ud558\uba74 \ub41c\ub2e4.<\/p>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"o\">{<\/span>\n  <span class=\"s2\">\"hosting\"<\/span>: <span class=\"o\">{<\/span>\n    <span class=\"s2\">\"public\"<\/span>: <span class=\"s2\">\"static\"<\/span>,\n    <span class=\"s2\">\"ignore\"<\/span>: <span class=\"o\">[<\/span>\n      <span class=\"s2\">\"firebase.json\"<\/span>,\n      <span class=\"s2\">\"**\/.*\"<\/span>,\n      <span class=\"s2\">\"**\/node_modules\/**\"<\/span>\n    <span class=\"o\">]<\/span>,\n    <span class=\"s2\">\"headers\"<\/span>: <span class=\"o\">[<\/span>\n        <span class=\"o\">{<\/span>\n            <span class=\"s2\">\"source\"<\/span>: <span class=\"s2\">\"\/api\/@(v1)\/**\"<\/span>,\n            <span class=\"s2\">\"headers\"<\/span>: <span class=\"o\">[<\/span> <span class=\"o\">{<\/span>\n                 <span class=\"s2\">\"key\"<\/span>: <span class=\"s2\">\"Cache-Control\"<\/span>,\n                 <span class=\"s2\">\"value\"<\/span>: <span class=\"s2\">\"private, max-age=1800, s-maxage=3600\"<\/span>\n            <span class=\"o\">}<\/span> <span class=\"o\">]<\/span>\n        <span class=\"o\">}<\/span>,\n        <span class=\"o\">{<\/span>\n            <span class=\"s2\">\"source\"<\/span>: <span class=\"s2\">\"\/swaggerui\/**\"<\/span>,\n            <span class=\"s2\">\"headers\"<\/span>: <span class=\"o\">[<\/span> <span class=\"o\">{<\/span>\n                 <span class=\"s2\">\"key\"<\/span>: <span class=\"s2\">\"Cache-Control\"<\/span>,\n                 <span class=\"s2\">\"value\"<\/span>: <span class=\"s2\">\"public, max-age=43200, s-maxage=86400\"<\/span>\n            <span class=\"o\">}<\/span> <span class=\"o\">]<\/span>\n        <span class=\"o\">}<\/span>\n    <span class=\"o\">]<\/span>,\n    <span class=\"s2\">\"rewrites\"<\/span>: <span class=\"o\">[<\/span>\n      <span class=\"o\">{<\/span>\n        <span class=\"s2\">\"source\"<\/span>: <span class=\"s2\">\"!\/@(api|swaggerui)\/**\"<\/span>,\n        <span class=\"s2\">\"run\"<\/span>: <span class=\"o\">{<\/span>\n            <span class=\"s2\">\"serviceId\"<\/span>: <span class=\"s2\">\"flask\"<\/span>,\n            <span class=\"s2\">\"region\"<\/span>: <span class=\"s2\">\"asia-northeast1\"<\/span>\n        <span class=\"o\">}<\/span>\n      <span class=\"o\">}<\/span>,\n      <span class=\"o\">{<\/span>\n        <span class=\"s2\">\"source\"<\/span>: <span class=\"s2\">\"\/api\/v1\/**\"<\/span>,\n        <span class=\"s2\">\"run\"<\/span>: <span class=\"o\">{<\/span>\n            <span class=\"s2\">\"serviceId\"<\/span>: <span class=\"s2\">\"apiv1\"<\/span>,\n            <span class=\"s2\">\"region\"<\/span>: <span class=\"s2\">\"asia-northeast1\"<\/span>\n        <span class=\"o\">}<\/span>\n      <span class=\"o\">}<\/span>,\n      <span class=\"o\">{<\/span>\n        <span class=\"s2\">\"source\"<\/span>: <span class=\"s2\">\"\/swaggerui\/**\"<\/span>,\n        <span class=\"s2\">\"run\"<\/span>: <span class=\"o\">{<\/span>\n            <span class=\"s2\">\"serviceId\"<\/span>: <span class=\"s2\">\"apiv1\"<\/span>,\n            <span class=\"s2\">\"region\"<\/span>: <span class=\"s2\">\"asia-northeast1\"<\/span>\n        <span class=\"o\">}<\/span>\n      <span class=\"o\">}<\/span>\n    <span class=\"o\">]<\/span>\n  <span class=\"o\">}<\/span>,\n  <span class=\"s2\">\"firestore\"<\/span>: <span class=\"o\">{<\/span>\n    <span class=\"s2\">\"rules\"<\/span>: <span class=\"s2\">\"firestore.rules\"<\/span>,\n    <span class=\"s2\">\"indexes\"<\/span>: <span class=\"s2\">\"firestore.indexes.json\"<\/span>\n  <span class=\"o\">}<\/span>,\n  <span class=\"s2\">\"storage\"<\/span>: <span class=\"o\">{<\/span>\n    <span class=\"s2\">\"rules\"<\/span>: <span class=\"s2\">\"storage.rules\"<\/span>\n  <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h4 id=\"domain\">Domain<\/h4>\n<p>Firebase\uc758 \uc88b\uc740 \uc810\uc740 *.web.app \uc774\ub77c\ub294 \ub3c4\uba54\uc778\uc744 \uae30\ubcf8\uc801\uc73c\ub85c \uc81c\uacf5\ud574\uc900\ub2e4. \ub530\ub77c\uc11c, \ub3c4\uba54\uc778\uc744 \ud06c\uac8c \uc2e0\uacbd\uc4f0\uc9c0 \uc54a\ub294\ub2e4\uba74 \uae30\ubcf8\uc73c\ub85c \uc81c\uacf5\ud558\ub294 \ud574\ub2f9 \ub3c4\uba54\uc778\uc744 \uc774\uc6a9\ud588\uc5b4\ub3c4 \ubb34\ubc29\ud588\ub2e4.<\/p>\n\n<p><img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/iskangtong\/domain.png\" alt=\"image-center\" class=\"align-center\" \/><\/p>\n\n<h4 id=\"database\">Database<\/h4>\n<p>Google Firestore\ub97c \uc774\uc6a9\ud558\uc600\uace0, \uc778\ud130\ud398\uc774\uc2a4\ub294 \ub2e4\ub974\uc9c0\ub9cc, Collection\uacfc Document\uac00 \uac1c\ub150\uc774 \uc874\uc7ac\ud558\uace0, NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \uc720\uc0ac\ud558\uac8c \uc0ac\uc6a9\uac00\ub2a5\ud558\uc600\ub2e4.<\/p>\n\n<p><img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/iskangtong\/firestore.png\" alt=\"image-center\" class=\"align-center\" \/><\/p>\n\n<h4 id=\"gcp-apis\">GCP APIs<\/h4>\n<p>\uc9c0\ub09c 30\uc77c \uae30\uc900\uc774\uba70, \uc804\uccb4\uc801\uc73c\ub85c \uc544\ub798\uc640 \uac19\uc774 GCP API\uac00 \uc0ac\uc6a9\ub418\uc5c8\ub2e4.<\/p>\n\n<p><img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/iskangtong\/gcpapis.png\" alt=\"image-center\" class=\"align-center\" \/><\/p>\n\n<hr \/>\n\n<h3 id=\"\uac1c\ubc1c-\ud6c4\uae30\">\uac1c\ubc1c \ud6c4\uae30<\/h3>\n<h4 id=\"firebase-\uc0ac\uc6a9\ud6c4\uae30\">Firebase \uc0ac\uc6a9\ud6c4\uae30<\/h4>\n<p>\ubaa8\ub4e0 \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud574\ubcf4\uc9c0 \uc54a\uc558\uc9c0\ub9cc, AWS amplify\uc640 \ube44\uc2b7\ud558\ub2e4\uace0 \ubcfc \uc218\uc788\uaca0\ub2e4. firebase SDK\uac00 \uc874\uc7ac\ud558\uace0 \uc0ac\uc6a9\ubc29\ubc95 \ub610\ud55c \uac01 \ubb38\uc11c\ub97c \ubcf4\uba74 \ub204\uad6c\ub77c\ub3c4 \uac1c\ubc1c\ud560 \uc218 \uc788\uac8c\ub054 \ub418\uc5b4\uc788\uc5c8\uae30 \ub54c\ubb38\uc5d0 \uc804\uccb4\uc801\uc778 \uac1c\ubc1c\uacbd\ud5d8\uc740 \ub9e4\uc6b0 \uc88b\uc558\ub2e4.<\/p>\n\n<p>\uba87 \uac00\uc9c0 \ucee4\ub9e8\ub4dc\ub85c \ube4c\ub4dc\uc640 \ubc30\ud3ec\ub97c \uac04\ud3b8\ud558\uac8c \uc9c4\ud589\ud560 \uc218 \uc788\uc5c8\uc73c\uba70, \uac1c\uc778\uc801\uc73c\ub85c\ub294 Backend \uac1c\ubc1c\uc790\uac00 \ud558\ub294 \uc77c\uc774 \uc5c6\uc5b4\uc84c\ub2e4\uace0 \ub290\ub084 \uc815\ub3c4\ub85c \ud3b8\ub9ac\ud588\ub2e4. Firebase \ucf58\uc194 \ud398\uc774\uc9c0\ub3c4 UI\/UX\uac00 \ub9e4\uc6b0 \uac04\ub2e8\ud558\uba70 \uc9c4\uc785\uc7a5\ubcbd\uc774 \ub9e4\uc6b0 \ub0ae\ub2e4\uace0 \ud310\ub2e8\ub418\uba70 \uc18c\uaddc\ubaa8 \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \ub3c4\uc785\ud574\ubcf4\ub294 \uac83\uc744 \ucd94\ucc9c\ud55c\ub2e4.<\/p>\n\n<h4 id=\"\uc11c\ube44\uc2a4-\ud6c4\uae30\">\uc11c\ube44\uc2a4 \ud6c4\uae30<\/h4>\n<p>\uc704\uc5d0\uc11c \ub9d0\ud588\ub4ef\uc774 \uc11c\ube44\uc2a4 \ubaa9\uc801\uc774 \uc804\uc138 \uacc4\uc57d \uc2dc\uc5d0, \uacc4\uc57d\ud558\uae30 \uc548\uc804\ud55c \uc9d1\uc778\uc9c0 \uc18c\uc815\uc758 \uc9c0\ud45c \uc81c\uacf5\ud558\ub294 \uc6f9\uc774\ub2e4.<\/p>\n\n<p>\ud558\uc9c0\ub9cc 2021\ub144, \uc0c8\ud574\uac00 \ubc1d\uc740 \uc9c0\uae08\ub3c4 \uc804\uc138\uac00\uaca9\uc774 \ud558\ub298\ub85c \uce58\uc19f\uace0 \uc788\uc5b4\uc11c, \ud2b9\ud788 \uc11c\uc6b8\uc5d0\ub294 \uc5ec\ub7ec\uac00\uc9c0 \uc774\uc720\ub85c \uc548\uc804\ud558\uc9c0 \uc54a\uc740 \uc9d1\uc774\uc5ec\ub3c4 \ub4e4\uc5b4\uac08 \uc218\ubc16\uc5d0 \uc5c6\ub294 \uc0c1\ud669\uc774 \ub418\uc5c8\ub2e4.\n\uc774\uac8c \uc11c\ube44\uc2a4 \uc885\ub8cc\uc758 \uac00\uc7a5 \ud070 \uc774\uc720\uc774\ub77c\uace0 \ubcfc \uc218 \uc788\uaca0\ub2e4. \uc804\uc138 \ub9e4\ubb3c\ub3c4 \uc5c6\uc744 \ubfd0\ub354\ub7ec \ud604\uc2e4\uc740 \uc774\uac83\uc800\uac83 \ub530\uc9c8 \uc815\ub3c4\ub85c \uc5ec\uc720\ub86d\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n\n<p>\uacb0\ucf54 \ub9ce\uc740 \uc0ac\uc6a9\uc790\uac00 \uc788\uc5c8\ub2e4\uace0 \ub9d0\ud560 \uc218\ub3c4 \uc5c6\uc9c0\ub9cc, \uc11c\ube44\uc2a4\ub97c \uc6b4\uc601\ud558\uba74\uc11c \uc5ec\ub7ec\ubc88\uc758 \uc774\uba54\uc77c\uc744 \ubc1b\uc558\ub2e4.\n\ub0b4\uc6a9\uc5d0\ub294 \uac74\uc758\uc0ac\ud56d\ub3c4 \uc788\uc5c8\uc9c0\ub9cc, \uac10\uc0ac\uc758 \uc778\uc0ac\ub3c4 \uc788\uc5c8\uae30\uc5d0 \ub204\uad70\uac00\uc5d0\uac8c\ub294 \ub3c4\uc6c0\uc774 \ub418\uc5c8\ub2e4\uace0 \uc0dd\uac01\ud558\uba74 \ub9e4\uc6b0 \ub9cc\uc871\uc2a4\ub7fd\ub2e4.<\/p>\n\n<p>\uac04\ub2e8\ud55c \uc6f9 \uc11c\ube44\uc2a4\uc600\uc9c0\ub9cc, \uacf5\uacf5\ub370\uc774\ud130 \ud3ec\ud138\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 API\ub294 \ucd1d 16\uac1c\uc600\ub2e4.\n\ucc38\uace0\ub85c \uacf5\uacf5\ub370\uc774\ud130 \ud3ec\ud0c8\uc758 API\ub4e4\uc740 \uc5b8\uc81c \uc7a5\uc560\uac00 \ub098\ub3c4 \uc774\uc0c1\ud558\uc9c0 \uc54a\uc73c\ubbc0\ub85c, \ubcc4\ub3c4\ub85c \uc801\uc7ac\ud574\uc11c \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \ubc14\ub78c\uc9c1\ud558\ub2e4.<\/p>\n\n<h5 id=\"\uc0ac\uc6a9\ub41c-\uacf5\uacf5\ub370\uc774\ud130-\ud3ec\ud0c8-api-\ud56d\ubaa9\">\uc0ac\uc6a9\ub41c \uacf5\uacf5\ub370\uc774\ud130 \ud3ec\ud0c8 API \ud56d\ubaa9<\/h5>\n<ul>\n  <li>[\uc2b9\uc778] \uad6d\ud1a0\uad50\ud1b5\ubd80_\uac74\ucd95\ubb3c\ub300\uc7a5\uc815\ubcf4 \uc11c\ube44\uc2a4<\/li>\n  <li>[\uc2b9\uc778] \uacf5\ub3d9\uc8fc\ud0dd\uac00\uaca9\uc815\ubcf4\uc11c\ube44\uc2a4<\/li>\n  <li>[\uc2b9\uc778] \uac1c\ubcc4\uc8fc\ud0dd\uac00\uaca9\uc815\ubcf4\uc11c\ube44\uc2a4<\/li>\n  <li>[\uc2b9\uc778] \uc0c1\uc5c5\uc5c5\ubb34\uc6a9 \ubd80\ub3d9\uc0b0 \ub9e4\ub9e4 \uc2e0\uace0 \uc790\ub8cc<\/li>\n  <li>[\uc2b9\uc778] \uc5f0\ub9bd\ub2e4\uc138\ub300 \uc804\uc6d4\uc138 \uc790\ub8cc<\/li>\n  <li>[\uc2b9\uc778] \uc544\ud30c\ud2b8 \uc804\uc6d4\uc138 \uc790\ub8cc<\/li>\n  <li>[\uc2b9\uc778] \ub2e8\ub3c5\/\ub2e4\uac00\uad6c \uc804\uc6d4\uc138 \uc790\ub8cc<\/li>\n  <li>[\uc2b9\uc778] \uc624\ud53c\uc2a4\ud154 \uc804\uc6d4\uc138 \uc2e0\uace0 \uc870\ud68c \uc11c\ube44\uc2a4<\/li>\n  <li>[\uc2b9\uc778] \uc624\ud53c\uc2a4\ud154 \ub9e4\ub9e4 \uc2e0\uace0 \uc870\ud68c \uc11c\ube44\uc2a4<\/li>\n  <li>[\uc2b9\uc778] \ub2e8\ub3c5\/\ub2e4\uac00\uad6c \ub9e4\ub9e4 \uc2e4\uac70\ub798 \uc790\ub8cc<\/li>\n  <li>[\uc2b9\uc778] \uc544\ud30c\ud2b8\ub9e4\ub9e4 \uc2e4\uac70\ub798\uc790\ub8cc<\/li>\n  <li>[\uc2b9\uc778] \uc5f0\ub9bd\ub2e4\uc138\ub300 \ub9e4\ub9e4 \uc2e4\uac70\ub798\uc790\ub8cc<\/li>\n  <li>[\uc2b9\uc778] \uac74\ucd95\ubb3c\ub300\uc7a5\uc815\ubcf4 \uc11c\ube44\uc2a4<\/li>\n  <li>[\uc2b9\uc778] \uac74\ucd95\ubb3c\uc5f0\ub839\uc815\ubcf4\uc11c\ube44\uc2a4<\/li>\n  <li>[\uc2b9\uc778] \ud1a0\uc9c0\ud2b9\uc131\uc815\ubcf4\uc11c\ube44\uc2a4<\/li>\n  <li>[\uc2b9\uc778] \ud1a0\uc9c0\uc18c\uc720\uc815\ubcf4\uc11c\ube44\uc2a4<\/li>\n<\/ul>\n\n<h5 id=\"\uad6d\uac00\ubcc4-\uc0ac\uc6a9\uc790\">\uad6d\uac00\ubcc4 \uc0ac\uc6a9\uc790<\/h5>\n<p><img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/iskangtong\/countries.png\" alt=\"image-center\" class=\"align-center\" \/><\/p>\n\n<h5 id=\"\uc778\uc785-\ub514\ubc14\uc774\uc2a4-\ube44\uc728-\ubc0f-\ud398\uc774\uc9c0\ubcc4-\uc870\ud68c\uc218\">\uc778\uc785 \ub514\ubc14\uc774\uc2a4 \ube44\uc728 \ubc0f \ud398\uc774\uc9c0\ubcc4 \uc870\ud68c\uc218<\/h5>\n<p><img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/iskangtong\/devices.png\" alt=\"image-center\" class=\"align-center\" \/>\n<img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/iskangtong\/pages.png\" alt=\"image-center\" class=\"align-center\" \/><\/p>\n\n<h5 id=\"\uc720\ub2c8\ud06c-\uc0ac\uc6a9\uc790-\ucd94\uc774\">\uc720\ub2c8\ud06c \uc0ac\uc6a9\uc790 \ucd94\uc774<\/h5>\n<p><img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/iskangtong\/users.png\" alt=\"image-center\" class=\"align-center\" \/><\/p>\n","pubDate":"Sat, 16 Jan 2021 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/gcp\/firebase\/website\/serverless\/iskangtong-firebase-app-website\/","guid":"https:\/\/hidekuma.github.io\/gcp\/firebase\/website\/serverless\/iskangtong-firebase-app-website\/","category":["gcp","firebase","website","serverless","gcp","firebase","website","serverless"]},{"title":"AWS: re:Invent 2020 \uc5d0\uc11c \ubc1c\ud45c\ub41c \uc2e0\uaddc \uc11c\ube44\uc2a4\/\uc5c5\ub370\uc774\ud2b8 \uac04\ub2e8\uc815\ub9ac","description":"<h4 id=\"\uc11c\ubc84-\uc778\uc2a4\ud134\uc2a4\">\uc11c\ubc84 \uc778\uc2a4\ud134\uc2a4<\/h4>\n<h5 id=\"amazon-ec2-mac-instances\">Amazon EC2 Mac instances<\/h5>\n<ul>\n  <li>macOS \uc6a9 Amazon Elastic Compute Cloud (EC2) Mac \uc778\uc2a4\ud134\uc2a4<\/li>\n  <li>EC2 Mac \uc778\uc2a4\ud134\uc2a4\ub97c \uc0ac\uc6a9\ud558\uba74 iPhone, iPad, Mac Apple Watch, Apple TV, Safari \uc571 \uac1c\ubc1c\uc790\ub294 macOS \ud658\uacbd\uc744 \uba87 \ubd84 \uc548\uc5d0 \uad6c\ucd95\ud558\uc5ec \uc561\uc138\uc2a4 \ud560 \uc218 \uc788\uace0, \ud544\uc694\uc5d0 \ub530\ub77c \uc6a9\ub7c9\uc744 \ub3d9\uc801\uc73c\ub85c \ud655\uc7a5\uac00\ub2a5<\/li>\n  <li>EC2 Mac \uc778\uc2a4\ud134\uc2a4\ub294 \ubca0\uc5b4 \uba54\ud0c8 \uc778\uc2a4\ud134\uc2a4 (mac1.metal)\uc5d0\uc11c \uc774\uc6a9 \uac00\ub2a5\ud558\uace0, macOS Mojave 10.14\uc640 macOS Catalina 10.15\uc744 \uc9c0\uc6d0\ud558\uace0 macOS Big Sur 11.0\uc758 \uc9c0\uc6d0\ub3c4 \uace7 \uc2dc\uc791<\/li>\n<\/ul>\n\n<hr \/>\n\n<h4 id=\"\uc11c\ubc84\ub9ac\uc2a4\">\uc11c\ubc84\ub9ac\uc2a4<\/h4>\n<h5 id=\"aws-lambda-lambda-functions\uc5d0\uc11c-\ucd5c\ub300-10gb\uc758-\uba54\ubaa8\ub9ac\uc640-6-\uac1c\uc758-vcpu-\ucf54\uc5b4-\uc9c0\uc6d0\">AWS Lambda, Lambda Functions\uc5d0\uc11c \ucd5c\ub300 10GB\uc758 \uba54\ubaa8\ub9ac\uc640 6 \uac1c\uc758 vCPU \ucf54\uc5b4 \uc9c0\uc6d0<\/h5>\n<ul>\n  <li>\ucd5c\ub300 10GB \uba54\ubaa8\ub9ac\uae4c\uc9c0 Lambda \ud568\uc218\ub97c \uc81c\uacf5 \ud560 \uc218\uc788\uac8c \ub418\uc5b4 \uae30\uc874\uc758 3,000MB \uc81c\ud55c\uc5d0 \ube44\ud574 3 \ubc30 \uc774\uc0c1 \uc99d\uac00<\/li>\n<\/ul>\n\n<h5 id=\"lambda-container-support\">Lambda Container Support<\/h5>\n<ul>\n  <li>\ucd5c\ub300 10GB \ud06c\uae30\uc758 \ucee8\ud14c\uc774\ub108 \uc774\ubbf8\uc9c0\ub85c \ud3ec\uc7a5\ud558\uace0 Lambda \ud568\uc218\ub85c \ubc30\ud3ec \uac00\ub2a5<\/li>\n  <li>\uc9c0\uc6d0\ub418\ub294 \ubaa8\ub4e0 Lambda \ub7f0\ud0c0\uc784 (Python, Node.js, Java .NET, Go, Ruby)\uc758 \uae30\ubcf8 \uc774\ubbf8\uc9c0\ub97c \uc81c\uacf5<\/li>\n  <li>\ucee8\ud14c\uc774\ub108 \uc774\ubbf8\uc9c0\uc758 \ub85c\uceec \ud14c\uc2a4\ud2b8\ub97c \uc2e4\uc2dc, Lambda\uc5d0 \ubc30\ud3ec \ud560 \ub54c \uc2e4\ud589\uc5ec\ubd80\ub97c \ud655\uc778\ud560 \uc218 Lambda \ub7f0\ud0c0\uc784 \uc778\ud130\ud398\uc774\uc2a4 \uc5d0\ubbac\ub808\uc774\ud130\ub3c4 \uc624\ud508 \uc18c\uc2a4\ub85c \uacf5\uac1c<\/li>\n<\/ul>\n\n<h5 id=\"amazon-cloudwatch-lambda-insights\">Amazon CloudWatch Lambda Insights<\/h5>\n<ul>\n  <li>Lambda \ud568\uc218\uc758 \uc131\ub2a5\uc744 \ubaa8\ub2c8\ud130\ub9c1, \ubb38\uc81c \ud574\uacb0 \ubc0f \ucd5c\uc801\ud654<\/li>\n  <li>Lambda \ud568\uc218\uc758 \uc131\ub2a5\uacfc \uac74\uc804\uc131\uc744 \uc815\ub9ac \ud55c \uc790\ub3d9\ud654 \ub41c \ub300\uc2dc \ubcf4\ub4dc, \uba54\ubaa8\ub9ac \ub204\uc218\uc640 \uc0c8\ub85c\uc6b4 \ud568\uc218\uc758 \ubc84\uc804\uc5d0 \ub530\ub978 \uc131\ub2a5\uc758 \ubcc0\ud654 \ub4f1\uc758 \ubb38\uc81c\ub97c \uac00\uc2dc\ud654<\/li>\n  <li>Lambda Insights\ub294 \ub2e4\uae30\ub2a5 \ubdf0\ub97c \uc0ac\uc6a9\ud558\uc5ec \uba54\ubaa8\ub9ac \ud560\ub2f9, \ud568\uc218\uc758 \uc9c0\uc18d \uc2dc\uac04, \uacbd\uacfc \uc2dc\uac04\uc758 \ubcc0\ud654\ub97c \ud30c\uc545\ud558\uace0, Lambda \ud568\uc218\uc758 \ud65c\uc6a9\ub3c4\ub97c \ucd5c\uc801\ud654\ud558\uace0, \ud568\uc218 \uc774\ub984 \ub610\ub294 \ud0dc\uadf8\ub85c \ud544\ud130\ub9c1\uc774 \uac00\ub2a5\ud568<\/li>\n  <li>\ub85c\uadf8\ub97c \ubd84\uc11d\ud558\ub294 CloudWatch Logs Insights \ubc0f \ud2b8\ub808\uc774\uc2f1 \ubd84\uc11d\uc758 CloudWatch ServiceLens \ub4f1 AWS \uc11c\ube44\uc2a4\uc640\uc758 \ud1b5\ud569<\/li>\n<\/ul>\n\n<hr \/>\n\n<h4 id=\"\uc11c\ubc84\ub9ac\uc2a4--ci--cd\">\uc11c\ubc84\ub9ac\uc2a4 &amp; CI \/ CD<\/h4>\n<h5 id=\"aws-proton\">AWS Proton<\/h5>\n<ul>\n  <li>\uc11c\ubc84\ub9ac\uc2a4 \ubc0f \ucee8\ud14c\uc774\ub108 \uae30\ubc18\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc778\ud504\ub77c \uad6c\ucd95\uacfc CI \/ CD \ub97c \uc9c0\uc6d0\ud558\ub294 \uc0c8\ub85c\uc6b4 \uc11c\ube44\uc2a4<\/li>\n  <li>\uc778\ud504\ub77c \ud300\uc5d0\uc11c \ud45c\uc900 \ud15c\ud50c\ub9bf\uc744 \uc911\uc559\uc5d0\uc11c \uc815\uc758\ud558\uace0 \uc870\uc9c1\uc758 \uac1c\ubc1c\uc790\uac00 \uadf8\uac83\uc744 \uc774\uc6a9\uac00\ub2a5<\/li>\n  <li>\uac1c\ubc1c\uc790\uc758 \uc0dd\uc0b0\uc131\uc5d0 \uc601\ud5a5\uc744\uc8fc\uc9c0 \uc54a\uace0 \uc778\ud504\ub77c\ub97c \uad00\ub9ac \ubc0f \uc5c5\ub370\uc774\ud2b8 \uac00\ub2a5<\/li>\n  <li>\uc77c\ubc18\uc801\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 CI \/ CD \ud30c\uc774\ud504 \ub77c\uc778 \ubc0f CodePipeline\uacfc CloudWatch \ub4f1\uc758 \uad00\uce21\uc131 \ub3c4\uad6c\uc640 \ud1b5\ud569<\/li>\n<\/ul>\n\n<hr \/>\n<h4 id=\"\uc11c\ubc84\ub9ac\uc2a4--\ub370\uc774\ud130\ubca0\uc774\uc2a4\">\uc11c\ubc84\ub9ac\uc2a4 &amp; \ub370\uc774\ud130\ubca0\uc774\uc2a4<\/h4>\n<h5 id=\"amazon-aurora-serverless-v1-8-\uac1c-\uc9c0\uc5ed\uc5d0\uc11c-\uc774\uc6a9-\uac00\ub2a5\">Amazon Aurora Serverless v1, 8 \uac1c \uc9c0\uc5ed\uc5d0\uc11c \uc774\uc6a9 \uac00\ub2a5<\/h5>\n<ul>\n  <li>Asia Pacific (Singapore), Asia Pacific (Sydney) Asia Pacific (Seoul), Asia Pacific (Mumbai), Canada (Central), Europe (London), Europe (Paris), US West (N. California)<\/li>\n<\/ul>\n\n<h5 id=\"amazon-aurora-serverless-v2\">Amazon Aurora Serverless v2<\/h5>\n<ul>\n  <li>\uc218\uc2ed\ub9cc \uac74\uc758 \ud2b8\ub79c\uc7ad\uc158\uc744 \uace0\uc18d\uc73c\ub85c \ucc98\ub9ac<\/li>\n  <li>\uc751\uc6a9 \ud504\ub85c\uadf8\ub7a8\uc774 \uc694\uad6c\ud558\ub294 \uc591\uc5d0 \ub530\ub77c \uc138\ubc00\ud55c \ub2e8\uc704\ub85c \uc6a9\ub7c9\uc744 \uc99d\uac10<\/li>\n  <li>\ud53c\ud06c\uc2dc \ud504\ub85c\ube44\uc800\ub2dd \uc6a9\ub7c9\uc5d0 \ube44\ud574 \ucd5c\ub300 90 % \uc808\uac10<\/li>\n<\/ul>\n\n<hr \/>\n\n<h4 id=\"\uc624\ube0c\uc81d\ud2b8-\uc2a4\ud1a0\ub9ac\uc9c0\">\uc624\ube0c\uc81d\ud2b8 \uc2a4\ud1a0\ub9ac\uc9c0<\/h4>\n<h5 id=\"amazon-s3\uc758-\uac15\ud55c-\uc77c\uad00\uc131\">Amazon S3\uc758 \uac15\ud55c \uc77c\uad00\uc131<\/h5>\n<ul>\n  <li>\ubaa8\ub4e0 S3 GET, PUT, LIST \ubc0f \uac1c\uccb4 \ud0dc\uadf8, ACL \ub610\ub294 \uba54\ud0c0 \ub370\uc774\ud130\ub97c \uc218\uc815\ud558\ub294 \uc791\uc5c5\uc758 \uc77c\uad00\uc131 \ud5a5\uc0c1<\/li>\n  <li>\uae30\uc874 \ubc0f \uc2e0\uaddc \ubaa8\ub4e0 S3 \uac1d\uccb4\uc5d0 \uc801\uc6a9\ub418\uba70, \ubaa8\ub4e0 \uc9c0\uc5ed\uc5d0\uc11c \uc791\ub3d9\ud558\uba70 \ucd94\uac00 \ube44\uc6a9\uc5c6\uc774 \uc774\uc6a9 \uac00\ub2a5<\/li>\n  <li>\uc131\ub2a5\uc5d0 \uc601\ud5a5\uc5c6\uc774 \ud544\uc694\uc5d0 \ub530\ub77c \uac1c\uccb4\ub97c 1 \ucd08\uc5d0 \uc218\ubc31 \ubc88 \uc5c5\ub370\uc774\ud2b8 \uac00\ub2a5<\/li>\n  <li>\uc0c8 \uac1c\uccb4 PUT\uc774 \uc131\uacf5\ud55c \ud6c4 \ub610\ub294 \uae30\uc874 \uac1c\uccb4\uac00 \ub36e\uc5b4 \uc4f4 \ud6c4 \ud6c4\uc18d GET\uc740 \uace7 \uac1c\uccb4\uc758 \ucd5c\uc2e0 \ubc84\uc804\uc744 \uc218\uc2e0<\/li>\n  <li>S3\ub294 LIST\uc5d0\ub3c4 \uac15\ub825\ud55c \uc77c\uad00\uc131\uc744 \uc81c\uacf5\ud558\uace0 \uc791\uc131 \ud6c4 \ubcc0\uacbd \uc0ac\ud56d\uc744 \ubc18\uc601\ud558\uc5ec \ubc84\ud0b7\uc758 \uac1c\uccb4 \ubaa9\ub85d\uc744 \uc989\uc2dc \uc2e4\ud589<\/li>\n<\/ul>\n\n<h5 id=\"amazon-s3-\ubcf5\uc81c-\uc5ec\ub7ec-\ub300\uc0c1-\ubc84\ud0b7\uc744-\uc9c0\uc6d0\">Amazon S3 \ubcf5\uc81c \uc5ec\ub7ec \ub300\uc0c1 \ubc84\ud0b7\uc744 \uc9c0\uc6d0<\/h5>\n<ul>\n  <li>\uc5ec\ub7ec \ubaa9\uc801\uc9c0\ub85c \ub370\uc774\ud130\ub97c \ubcf5\uc81c\ud558\uae30 \uc704\ud574 \uc790\uc2e0\uc758 \uc194\ub8e8\uc158\uc744 \uac1c\ubc1c\ud560 \ud544\uc694\uac00 \uc5c6\uc5b4\uc9c4\ub2e4<\/li>\n  <li>S3 \ubcf5\uc81c (\uba40\ud2f0 \ub370\uc2a4\ud2f0\ub124\uc774\uc158)\uc758 \uc720\uc5f0\uc131\uc744 \uc0ac\uc6a9\ud558\uc5ec, \ub370\uc774\ud130\uc758 \uc5ec\ub7ec \uc0ac\ubcf8\uc744 \uc0ac\uc6a9 \ubaa9\uc801\uc5d0 \ub530\ub77c \uc11c\ub85c \ub2e4\ub978 \uc2a4\ud1a0\ub9ac\uc9c0 \ud074\ub798\uc2a4, \uc11c\ub85c \ub2e4\ub978 \uc554\ud638\ud654 \uc720\ud615 \ub610\ub294 \ub2e4\ub978 \uacc4\uc815\uc5d0 \uc800\uc7a5<\/li>\n  <li>\uc5ec\ub7ec \ub300\uc0c1\uc73c\ub85c \ubcf5\uc81c\ud558\ub294 \uacbd\uc6b0 CloudWatch \uba54\ud2b8\ub9ad\uc744 \uc0ac\uc6a9\ud558\uc5ec \uac01 \uc9c0\uc5ed \uc30d\uc758 \ubcf5\uc81c\uc758 \uc9c4\ud589 \uc0c1\ud669\uc744 \ucd94\uc801 \uac00\ub2a5<\/li>\n  <li>\uae30\uc874\uc758 \ubaa8\ub4e0 S3 \ubcf5\uc81c \uae30\ub2a5\uc744 \uc9c0\uc6d0<\/li>\n<\/ul>\n\n<h5 id=\"amazon-s3-\ubcf5\uc81c-\uc591\ubc29\ud5a5-\ubcf5\uc81c-\uc9c0\uc6d0\">Amazon S3 \ubcf5\uc81c \uc591\ubc29\ud5a5 \ubcf5\uc81c \uc9c0\uc6d0<\/h5>\n<ul>\n  <li>\ub3d9\uc77c\ud55c AWS \ub9ac\uc804 \ub610\ub294 \ub2e4\ub978 AWS \ub9ac\uc804\uc5d0\uc11c 2 \uac1c \uc774\uc0c1\uc758 \ubc84\ud0b7\uac04\uc5d0 \uc591\ubc29\ud5a5 \ubcf5\uc81c\ub97c \ud560 \uacbd\uc6b0, \uc2e0\uaddc \ub610\ub294 \uae30\uc874 \ubcf5\uc81c \uaddc\uce59\uc73c\ub85c \ubcf5\uc81c \ubcc0\uacbd \ub3d9\uae30\ud654\ub97c \ud65c\uc131\ud654 \ud560 \uc218 \uc788\uc74c<\/li>\n  <li>S3 \ubcf5\uc81c \uba54\ud2b8\ub9ad\uc2a4 \ubc0f \ud1b5\uc9c0\ub97c \uc720\ud6a8\ud654 \ud558\ub294 \uac83\uc73c\ub85c, S3 \uad00\ub9ac \ucf58\uc194 \ub610\ub294 Amazon CloudWatch\uc5d0\uc11c \uac1c\uccb4\uc640 \uac1c\uccb4\uc758 \uba54\ud0c0 \ub370\uc774\ud130 \ubcf5\uc81c\uc758 \uc9c4\ud589 \uc0c1\ud669\uc744 \ubaa8\ub2c8\ud130\ub9c1 \ud560 \uc218 \uc788\uc74c<\/li>\n<\/ul>\n\n<h5 id=\"amazon-s3-bucket-key\">Amazon S3 Bucket Key<\/h5>\n<ul>\n  <li>S3\uc5d0\uc11c KMS\uc5d0 \uc694\uccad \ud2b8\ub798\ud53d\uc744 \uc904\uc774\uace0, \ucd5c\ub300 99 %\uc758 \ube44\uc6a9 \uc808\uac10<\/li>\n  <li>S3 Bucket Key\ub294 KMS \uc554\ud638\ud654 \uac1d\uccb4\uc5d0 \ub300\ud574 \ubcc4\ub3c4\uc758 KMS \ud0a4\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub77c KMS\ub97c \ud1b5\ud574 \ubc84\ud0b7 \uc218\uc900\uc758 \ud0a4\uac00 \uc0dd\uc131<\/li>\n  <li>S3\ub294\uc774 Bucket Key\ub97c \uc0ac\uc6a9\ud558\uc5ec \ubc84\ud0b7\uc758 \uac1d\uccb4\uc5d0 \uace0\uc720\uc758 \ub370\uc774\ud130 \ud0a4\ub97c \uc0dd\uc131\ud558\ub294 \uc554\ud638\ud654 \ucc98\ub9ac\ub97c \uc644\ub8cc\ud558\uae30 \uc704\ud574 KMS\uc5d0 \ucd94\uac00 \uc694\uccad\uc744 \ud560 \ud544\uc694\uac00 \uc5c6\uc5b4\uc9d0<\/li>\n  <li>\uadf8 \uacb0\uacfc, S3\uc5d0\uc11c KMS\uc5d0 \uc694\uccad \ud2b8\ub798\ud53d\uc774 \uac10\uc18c\ub418\uace0, \uae30\uc874\ubcf4\ub2e4 \uc801\uc740 \ube44\uc6a9\uc73c\ub85c S3\uc758 \uc554\ud638\ud654 \ub41c \uac1c\uccb4\uc5d0 \uc561\uc138\uc2a4 \ud560 \uc218 \uc788\uc74c<\/li>\n<\/ul>\n\n<hr \/>\n\n<h4 id=\"\ucee8\ud14c\uc774\ub108-\uc624\ucf00\uc2a4\ud2b8\ub808\uc774\uc158\">\ucee8\ud14c\uc774\ub108 \uc624\ucf00\uc2a4\ud2b8\ub808\uc774\uc158<\/h4>\n<h5 id=\"amazon-elastic-container-registry-public\">Amazon Elastic Container Registry Public<\/h5>\n<ul>\n  <li>ECR\uc740 \uac1c\uc778 \ucee8\ud14c\uc774\ub108 \uc774\ubbf8\uc9c0\ub9cc\uc744 \ud638\uc2a4\ud2b8 \ud560 \uc218 \uc788\uc5c8\uc9c0\ub9cc, \ub300\uc911 \uc774\ubbf8\uc9c0\ub3c4 \ud638\uc2a4\ud2b8 \uac00\ub2a5<\/li>\n<\/ul>\n\n<h5 id=\"amazon-ecs-anywhere\">Amazon ECS Anywhere<\/h5>\n<ul>\n  <li>\uc628\ud504\ub808\ubbf8\uc2a4\uc640 AWS\ub97c \ud6a1\ub2e8\ud558\uc5ec ECS\uc758 \uc778\ud504\ub77c\ub97c \uad6c\ucd95<\/li>\n  <li>\uc0ac\ub0b4\uc5d0\uc11c\ub3c4 ECS API\uc640 \ub3d9\uc77c\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub85c \uc870\uc791 \uac00\ub2a5<\/li>\n<\/ul>\n\n<h5 id=\"amazon-eks-anywhere\">Amazon EKS Anywhere<\/h5>\n<ul>\n  <li>\uc628\ud504\ub808\ubbf8\uc2a4\uc5d0 EKS\uc640 \uac19\uc740 \uac04\ud3b8\ud55c Kubernetes Cluster\ub97c \uad6c\ucd95 \uac00\ub2a5<\/li>\n<\/ul>\n\n<h5 id=\"amazon-eks-distro\">Amazon EKS Distro<\/h5>\n<ul>\n  <li>Amazon Elastic Kubernetes Service (EKS)\ub97c \uae30\ubc18\uc73c\ub85c \ud55c Kubernetes \ubc30\ud3ec\ud310\uc774\uba70, EKS\uc5d0 \uc2e0\ub8b0\uc131\uacfc \uc548\uc804\uc131\uc774 \ub192\uc740 Kubernetes \ud074\ub7ec\uc2a4\ud130\ub97c \ub9cc\ub4dc\ub294 \ub370 \uc0ac\uc6a9<\/li>\n<\/ul>\n\n<h5 id=\"amazon-eks-console\uc5d0-kubernetes-\uc790\uc6d0-\uad00\ub9ac-\uae30\ub2a5\uc744-\ucd94\uac00\ub418\uc5b4-\ud074\ub7ec\uc2a4\ud130-\uad00\ub9ac\uac00-\ub2e8\uc21c\ud654\ub428\">Amazon EKS Console\uc5d0 Kubernetes \uc790\uc6d0 \uad00\ub9ac \uae30\ub2a5\uc744 \ucd94\uac00\ub418\uc5b4, \ud074\ub7ec\uc2a4\ud130 \uad00\ub9ac\uac00 \ub2e8\uc21c\ud654\ub428<\/h5>\n<ul>\n  <li>AWS \uad00\ub9ac \ucf58\uc194\uc744 \uc0ac\uc6a9\ud558\uc5ec Amazon EKS \ud074\ub7ec\uc2a4\ud130\uc5d0\uc11c \uc2e4\ud589\ub418\ub294 Kubernetes API \ub9ac\uc18c\uc2a4\uc640 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ud655\uc778 \uac00\ub2a5<\/li>\n  <li>\uc9c0\uae08\uae4c\uc9c0 Kubernetes\uc758 \ub9ac\uc18c\uc2a4\uc640 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ud45c\uc2dc \ubc0f \ubb38\uc81c \ud574\uacb0\uc744 \uc704\ud574 \ub2e4\ub978 \ub3c4\uad6c\ub97c \ucd94\uac00\ub85c \uc124\uce58\ud558\uace0 \uc2e4\ud589\ud574\uc57c\ud588\uc9c0\ub9cc, \uc774\ubc88 \uc5c5\ub370\uc774\ud2b8\uc5d0\uc11c\ub294 \ud074\ub7ec\uc2a4\ud130 \uad6c\uc131, \uc0c1\ud0dc \ub4f1\uc744 \uc9c0\uc6d0\ud558\ub294 \ud074\ub77c\uc6b0\ub4dc \uc778\ud504\ub77c\uc5d0 \ub300\ud55c \uc77c\uad00\ub41c \ubdf0\uac00  \ud655\uc778 \uac00\ub2a5<\/li>\n<\/ul>\n\n<h5 id=\"amazon-eks-aws-fargate\uc5d0-\ub0b4\uc7a5-\ub41c-\ub85c\uae45-\uae30\ub2a5\uc744-\uc9c0\uc6d0\">Amazon EKS, AWS Fargate\uc5d0 \ub0b4\uc7a5 \ub41c \ub85c\uae45 \uae30\ub2a5\uc744 \uc9c0\uc6d0<\/h5>\n<ul>\n  <li>AWS Fargate\uc5d0\uc11c \uc2e4\ud589\uc911\uc778 Pod\uc5d0\uc11c Amazon Cloudwatch, Amazon Elasticsearch, Amazon Kinesis Data Firehose, Amazon Kinesis Streams \ub4f1\uc758 \ub85c\uadf8 \uc800\uc7a5 \ubc0f \ubd84\uc11d \uc6a9 AWS \uc11c\ube44\uc2a4\uc5d0 \ucee8\ud14c\uc774\ub108 \ub85c\uadf8\ub97c \uc804\uc1a1 \uac00\ub2a5<\/li>\n<\/ul>\n\n<h5 id=\"amazon-eks-\uad00\ub9ac-\ub178\ub4dc-\uadf8\ub8f9\uc758-ec2-\uc2a4\ud31f-\uc778\uc2a4\ud134\uc2a4\uc5d0-\ub300\ud55c-\uc9c0\uc6d0\uc744-\ucd94\uac00\">Amazon EKS, \uad00\ub9ac \ub178\ub4dc \uadf8\ub8f9\uc758 EC2 \uc2a4\ud31f \uc778\uc2a4\ud134\uc2a4\uc5d0 \ub300\ud55c \uc9c0\uc6d0\uc744 \ucd94\uac00<\/h5>\n<ul>\n  <li>\uad00\ub9ac \ub178\ub4dc \uadf8\ub8f9\uc744 \ub9cc\ub4e4 \ub54c \uc6a9\ub7c9 \uc720\ud615\uc744 SPOT\uc73c\ub85c \ud558\uace0, \ub9ac\uc18c\uc2a4 \uc694\uc744 \ucda9\uc871\ud558\ub294 \uc5ec\ub7ec EC2 \uc778\uc2a4\ud134\uc2a4 \uc720\ud615\uc744 \uc124\uc815\ud558\uae30\ub9cc \ud558\uba74 \ub428<\/li>\n  <li>\uad00\ub9ac \ub178\ub4dc \uadf8\ub8f9\uc740 \ucd5c\uc2e0 Spot \ubaa8\ubc94 \uc0ac\ub840\uc5d0 \ub530\ub77c Spot \ub178\ub4dc\ub97c \ud504\ub85c\ube44\uc800\ub2dd\ud558\uace0 \uad00\ub9ac<\/li>\n<\/ul>\n\n<h5 id=\"amazon-eks-kubernetes-\ud074\ub7ec\uc2a4\ud130-\uae30\ub2a5-\uc124\uce58-\ubc0f-\uad00\ub9ac\uc758-\ub2e8\uc21c\ud654\">Amazon EKS, Kubernetes \ud074\ub7ec\uc2a4\ud130 \uae30\ub2a5 \uc124\uce58 \ubc0f \uad00\ub9ac\uc758 \ub2e8\uc21c\ud654<\/h5>\n<ul>\n  <li>EKS \ucf58\uc194, CLI API\ub97c \ud1b5\ud574 Kubernetes \uc6b4\uc6a9 \uc18c\ud504\ud2b8\uc6e8\uc5b4 (\ucd94\uac00 \uae30\ub2a5)\uc744 \uc124\uce58\ud558\uace0 \uad00\ub9ac \uac00\ub2a5<\/li>\n  <li>Amazon VPC CNI \ub124\ud2b8\uc6cc\ud0b9 \ud50c\ub7ec\uadf8\uc778 \uad00\ub9ac\ub97c \uc9c0\uc6d0 \uc2dc\uc791<\/li>\n  <li>EKS \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc73c\ub85c \ud074\ub7ec\uc2a4\ud130 \uc0dd\uc131\ubd80\ud130 \uc751\uc6a9 \ud504\ub85c\uadf8\ub7a8\uc758 \uc2e4\ud589\uae4c\uc9c0\ub97c \ud55c\ubc88\uc758 \uba85\ub839\uc73c\ub85c \ud560 \uc218 \uc788\uc73c\uba70, AWS \ucf58\uc194, CLI API\ub97c \uc0ac\uc6a9\ud558\uc5ec \ud074\ub7ec\uc2a4\ud130\ub97c \ucd5c\uc2e0 \uc0c1\ud0dc\ub85c \uc720\uc9c0\ud558\ub294 \uac83\uc774 \uac00\ub2a5<\/li>\n<\/ul>\n","pubDate":"Fri, 04 Dec 2020 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/aws\/reinvent\/aws-re-invent-2020\/","guid":"https:\/\/hidekuma.github.io\/aws\/reinvent\/aws-re-invent-2020\/","category":["reinvent","aws","ecs","eks","ec2","lambda","s3","aurora","aws","reinvent"]},{"title":"Python: \ud30c\uc774\uc36c\uc73c\ub85c S3 \ub370\uc774\ud130 \ube0c\ub77c\uc6b0\uc9d5\ud558\uae30","description":"<h1 id=\"\uc624\ud508\uc18c\uc2a4-flask-s3-viewer\">\uc624\ud508\uc18c\uc2a4, Flask S3 Viewer<\/h1>\n<ul>\n  <li><a href=\"https:\/\/youtube.com\/embed\/MPFo1scGlws?start=0\">link<\/a><\/li>\n<\/ul>\n\n<h2 id=\"\uc124\uce58\">\uc124\uce58<\/h2>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>pip <span class=\"nb\">install <\/span>flask flask_s3_viewer\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\uc138\ud305\">\uc138\ud305<\/h2>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kn\">from<\/span> <span class=\"nn\">flask<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">Flask<\/span>\n\n<span class=\"kn\">from<\/span> <span class=\"nn\">flask_s3_viewer<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">FlaskS3Viewer<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">flask_s3_viewer.aws.ref<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">Region<\/span>\n\n<span class=\"c1\"># Init Flask\n<\/span><span class=\"n\">app<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Flask<\/span><span class=\"p\">(<\/span><span class=\"n\">__name__<\/span><span class=\"p\">)<\/span>\n\n<span class=\"c1\"># Init Flask S3Viewer\n<\/span><span class=\"n\">s3viewer<\/span> <span class=\"o\">=<\/span> <span class=\"n\">FlaskS3Viewer<\/span><span class=\"p\">(<\/span>\n    <span class=\"c1\"># Flask App\n<\/span>    <span class=\"n\">app<\/span><span class=\"p\">,<\/span>\n    <span class=\"n\">template_namespace<\/span><span class=\"o\">=<\/span><span class=\"s\">'mdl'<\/span><span class=\"p\">,<\/span>\n    <span class=\"c1\"># Namespace must be unique\n<\/span>    <span class=\"n\">namespace<\/span><span class=\"o\">=<\/span><span class=\"s\">'flask-s3-viewer'<\/span><span class=\"p\">,<\/span>\n    <span class=\"c1\"># Hostname, e.g. Cloudfront endpoint\n<\/span>    <span class=\"n\">object_hostname<\/span><span class=\"o\">=<\/span><span class=\"s\">'http:\/\/flask-s3-viewer.com'<\/span><span class=\"p\">,<\/span>\n    <span class=\"c1\"># Put your AWS's profile name and Bucket name\n<\/span>    <span class=\"n\">config<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span>\n        <span class=\"s\">'profile_name'<\/span><span class=\"p\">:<\/span> <span class=\"s\">'PROFILE_NAME'<\/span><span class=\"p\">,<\/span>\n        <span class=\"s\">'bucket_name'<\/span><span class=\"p\">:<\/span> <span class=\"s\">'S3_BUCKET_NAME'<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">)<\/span>\n\n<span class=\"c1\"># Register Flask S3Viewer's router\n<\/span><span class=\"n\">s3viewer<\/span><span class=\"p\">.<\/span><span class=\"n\">register<\/span><span class=\"p\">()<\/span>\n\n<span class=\"k\">if<\/span> <span class=\"n\">__name__<\/span> <span class=\"o\">==<\/span> <span class=\"s\">'__main__'<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"n\">run<\/span><span class=\"p\">(<\/span><span class=\"n\">debug<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">,<\/span> <span class=\"n\">port<\/span><span class=\"o\">=<\/span><span class=\"mi\">3000<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre><\/div><\/div>\n<h2 id=\"\ud50c\ub77c\uc2a4\ud06c-\uc2e4\ud589\">\ud50c\ub77c\uc2a4\ud06c \uc2e4\ud589<\/h2>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>python app.py\n<\/code><\/pre><\/div><\/div>\n<p>http:\/\/localhost:3000\/flask-s3-viewer\/files \uc73c\ub85c \ubc29\ubb38\ud558\uba74, \uc6d0\ud558\ub294 \ud654\uba74\uc744 \ubcfc \uc218 \uc788\ub2e4.\n\ub9cc\uc57d, namespace\uac00 \ubcc0\uacbd\ub41c\ub2e4\uba74 \uc811\uc18d url\ub3c4 \ubcc0\uacbd\ub41c\ub2e4 (http:\/\/localhost:3000\/{namespace}\/files)<\/p>\n\n<p>\uc790\uc138\ud55c \ub0b4\uc6a9\uc740 <a href=\"https:\/\/flask-s3-viewer.readthedocs.io\/en\/latest\/index.html\">docs<\/a>\ub97c \ucc38\uace0\ud558\uba74 \ube60\ub974\uac8c \uc801\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n","pubDate":"Sun, 01 Mar 2020 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/python\/aws\/flask-s3-viewer\/","guid":"https:\/\/hidekuma.github.io\/python\/aws\/flask-s3-viewer\/","category":["flask-s3-viewer","python","aws"]},{"title":"Pyenv: pyenv \uc778\uc2a4\ud1a8\uc774 \uc2e4\ud328\ud560 \uacbd\uc6b0 (No module named 'pyexpat')","description":"<h1 id=\"pyexpat\uc774-\uc6d0\uc778\uc73c\ub85c-pyenv-install-\uc774-\uc2e4\ud328\ud560-\uacbd\uc6b0\">pyexpat\uc774 \uc6d0\uc778\uc73c\ub85c pyenv install \uc774 \uc2e4\ud328\ud560 \uacbd\uc6b0<\/h1>\n<p><code class=\"language-plaintext highlighter-rouge\">xcode<\/code>\uac00 \uc5c5\ub370\uc774\ud2b8\ub9cc \ud558\uba74 \ud56d\uc0c1 \uc774\ub7f0\ubb38\uc81c\uac00 \uc0dd\uae30\ub294 \uac83\uac19\ub2e4.<\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c\"># \uc798\ubabb\ub41c \ubc84\uc804\uc774 \uc704\uce58\ub41c CLI \ud234\uc744 \uc0ad\uc81c\ud55c\ub2e4.<\/span>\n<span class=\"nv\">$ <\/span><span class=\"nb\">sudo rm<\/span> <span class=\"nt\">-rf<\/span> \/Library\/Developer\/CommandLineTools\n<span class=\"c\"># \ub2e4\uc2dc \uc124\uce58\ud55c\ub2e4.<\/span>\n<span class=\"nv\">$ <\/span>xcode-select <span class=\"nt\">--install<\/span>\n<span class=\"c\"># \uc124\uce58 \ud655\uc778<\/span>\n<span class=\"nv\">$ <\/span>pkgutil <span class=\"nt\">--pkg-info<\/span><span class=\"o\">=<\/span>com.apple.pkg.CLTools_Executables\npackage-id: com.apple.pkg.CLTools_Executables\nversion: 10.3.0.0.1.1562985497\nvolume: \/\nlocation: \/\ninstall-time: 1570155487\n<span class=\"nb\">groups<\/span>: com.apple.FindSystemFiles.pkg-group\n<\/code><\/pre><\/div><\/div>\n\n<p>\uc5ec\ub7ec\uac00\uc9c0 \ubc29\ubc95\uc744 \uc2dc\ub3c4\ud574\ubd24\uc9c0\ub9cc, \uc7ac\uc124\uce58\uc774\uc678\uc5d0\ub294 \ud574\uacb0\ubc95\uc774 \uc5c6\uc5c8\ub2e4.<\/p>\n","pubDate":"Wed, 15 Jan 2020 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/python\/pyenv\/pyenv-pyexpat-error\/","guid":"https:\/\/hidekuma.github.io\/python\/pyenv\/pyenv-pyexpat-error\/","category":["pyexpat","python","pyenv"]},{"title":"AWS: cloudfront \uc14b\ud305 \ud6d1\uc5b4\ubcf4\uae30","description":"<h1 id=\"amazon-cloudfront\">Amazon CloudFront<\/h1>\n<p>\uae00\ub85c\ubc8c \uac01 \ub9ac\uc804\uc5d0 \uce90\uc2dc\uc11c\ubc84\uac00 \uc874\uc7ac\ud574, \ube60\ub974\uace0 \uace0\ub3c4\ub85c \uc548\uc804\ud558\uba70 \ud504\ub85c\uadf8\ub798\ubc0d \uac00\ub2a5\ud55c CDN(\ucf58\ud150\uce20 \uc804\uc1a1 \ub124\ud2b8\uc6cc\ud06c) \uc11c\ube44\uc2a4<\/p>\n\n<hr \/>\n\n<h2 id=\"create-distribution\">Create Distribution<\/h2>\n<h3 id=\"origin-settings\">Origin Settings<\/h3>\n<ul>\n  <li>\n    <dl>\n      <dt><strong>Origin Domain Name<\/strong><\/dt>\n      <dd>CloudFront\uac00 \uc2e4\uc81c\ub85c \ubc14\ub77c\ubcf4\uac8c \ub420, Origin(\uc11c\ubc84 \ud639\uc740 \uc11c\ube44\uc2a4) \uac12, e.g. <code class=\"language-plaintext highlighter-rouge\">{bucket}.s3.amazonaws.com<\/code><\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Origin Path<\/strong><\/dt>\n      <dd>\ud574\ub2f9 path\ub97c \ucd94\uac00\ud574\uc8fc\uba74, CloudFront\uac00 \ubc14\ub77c\ubcf4\ub294 Origin\uc758 \ud574\ub2f9 path\uac00 \uae30\uc900\uc774 \ub41c\ub2e4(\ud574\ub2f9 \uacbd\ub85c\ub97c \ub8e8\ud2b8\ub85c \ubcf4\uace0 \uc801\uc6a9\ub41c\ub2e4), e.g. <code class=\"language-plaintext highlighter-rouge\">{bucket}.s3.amazonaws.com\/{origin_path}<\/code><\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Origin ID<\/strong><\/dt>\n      <dd>\uc790\ub3d9\uc73c\ub85c \uc0dd\uc131\ub418\uba70, \ud574\ub2f9 CF\ub97c \uad6c\ubd84\uc9d3\ub294 \uace0\uc720 ID\uc774\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Origin Custom Headers<\/strong><\/dt>\n      <dd>\ub9d0\uadf8\ub300\ub85c \ucee4\uc2a4\ud140\ud55c \ud5e4\ub354\uac00 \ucd94\uac00\uac00\ub2a5\ud558\ub2e4.\n<!--more--><\/dd>\n    <\/dl>\n  <\/li>\n<\/ul>\n\n<hr \/>\n<h2 id=\"default-cache-behavior-settings\">Default Cache Behavior Settings<\/h2>\n<h3 id=\"path-pattern\">Path Pattern<\/h3>\n<ul>\n  <li>\n    <dl>\n      <dt><strong>Viewer Protocol Policy<\/strong><\/dt>\n      <dd>\uc77c\ubc18\uc801\uc73c\ub85c HTTP\uc640 HTTPS\ub97c \ubaa8\ub450 \ud5c8\uc6a9\ud574\uc900\ub2e4.<\/dd>\n    <\/dl>\n    <ul>\n      <li>HTTP and HTTPS<\/li>\n      <li>Redirect HTTP to HTTPS<\/li>\n      <li>HTTPS Only<\/li>\n    <\/ul>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Allowed HTTP Methods<\/strong><\/dt>\n      <dd>\ud5c8\uc6a9\ud560 HTTP Method\ub97c \uc120\ud0dd\ud560 \uc218 \uc788\ub2e4.<\/dd>\n    <\/dl>\n    <ul>\n      <li>GET, HEAD<\/li>\n      <li>GET, HEAD, OPTIONS<\/li>\n      <li>GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE<\/li>\n    <\/ul>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Field-level Encryption Config<\/strong><\/dt>\n      <dd>\ud544\ub4dc \ub808\ubca8\uc758 \uc554\ud638\ud654 \uad6c\uc131\uc774 \uac00\ub2a5\ud558\ub2e4.(\uc544\uc9c1 \uc0ac\uc6a9\ud574\ubcf4\uc9c0 \ubabb\ud588\ub2e4)<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Cached HTTP Methods<\/strong><\/dt>\n      <dd>\uce90\uc2dc \ub418\ub294 HTTP \uba54\uc18c\ub4dc<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Cache Based on Selected Request Headers<\/strong><\/dt>\n      <dd>\ud504\ub77c\uc774\ube57\ud55c \uce90\uc2dc\ub97c \uad6c\uc131\ud560 \ub54c \uc0ac\uc6a9\ud55c\ub2e4, e.g. <code class=\"language-plaintext highlighter-rouge\">header\uc758 user_id\uac12\uc744 \uae30\uc900\uc73c\ub85c \uce90\uc2f1\uc744 \ubd84\ub9ac<\/code><\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Object Caching<\/strong><\/dt>\n      <dd>origin\uc758 \uac1d\uccb4 \ud639\uc740 \ud30c\uc77c\uc5d0\uc11c, \uce90\uc2dc\ub97c \uc81c\uc5b4\ud560 \uacbd\uc6b0 (cache-control: max-age) \uc0ac\uc6a9\ud558\uba70, CloudFront\uc5d0\uc11c \uc911\uc559\uad00\ub9ac\ub97c \uc704\ud574\uc120 \uc77c\ubc18\uc801\uc73c\ub85c Customize\ub97c \uc0ac\uc6a9\ud55c\ub2e4.<\/dd>\n    <\/dl>\n    <ul>\n      <li>Use Origin Cache Headers<\/li>\n      <li>Customize<\/li>\n    <\/ul>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Minimum TTL<\/strong><\/dt>\n      <dd>\ucd5c\uc18c TTL<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Maximum TTL<\/strong><\/dt>\n      <dd>\ucd5c\ub300 TTL<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Default TTL<\/strong><\/dt>\n      <dd>\uae30\ubcf8 TTL (<a href=\"https:\/\/docs.aws.amazon.com\/ko_kr\/AmazonCloudFront\/latest\/DeveloperGuide\/Expiration.html\">\ud574\ub2f9 TTL\uc758 \uc801\uc6a9\uae30\uc900\uc740 origin\uc758 \ud5e4\ub354\uc5d0 cache-control\uc758 \uc720\ubb34\uc5d0 \ub530\ub77c \uc801\uc6a9 \uae30\uc900\uc774 \ub2e4\ub974\ub2e4. (\ucc38\uace0\ub9c1\ud06c)<\/a>)<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Forward Cookies<\/strong><\/dt>\n      <dd>\uc694\uccad URL\uc5d0 \uc0ac\uc6a9\uc790 \ucfe0\ud0a4\ub97c \ud3ec\ud568\ud560 \uac83\uc778\uc9c0\ub97c \uc120\ud0dd\ud55c\ub2e4. (Amazon S3\ub294 \ud574\ub2f9\uc0ac\ud56d \uc5c6\uc74c)<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Query String Forwarding and Caching<\/strong><\/dt>\n      <dd>\ucffc\ub9ac\uc2a4\ud2b8\ub9c1\uc744 \uce90\uc2dc \uad6c\ubd84\uc790\ub85c \uc774\uc6a9\ud560 \uac83\uc778\uc9c0\ub97c \ub73b\ud55c\ub2e4, e.g. <code class=\"language-plaintext highlighter-rouge\">{cloudfront_endpoint}\/index.html?version=1.0<\/code><\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Smooth Streaming<\/strong><\/dt>\n      <dd>\uc628\ub514\uba58\ub4dc \ube44\ub514\uc624 \uc2a4\ud2b8\ub9ac\ubc0d\uc5d0 \uc0ac\uc6a9\ub41c\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Restrict Viewer Access (Use Signed URLs or Signed Cookies)<\/strong><\/dt>\n      <dd>IAM\uc758 CloudFront \ud0a4\ud398\uc5b4\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc11c\uba85\ub41c URL\uc5d0\ub9cc \ucf58\ud150\uce20 \uc5d1\uc138\uc2a4 \uad8c\ud55c\uc744 \uc5f4\uc5b4 \uc904\uac83\uc778\uc9c0\ub97c \ub73b\ud55c\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Compress Objects Automatically<\/strong><\/dt>\n      <dd>\uac1d\uccb4 \uc555\ucd95\uc744 \uc790\ub3d9\uc73c\ub85c \uc9c4\ud589\ud560 \uac83\uc778\uc9c0\ub97c \ub73b\ud558\ub294\ub370, \ud574\ub2f9 \uae30\ub2a5\uc774 \uc801\uc6a9 \ub418\ub824\uba74, \uc694\uccad \ud5e4\ub354\uc5d0 <code class=\"language-plaintext highlighter-rouge\">Accept-Encoding: gzip<\/code>\uac00 \ucd94\uac00\ub418\uc5b4\uc57c\ud55c\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Lambda Function Associations<\/strong><\/dt>\n      <dd>Lambda@Edge\ub97c \uc5ec\uae30\uc5d0 \ubb3c\ub824\uc904 \uc218 \uc788\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n<\/ul>\n\n<hr \/>\n\n<h2 id=\"distribution-settings\">Distribution Settings<\/h2>\n<ul>\n  <li>\n    <dl>\n      <dt><strong>Price Class<\/strong><\/dt>\n      <dd>\uc5b4\ub5a4 \uac00\uaca9 \uc815\ucc45\uc744 \uc774\uc6a9\ud560 \uac83\uc778\uc9c0\ub2e4. \uc120\ud0dd\uc9c0\uc5d0 \ub530\ub77c \uce90\uc2f1\ub418\ub294 \ub9ac\uc804\uc774 \uc0c1\uc774\ud558\ub2e4.<\/dd>\n    <\/dl>\n    <ul>\n      <li>Use Only U.S., Canada and Europe<\/li>\n      <li>Use U.S., Canada, Europe, Asia, Middle East and Africa<\/li>\n      <li>Use All Edge Locations (Best Performance)<\/li>\n    <\/ul>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Supported HTTP Versions<\/strong><\/dt>\n      <dd>\ub9d0\ub300\ub85c \uc11c\ud3ec\ud2b8 \ub420 HTTP \ubc84\uc804\uc774\uba70, \uc77c\ubc18\uc801\uc73c\ub85c HTTP2\uac00 \ube60\ub974\ub2e4.<\/dd>\n    <\/dl>\n    <ul>\n      <li>HTTP\/2, HTTP\/1.1, HTTP\/1.0<\/li>\n      <li>HTTP\/1.1, HTTP\/1.0<\/li>\n    <\/ul>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Default Root Object<\/strong><\/dt>\n      <dd>S3\uc758 \uc815\uc801 \ud638\uc2a4\ud305 \uac1c\ub150\ucc98\ub7fc, <code class=\"language-plaintext highlighter-rouge\">origin_path<\/code>\ub97c \uae30\uc900\uc73c\ub85c \uc5b4\ub5a4 \uc624\ube0c\uc81d\ud2b8\ub97c Default\ub85c \ubcf4\uc5ec \uc904 \uac83\uc778\uc9c0 \ub73b\ud55c\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Logging<\/strong><\/dt>\n      <dd>\ub85c\uadf8\ub97c \uc0ac\uc6a9\uc5ec\ubd80.<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Bucket for Logs<\/strong><\/dt>\n      <dd>\ub85c\uadf8\ub97c \uc801\uc7ac\ud560 \ubc84\ud0b7\uc744 \uc120\ud0dd\ud560 \uc218 \uc788\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Log Prefix<\/strong><\/dt>\n      <dd>\ub85c\uadf8\uc758 \uc811\ub450\uc0ac\ub97c \uc815\ud560 \uc218 \uc788\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt><strong>Cookie Logging<\/strong><\/dt>\n      <dd>\ucfe0\ud0a4\ub3c4 \ub85c\ud0b9\uc5d0 \ud3ec\ud568 \ud560\uac83\uc778\uc9c0.<\/dd>\n    <\/dl>\n  <\/li>\n<\/ul>\n","pubDate":"Thu, 07 Nov 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/aws\/cloudfront\/cloudfront-settings\/","guid":"https:\/\/hidekuma.github.io\/aws\/cloudfront\/cloudfront-settings\/","category":["aws","cloudfront","cf","AWS","CloudFront"]},{"title":"AWS: s3\uc758 \ub370\uc774\ud130 \ubaa8\ub378","description":"<h1 id=\"amazon-s3simple-storage-service\">Amazon S3(Simple Storage Service)<\/h1>\n<p>\uc6a9\ub7c9\uc5d0 \uad00\uacc4 \uc5c6\uc774 \ud30c\uc77c\uc744 \uc801\uc7ac \uac00\ub2a5\ud558\uace0, 99.9%\uc758 \ub0b4\uad6c\uc131\uc744 \ubcf4\uc7a5\ud55c\ub2e4.<\/p>\n<ul>\n  <li>\uc800\uc7a5 \uc6a9\ub7c9\uc774 \ubb34\ud55c\ub300<\/li>\n  <li>\ud30c\uc77c \uc800\uc7a5\uc5d0 \ucd5c\uc801\ud654<\/li>\n  <li>Version Control \uae30\ub2a5 \ub0b4\uc7a5<\/li>\n<\/ul>\n\n<hr \/>\n<h2 id=\"data-model\">Data Model<\/h2>\n<h3 id=\"flat-structure\">Flat structure<\/h3>\n<p>S3 \ub370\uc774\ud130 \ubaa8\ub378\uc740 flat structure\ub77c\uc11c \ubc84\ud0b7\uc5d0 \uacc4\uce35\uc774\ub098, \ud3f4\ub354\uac00 \uc5c6\ub2e4. AWS \ucf58\uc194 UI\uc5d0\uc11c\ub294 \ub514\ub809\ud1a0\ub9ac\uac00 \uc874\uc7ac\ud558\ub294 \uac83 \ucc98\ub7fc \ubcf4\uc774\ub098 \uc2e4\uc81c\ub860 \uc77c\ubc18\uc801\uc778 \ud30c\uc77c\uc2dc\uc2a4\ud15c\uacfc \ub2e4\ub974\ub2e4.<\/p>\n\n<!--more-->\n\n<p>\uc608\ub97c \ub4e4\uc5b4, \uc77c\ubc18\uc801\uc778 \ud30c\uc77c\uc2dc\uc2a4\ud15c\uc5d0\uc11c\ub294 \uc0c1\uc704 \uacc4\uce35\uc744 \uc0dd\uc131\uce58 \uc54a\uc73c\uba74, \ud574\ub2f9 \uacc4\uce35\uc5d0 \ud30c\uc77c\uc744 \uc4f8 \uc218\uac00 \uc5c6\ub2e4.<\/p>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nb\">echo<\/span> <span class=\"s1\">'test'<\/span> <span class=\"o\">&gt;<\/span> depth1\/test.txt\n<span class=\"nt\">-bash<\/span>: depth1\/test.txt: No such file or directory\n<\/code><\/pre><\/div><\/div>\n<p>\ud558\uc9c0\ub9cc, S3\uc5d0\uc11c\ub294 \ubc84\ud0b7\ub0b4\uc5d0 depth1\uc774 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc544\ub3c4, \ub2e4\uc74c\uacfc \uac19\uc774 \uac00\ub2a5\ud558\ub2e4.<\/p>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>awscli s3api put-object <span class=\"nt\">--bucket<\/span> <span class=\"o\">{<\/span>bucket_name<span class=\"o\">}<\/span> <span class=\"nt\">--key<\/span> depth1\/test.txt <span class=\"nt\">--body<\/span> test.txt\n<span class=\"o\">{<\/span>\n    ETag: <span class=\"s1\">'1q2w3e4r'<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h4 id=\"\ubb38\uc81c\ub294-\uc5c6\uc744\uae4c\">\ubb38\uc81c\ub294 \uc5c6\uc744\uae4c?<\/h4>\n<p>S3\ub294 \ud30c\uc77c\uc744 \ubb34\uc81c\ud55c\uc73c\ub85c \uc801\uc7ac\ud560 \uc218 \uc788\ub294 \uc7a5\uc810\uc774 \uc788\ub294 \ub9cc\ud07c side effect\uac00 \uc874\uc7ac\ud558\ub294\ub370, \n\ubc14\ub85c S3 list-objects API\uc5d0\ub294 \ucd5c\ub300 1000\uac1c\uc758 max-item \uc81c\ud55c\uc774 \uc788\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n\n<p>\uc608\ub97c \ub4e4\uc5b4, \uc6b0\ub9ac\uac00 \ub370\uc774\ud130\ub97c \ub8e8\ud2b8 \uacbd\ub85c(<code class=\"language-plaintext highlighter-rouge\">\/<\/code>)\uc5d0 \uc57d 50\ub9cc\uac1c\uc758 \ud30c\uc77c\uc744 \uc801\uc7ac \ud588\ub2e4\uace0 \ud588\uc744 \ub54c, API\uc758 \ub9ac\ud134\uac12\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"o\">{<\/span>\n    <span class=\"s1\">'Contents'<\/span>: <span class=\"o\">[<\/span>\n        <span class=\"o\">{<\/span>\n            <span class=\"s2\">\"Key\"<\/span>: <span class=\"s2\">\"test1.txt\"<\/span>\n            ...\n        <span class=\"o\">}<\/span>,\n        <span class=\"o\">{<\/span>\n            <span class=\"s2\">\"Key\"<\/span>: <span class=\"s2\">\"test2.txt\"<\/span>\n            ...\n        <span class=\"o\">}<\/span>,\n\n        ...\n\n        <span class=\"o\">{<\/span>\n            <span class=\"s2\">\"Key\"<\/span>: <span class=\"s2\">\"test1000.txt\"<\/span>\n            ...\n        <span class=\"o\">}<\/span>,\n    <span class=\"o\">]<\/span>,\n    <span class=\"s2\">\"NextToken\"<\/span>: <span class=\"s2\">\"1q2w3e4r\"<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>1000\uac1c\uc758 \uc624\ube0c\uc81d\ud2b8\ub9cc \uc870\ud68c\uac00 \uac00\ub2a5\ud558\uace0, <code class=\"language-plaintext highlighter-rouge\">NextToken<\/code>\uae30\ubc18\uc73c\ub85c \uc7ac\uc870\ud68c\ub97c \ud574\uc57c\ud55c\ub2e4. \uadf8\ub9ac\uace0 \uc774 \uc791\uc5c5\uc744 500\ubc88 \ubc18\ubcf5\ud574\uc57c\ud55c\ub2e4.<\/p>\n\n<h4 id=\"\uc88b\uc740-\ub124\uc774\ubc0d-\uc804\ub7b5\uc740-\uace7-\uc88b\uc740-\ud37c\ud3ec\uba3c\uc2a4\ub85c-\uc774\uc5b4\uc9c4\ub2e4\">\uc88b\uc740 \ub124\uc774\ubc0d \uc804\ub7b5\uc740 \uace7 \uc88b\uc740 \ud37c\ud3ec\uba3c\uc2a4\ub85c \uc774\uc5b4\uc9c4\ub2e4.<\/h4>\n<p>\ub530\ub77c\uc11c \ud30c\uc77c\uc758 \ud0a4\ub97c \uc138\ubd84\ud654\ud558\uc5ec \uc801\uc7ac\ub97c \ud558\ub294 \uac83\uc774 \ubc14\ub78c\uc9c1\ud558\uba70, \ud558\ub098\uc758 \ud0a4\uc5d0 1000\uac1c\ub97c \ucd08\uacfc\ud558\ub294 \ud0a4\uac00 \uc801\uc7ac\ub418\uc9c0 \uc54a\ub3c4\ub85d \uc544\ud0a4\ud14d\ucc98\ub9c1\uc744 \uc9c4\ud589\ud560 \ud544\uc694\uac00 \uc788\ub2e4.<\/p>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>\/2019\/12\/13\/16h\/test.txt\n\/category\/cafegory_number\/product\/big\/main\/test.img\n<\/code><\/pre><\/div><\/div>\n<p>\ub2e4\uc74c\uacfc \uac19\uc774 \uc801\uc7ac\ud558\ub294 \uac83 \ub9cc\uc73c\ub85c\ub3c4, <code class=\"language-plaintext highlighter-rouge\">--prefix<\/code>\uae30\ub2a5\uc744 \uc774\uc6a9\ud574 \ud2b9\uc815 \ud0a4\ub85c \uc2dc\uc791\ud558\ub294 \uc624\ube0c\uc81d\ud2b8\ub97c \uc120\ubcc4\ud574\ub0bc \uc218 \uc788\ub2e4.<\/p>\n\n<p>\uad6c\ud604\ud560 \uc11c\ube44\uc2a4\uc758 \uc544\ud0a4\ud14d\ucc98\uc5d0 \ub9de\ub294 S3 \ub124\uc774\ubc0d\uc744 \uacb0\uc815\ud558\uc790.<\/p>\n","pubDate":"Thu, 31 Oct 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/aws\/s3\/s3-data-model\/","guid":"https:\/\/hidekuma.github.io\/aws\/s3\/s3-data-model\/","category":["aws","s3","AWS","S3"]},{"title":"Vim: WSL\uc5d0\uc11c \ud074\ub9bd\ubcf4\ub4dc\uc5d0 \ubcf5\uc0ac\ud558\ub294 \ubc29\ubc95","description":"<h1 id=\"vim-on-wsl-synchronize-system-clipboard\">Vim on WSL: synchronize system clipboard<\/h1>\n<p>WSL \uc790\uccb4\uc5d0\uc11c <kbd>shift<\/kbd> + <kbd>c<\/kbd> \uc640 <kbd>shift<\/kbd> + <kbd>v<\/kbd>\ub85c \ubcf5\uc0ac\/\ubd99\uc5ec\ub123\uae30 \ud074\ub9bd\ubcf4\ub4dc \uae30\ub2a5\uc744 \uc9c0\uc6d0\ud558\ub098, \ube48 \ubb38\uc790\uc5f4 \uae4c\uc9c0 \uac19\uc774 \ubcf5\uc0ac\ub41c\ub2e4.<\/p>\n\n<p>\ub610\ud55c, <code class=\"language-plaintext highlighter-rouge\">tmux<\/code>\ub85c \ub098\ub258\uc5b4\uc9c4 <code class=\"language-plaintext highlighter-rouge\">pane<\/code>\uae4c\uc9c0 \uce68\ubc94\ud558\uc5ec \ubcf5\uc0ac\uac00 \ub418\uace4 \ud558\uc5ec \ub108\ubb34 \ubd88\ud3b8\ud558\uc600\ub2e4.\n<code class=\"language-plaintext highlighter-rouge\">vim<\/code>\uc758 <code class=\"language-plaintext highlighter-rouge\">yank<\/code>\uae30\ub2a5\uc744 \ud074\ub9bd\ubcf4\ub4dc\uc5d0 \uc804\ub2ec\ud558\uae30 \uc704\ud574, \uc544\ub798\uc758 \ucf54\ub4dc\ub97c <code class=\"language-plaintext highlighter-rouge\">.vimrc<\/code>\uc5d0 \ub123\uc5b4\uc8fc\uba74 \uc27d\uac8c \ud574\uacb0 \uac00\ub2a5\ud558\ub2e4.\n<!--more--><\/p>\n\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nb\">let <\/span>s:clip <span class=\"o\">=<\/span> <span class=\"s1\">'\/mnt\/c\/Windows\/System32\/clip.exe'<\/span> \n<span class=\"k\">if <\/span>executable<span class=\"o\">(<\/span>s:clip<span class=\"o\">)<\/span>\n    augroup WSLYank\n        autocmd!\n        autocmd TextYankPost <span class=\"k\">*<\/span> call system<span class=\"o\">(<\/span><span class=\"s1\">'echo '<\/span>.shellescape<span class=\"o\">(<\/span><span class=\"nb\">join<\/span><span class=\"o\">(<\/span>v:event.regcontents, <span class=\"s2\">\"<\/span><span class=\"se\">\\&lt;<\/span><span class=\"s2\">CR&gt;\"<\/span><span class=\"o\">))<\/span>.<span class=\"s1\">' | '<\/span>.s:clip<span class=\"o\">)<\/span>\n    augroup END\nend\n<\/code><\/pre><\/div><\/div>\n","pubDate":"Thu, 17 Oct 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/vim\/wsl\/synchronize-system-clipboard-vim-on-WSL\/","guid":"https:\/\/hidekuma.github.io\/vim\/wsl\/synchronize-system-clipboard-vim-on-WSL\/","category":["wsl","synchronize","clipboard","vim","Vim","WSL"]},{"title":"Github: \uc740\uadfc\ud788 \ub9ce\uc774 \uc4f0\ub294 \uae43\ud5d9\uc57d\uc5b4","description":"<h1 id=\"\uc57d\uc5b4\ubaa8\uc74c\">\uc57d\uc5b4\ubaa8\uc74c<\/h1>\n<h3 id=\"afaik---as-far-as-i-know\">AFAIK - \u201cAs Far As I Know\u201d<\/h3>\n<p>\ub0b4\uac00 \uc544\ub294 \ud55c.<\/p>\n\n<h3 id=\"fyi---for-your-information\">FYI - \u201cFor Your Information\u201d<\/h3>\n<p>\ucc38\uace0\ub85c \ub77c\ub294 \ub73b. \uc6f9\uc0c1\uc5d0\uc11c \ub9c8\uc74c\uc5d0 \ub4dc\ub294 \uae30\uc0ac \ub098 \ub274\uc2a4\uac00 \ubcf4\uc77c\ub54c , FYI\ub77c\ub294 \ub9d0\uacfc \ud568\uaed8 \ub9c1\ud06c URL\uc744 \ubcf4\ub0bc \ub54c \ub4f1\uc5d0 \uc790\uc8fc \uc0ac\uc6a9\ub41c\ub2e4.<\/p>\n\n<h3 id=\"gotcha---ive-got-you\">GOTCHA - \u201cI\u2019ve Got You\u201d<\/h3>\n<p>i got it, Got it \uacfc \uac19\uc740 \ub73b\uc73c\ub85c \uc0ac\uc6a9\ub418\uba70, \ud574\ub0c8\ub2e4! \ud639\uc740 \uc54c\uc558\ub2e4\ub85c \ud574\uc11d.<\/p>\n\n<h3 id=\"imo-imho---in-my-humble-opinion\">IMO (IMHO) - \u201cIn My (Humble) Opinion\u201d<\/h3>\n<p>\uac1c\uc778\uc801\uc778 \uc758\uacac \uc785\ub2c8\ub2e4\ub9cc, \ub0b4 \uc18c\uacac\uc774\uc9c0\ub9cc. (humble \uc774 \ub4e4\uc5b4\uac00\uba74 \uc870\uae08 \uacb8\uc190\ud55c \ub290\ub08c)<\/p>\n\n<h3 id=\"lgtm---looks-good-to-me\">LGTM - \u201cLooks Good To Me\u201d<\/h3>\n<p>okay, \uac1c\ubc1c \ud55c \uc2dc\uc2a4\ud15c\uacfc \ucf54\ub4dc \ub9ac\ubdf0\ub97c \ubd80\ud0c1\ud558\uac70\ub098, \uc790\ub8cc\uc758 \uc694\uc57d\uc744 \ud655\uc778 \uac14\uc744 \ub54c \ud2b9\ubcc4\ud55c \ubb38\uc81c\uac00\uc5c6\ub294 \uacbd\uc6b0\uc5d0 \uc0ac\uc6a9\ud568.\n<!--more--><\/p>\n\n<h3 id=\"ssia---subject-says-it-all\">SSIA - \u201cSubject Says It All\u201d<\/h3>\n<p>\ud0c0\uc774\ud2c0\uc774 \uc804\ubd80 \ub9d0\ud574\uc8fc\uace0 \uc788\ub2e4. \ud0c0\uc774\ud2c0\ub9cc \ubd10\ub3c4 \uc774\ud574\ud560 \uc218 \uc788\ub2e4\ub780 \ub73b. \uc774\uba54\uc77c \ub4f1\uc5d0\uc11c \u201cSubject and Screenshot Says It All(SSSIA)\u201d\ub85c\ub3c4 \uc4f0\uc784.<\/p>\n\n<h3 id=\"tbd---to-be-determined\">TBD - \u201cTo Be Determined\u201d<\/h3>\n<p>\uacb0\uc815\ub418\uc9c0 \uc54a\uc740 \ubd80\ubd84\uc5d0 \u201c\ub098\uc911\uc5d0 \uacb0\uc815\ud560 \uac83\u201d\uc774\ub77c\uace0 \ub9d0\ud588\ub2e4 \ub258\uc559\uc2a4.<\/p>\n\n<h3 id=\"tgif---thank-god-its-friday\">TGIF - \u201cThank God, It\u2019s Friday\u201d<\/h3>\n<p>\ubd88\uae08!<\/p>\n\n<h3 id=\"tia---thanks-in-advance\">TIA - \u201cThanks In Advance\u201d<\/h3>\n<p>\ud55c\uad6d\ub9d0\ub85c \ud574\uc11d\ud558\uae30 \uc5b4\ub824\uc6c0. \ud798\ub4e4\uaca0\uc9c0\ub9cc, \uc798\ubd80\ud0c1\ud574 \ub780 \ub73b\uc73c\ub85c \uc0c1\ub300\ubc29 \ub3d9\uc758\uc5c6\uc774 \u201c\ud574\uc904\uaebc\uc9c0?\u201d\ub780 \uc758\ubbf8\uac00 \uc870\uae08 \ud3ec\ud568\ub418\uc5b4\uc788\uc74c. \ub530\ub77c\uc11c \uc0c1\ub300\uc640 \uc0c1\ud669\uc5d0 \ub530\ub77c \uc2e4\ub840\uac00 \ub420 \uc218 \uc788\uc73c\ub2c8 \uc798\uc0ac\uc6a9\ud560\uac83.<\/p>\n\n<h3 id=\"tldr---too-long-didnt-read\">TL;DR. - \u201cToo Long. Didn\u2019t Read\u201d<\/h3>\n<p>\uc7a5\ubb38\uc758 \uc2dc\uc791 \ubd80\ubd84\uc5d0 \u201c\uc7a5\ubb38\uc774\ubbc0\ub85c \uc694\uc57d \uc62c\ub9bd\ub2c8\ub2e4\u201d\ub77c\ub294 \ub290\ub08c\uc73c\ub85c \uc0ac\uc6a9.<\/p>\n\n<h3 id=\"wfm---works-for-me\">WFM - \u201cWorks For Me\u201d<\/h3>\n<p>\ub098\uc5d0\uac8c \uc88b\ub2e4\ub294 \uc758\ubbf8\ub85c \uc0ac\uc6a9. \uc2dc\uc2a4\ud15c\uc758 \ud504\ub85c\ud1a0 \ud0c0\uc785\uc744 \ub9cc\ub4e4\uc5b4 \ud14c\uc2a4\ud2b8 \ud560 \ub54c, \uc790\uc2e0\uc758 \ud658\uacbd\uc5d0\uc11c \uc798 \uc6c0\uc9c1\uc77c \ub54c, \ub610\ub294 \uc758\uacac \uc870\uc815\uc2dc\uc5d0 \ub098\uc5d0\uac8c \uace0\ub9c8\uc6b4 \uc81c\uc548\uc774\uc788\uc744 \ub54c \ub4f1\uc5d0 \uc0ac\uc6a9\ub428.<\/p>\n","pubDate":"Fri, 19 Jul 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/github\/abbreviation\/abbreviation\/","guid":"https:\/\/hidekuma.github.io\/github\/abbreviation\/abbreviation\/","category":["abbreviation","git","github","Github","Abbreviation"]},{"title":"Vim: \ube44\uba38 \ub274\ube44\ub77c\uba74 \ubcf4\uace0\uac00\uc57c\ud560 \ud0a4 \ub178\ud14c\uc774\uc158 \ubaa8\uc74c","description":"<h1 id=\"vim\uc758-\ud0a4-\ub178\ud14c\uc774\uc158-\ubaa8\uc74c\">Vim\uc758 \ud0a4 \ub178\ud14c\uc774\uc158 \ubaa8\uc74c<\/h1>\n<p>Vim\uc758 \ud0a4\ub9f5\uc744 \uc124\uc815\ud560 \ub54c \uc0ac\uc6a9\ub418\ub294 \ub178\ud14c\uc774\uc158\uc744 \uacf5\uc720\ud558\uace0\uc790 \ud569\ub2c8\ub2e4.\n<!--more--><\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th style=\"text-align: center\">notation<\/th>\n      <th>meaning<\/th>\n      <th>equivalent<\/th>\n      <th>decimal<\/th>\n      <th>value(s)<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;Leader&gt;<\/code><\/td>\n      <td>keypad \\<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">\\<\/code><\/td>\n      <td>92<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;Nul&gt;<\/code><\/td>\n      <td>zero<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">CTRL-@<\/code><\/td>\n      <td>0 (stored as 10)<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">&lt;Nul&gt;<\/code><\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;BS&gt;<\/code><\/td>\n      <td>backspace<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">CTRL-H<\/code><\/td>\n      <td>8<\/td>\n      <td>backspace<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;Tab&gt;<\/code><\/td>\n      <td>tab<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">CTRL-I<\/code><\/td>\n      <td>9<\/td>\n      <td>tab Tab<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;NL&gt;<\/code><\/td>\n      <td>linefeed<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">CTRL-J<\/code><\/td>\n      <td>10 (used for <code class=\"language-plaintext highlighter-rouge\">&lt;Nul&gt;<\/code>)<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;FF&gt;<\/code><\/td>\n      <td>formfeed<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">CTRL-L<\/code><\/td>\n      <td>12<\/td>\n      <td>formfeed<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;CR&gt;<\/code><\/td>\n      <td>carriage return<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">CTRL-M<\/code><\/td>\n      <td>13<\/td>\n      <td>carriage-return<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;Return&gt;<\/code><\/td>\n      <td>same as <code class=\"language-plaintext highlighter-rouge\">&lt;CR&gt;<\/code><\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">&lt;Return&gt;<\/code><\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;Enter&gt;<\/code><\/td>\n      <td>same as <code class=\"language-plaintext highlighter-rouge\">&lt;CR&gt;<\/code><\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">&lt;Enter&gt;<\/code><\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;Esc&gt;<\/code><\/td>\n      <td>escape<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">CTRL-[<\/code><\/td>\n      <td>27<\/td>\n      <td>escape <code class=\"language-plaintext highlighter-rouge\">&lt;Esc&gt;<\/code><\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;Space&gt;<\/code><\/td>\n      <td>space<\/td>\n      <td>\u00a0<\/td>\n      <td>32<\/td>\n      <td>space<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;lt&gt;<\/code><\/td>\n      <td>less-than<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">&lt;<\/code><\/td>\n      <td>60<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">&lt;lt&gt;<\/code><\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;Bslash&gt;<\/code><\/td>\n      <td>backslash<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">\\<\/code><\/td>\n      <td>92<\/td>\n      <td>backslash <code class=\"language-plaintext highlighter-rouge\">&lt;Bslash&gt;<\/code><\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;Bar&gt;<\/code><\/td>\n      <td>vertical bar<\/td>\n      <td>\u00a0<\/td>\n      <td>124<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">&lt;Bar&gt;<\/code><\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;Del&gt;<\/code><\/td>\n      <td>delete<\/td>\n      <td>\u00a0<\/td>\n      <td>127<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;CSI&gt;<\/code><\/td>\n      <td>command sequence intro<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">ALT-Esc<\/code><\/td>\n      <td>155<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">&lt;CSI&gt;<\/code><\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;xCSI&gt;<\/code><\/td>\n      <td>CSI when typed in the GUI<\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">&lt;xCSI&gt;<\/code><\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;EOL&gt;<\/code><\/td>\n      <td>end-of-line (can be <code class=\"language-plaintext highlighter-rouge\">&lt;CR&gt;<\/code>, <code class=\"language-plaintext highlighter-rouge\">&lt;LF&gt;<\/code> or <code class=\"language-plaintext highlighter-rouge\">&lt;CR&gt;&lt;LF&gt;<\/code>,depends on system and \u2018fileformat\u2019)<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">&lt;EOL&gt;<\/code><\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;Up&gt;<\/code><\/td>\n      <td>cursor-up<\/td>\n      <td>cursor-up<\/td>\n      <td>cursor_up<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;Down&gt;<\/code><\/td>\n      <td>cursor-down<\/td>\n      <td>cursor-down<\/td>\n      <td>cursor_down<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;Left&gt;<\/code><\/td>\n      <td>cursor-left<\/td>\n      <td>cursor-left<\/td>\n      <td>cursor_left<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;Right&gt;<\/code><\/td>\n      <td>cursor-right<\/td>\n      <td>cursor-right<\/td>\n      <td>cursor_right<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;S-Up&gt;<\/code><\/td>\n      <td>shift-cursor-up<\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;S-Down&gt;<\/code><\/td>\n      <td>shift-cursor-down<\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;S-Left&gt;<\/code><\/td>\n      <td>shift-cursor-left<\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;S-Right&gt;<\/code><\/td>\n      <td>shift-cursor-right<\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;C-Left&gt;<\/code><\/td>\n      <td>control-cursor-left<\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;C-Right&gt;<\/code><\/td>\n      <td>control-cursor-right<\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;F1&gt; - &lt;F12&gt;<\/code><\/td>\n      <td>function keys 1 to 12<\/td>\n      <td>function_key<\/td>\n      <td>function-key<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;S-F1&gt; - &lt;S-F12&gt;<\/code><\/td>\n      <td>shift-function keys 1 to 12<\/td>\n      <td>\u00a0<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">&lt;S-F1&gt;<\/code><\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;Help&gt;<\/code><\/td>\n      <td>help key<\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;Undo&gt;<\/code><\/td>\n      <td>undo key<\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;Insert&gt;<\/code><\/td>\n      <td>insert key<\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;Home&gt;<\/code><\/td>\n      <td>home<\/td>\n      <td>\u00a0<\/td>\n      <td>home<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;End&gt;<\/code><\/td>\n      <td>end<\/td>\n      <td>\u00a0<\/td>\n      <td>end<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;PageUp&gt;<\/code><\/td>\n      <td>page-up<\/td>\n      <td>\u00a0<\/td>\n      <td>page_up page-up<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;PageDown&gt;<\/code><\/td>\n      <td>page-down<\/td>\n      <td>\u00a0<\/td>\n      <td>page_down page-down<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;kHome&gt;<\/code><\/td>\n      <td>keypad home (upper left)<\/td>\n      <td>\u00a0<\/td>\n      <td>keypad-home<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;kEnd&gt;<\/code><\/td>\n      <td>keypad end (lower left)<\/td>\n      <td>\u00a0<\/td>\n      <td>keypad-end<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;kPageUp&gt;<\/code><\/td>\n      <td>keypad page-up (upper right)<\/td>\n      <td>\u00a0<\/td>\n      <td>keypad-page-up<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;kPageDown&gt;<\/code><\/td>\n      <td>keypad page-down (lower right)<\/td>\n      <td>\u00a0<\/td>\n      <td>keypad-page-down<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;kPlus&gt;<\/code><\/td>\n      <td>keypad +<\/td>\n      <td>\u00a0<\/td>\n      <td>keypad-plus<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;kMinus&gt;<\/code><\/td>\n      <td>keypad -<\/td>\n      <td>\u00a0<\/td>\n      <td>keypad-minus<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;kMultiply&gt;<\/code><\/td>\n      <td>keypad *<\/td>\n      <td>\u00a0<\/td>\n      <td>keypad-multiply<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;kDivide&gt;<\/code><\/td>\n      <td>keypad \/<\/td>\n      <td>\u00a0<\/td>\n      <td>keypad-divide<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;kEnter&gt;<\/code><\/td>\n      <td>keypad Enter<\/td>\n      <td>\u00a0<\/td>\n      <td>keypad-enter<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;kPoint&gt;<\/code><\/td>\n      <td>keypad Decimal point<\/td>\n      <td>\u00a0<\/td>\n      <td>keypad-point<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;k0&gt; - &lt;k9&gt;<\/code><\/td>\n      <td>keypad 0 to 9<\/td>\n      <td>\u00a0<\/td>\n      <td>keypad-0 keypad-9<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;S-...&gt;<\/code><\/td>\n      <td>shift-key<\/td>\n      <td>\u00a0<\/td>\n      <td>shift <code class=\"language-plaintext highlighter-rouge\">&lt;S-<\/code><\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;C-...&gt;<\/code><\/td>\n      <td>control-key<\/td>\n      <td>\u00a0<\/td>\n      <td>control ctrl <code class=\"language-plaintext highlighter-rouge\">&lt;C-<\/code><\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;M-...&gt;<\/code><\/td>\n      <td>alt-key or meta-key<\/td>\n      <td>\u00a0<\/td>\n      <td>meta alt <code class=\"language-plaintext highlighter-rouge\">&lt;M-<\/code><\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;A-...&gt;<\/code><\/td>\n      <td>same as <code class=\"language-plaintext highlighter-rouge\">&lt;M-...&gt;<\/code><\/td>\n      <td>\u00a0<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">&lt;A-<\/code><\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;D-...&gt;<\/code><\/td>\n      <td>command-key (Macintosh only)<\/td>\n      <td>\u00a0<\/td>\n      <td><code class=\"language-plaintext highlighter-rouge\">&lt;D-<\/code><\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\"><code class=\"language-plaintext highlighter-rouge\">&lt;t_xx&gt;<\/code><\/td>\n      <td>key with \u201cxx\u201d entry in termcap<\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n      <td>\u00a0<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n","pubDate":"Wed, 17 Jul 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/vim\/the-vim-key-notations\/","guid":"https:\/\/hidekuma.github.io\/vim\/the-vim-key-notations\/","category":["vim","key","notation","Vim"]},{"title":"Python: WSL\uc5d0\uc11c mataplotlib show \uc0ac\uc6a9\uc138\ud305","description":"<h1 id=\"matplotlib-with-wsl\">matplotlib with WSL<\/h1>\n<p>\ub370\uc774\ud130 \uc2dc\uac01\ud654 \ud234\uc778 <code class=\"language-plaintext highlighter-rouge\">mataplotlib<\/code>\ub294 \uba38\uc2e0\ub7ec\ub2dd \ubd84\uc57c\uc5d0\uc11c \ubc30\uc81c \ud560 \uc218\uc5c6\ub294 \ud234\uc774\ub2e4. \uc708\ub3c4\uc6b0\uc758 <code class=\"language-plaintext highlighter-rouge\">WSL<\/code> \uc548\uc5d0 <code class=\"language-plaintext highlighter-rouge\">miniconda<\/code>\ub97c \uc124\uce58\ud558\uace0 <code class=\"language-plaintext highlighter-rouge\">tensorflow<\/code>\ub97c \ud14c\uc2a4\ud2b8 \ud574\ubcf4\ub358 \ub3c4\uc911\uc5d0, <code class=\"language-plaintext highlighter-rouge\">matplotlib<\/code>\uc758 <code class=\"language-plaintext highlighter-rouge\">show<\/code>\uac00 \uc801\uc6a9\ub418\uc9c0 \uc54a\ub294 \ubb38\uc81c\uac00 \uc788\uc5c8\ub2e4. \ud574\uacb0\ubc95\uc740 \ub2e4\ud589\ud788 \uac04\ub2e8\ud558\ub2e4.<\/p>\n\n<!--more-->\n<h2 id=\"\ud574\uacb0\ubc95\">\ud574\uacb0\ubc95<\/h2>\n<ol>\n  <li><a href=\"https:\/\/sourceforge.net\/projects\/xming\/\">Xming(X \uc708\ub3c4\uc6b0 \uc11c\ubc84)<\/a>\ub97c \uc124\uce58\ud55c\ub2e4.<\/li>\n  <li><code class=\"language-plaintext highlighter-rouge\">putty<\/code>\ub294 \ud544\uc694\ud574\ub530\ub77c \uc124\uce58\ud558\uac70\ub098 \ud55c\ub2e4.<\/li>\n  <li>\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nb\">sudo <\/span>apt-get update\n<span class=\"nb\">sudo <\/span>apt-get <span class=\"nb\">install <\/span>python3.<span class=\"o\">{<\/span>version<span class=\"o\">}<\/span><span class=\"nt\">-tk<\/span>\nconda <span class=\"nb\">install <\/span>matplotlib\n<span class=\"nb\">export <\/span><span class=\"nv\">DISPLAY<\/span><span class=\"o\">=<\/span>localhost:0.0 \/\/ .bashrc\uc5d0 \ub123\ub294\uac8c \uc88b\uc74c\n<\/code><\/pre><\/div>    <\/div>\n    <p>\uc774\ub807\uac8c \ud558\uba74, <code class=\"language-plaintext highlighter-rouge\">Xming<\/code>\uc744 \ud1b5\ud574 \ub370\uc774\ud130 \uc2dc\uac01\ud654\uac00 \uc815\uc0c1\uc801\uc73c\ub85c \ub3d9\uc791\ud558\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n  <\/li>\n<\/ol>\n","pubDate":"Thu, 11 Jul 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/python\/matplotlib-with-wsl\/","guid":"https:\/\/hidekuma.github.io\/python\/matplotlib-with-wsl\/","category":["python","anaconda","miniconda","wsl","tensorflow","window","subsystem","linux","Python"]},{"title":"Pythonic: \ud30c\uc774\uc36c \ucee4\uc2a4\ud140 \ucee8\ud14c\uc774\ub108 \uc0dd\uc131\ud558\uae30","description":"<h1 id=\"-\ucee4\uc2a4\ud140-\ucee8\ud14c\uc774\ub108\uc758-\ubc14\ub78c\uc9c1\ud55c-\uc0dd\uc131\ubc95\">* \ucee4\uc2a4\ud140 \ucee8\ud14c\uc774\ub108\uc758 \ubc14\ub78c\uc9c1\ud55c \uc0dd\uc131\ubc95<\/h1>\n\n<h2 id=\"\ucee8\ud14c\uc774\ub108\ub780\">\ucee8\ud14c\uc774\ub108\ub780?<\/h2>\n<p>\ud30c\uc774\uc36c \ud074\ub798\uc2a4\ub294 \uc77c\uc885\uc758 \ucee8\ud14c\uc774\ub108\ub85c, \uc18d\uc131\uacfc \uae30\ub2a5\uc744 \ud568\uaed8 \ucea1\uc290\ud654\ud568\uc73c\ub85c\uc368 \ub370\uc774\ud130\ub97c \ub2f4\uace0 \uc788\ub294 \uac1d\uccb4\ub97c \ub73b\ud55c\ub2e4. \ud30c\uc774\uc36c \ub0b4\uc7a5 \ucee8\ud14c\uc774\ub108 \ud0c0\uc785\uc73c\ub85c\ub294 \ub9ac\uc2a4\ud2b8, \ud29c\ud50c, \uc138\ud2b8 \ub515\uc154\ub108\ub9ac \ub4f1\uc774 \uc788\ub2e4.<\/p>\n\n<h3 id=\"\uc608\uc2dc1-\ucee8\ud14c\uc774\ub108-\uc0c1\uc18d---\ub9ac\uc2a4\ud2b8\">\uc608\uc2dc1. \ucee8\ud14c\uc774\ub108 \uc0c1\uc18d - \ub9ac\uc2a4\ud2b8<\/h3>\n<p>list\uc758 \ud45c\uc900\uae30\ub2a5\uc744 \uc804\ubd80 \uad6c\ud604\ud558\uba74\uc11c, \uc911\ucca9\ub418\ub294 \uc544\uc774\ud15c\uc758 \uac2f\uc218\ub97c \uce74\uc6b4\ud305\ud558\ub294 \ucee4\uc2a4\ud140 \uae30\ub2a5\uc744 \uac00\uc9c4 \ucee4\uc2a4\ud140 \ucee8\ud14c\uc774\ub108 \uc608\uc2dc\uc774\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">class<\/span> <span class=\"nc\">CustomList<\/span><span class=\"p\">(<\/span><span class=\"nb\">list<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">initialize<\/span><span class=\"p\">):<\/span>\n        <span class=\"nb\">super<\/span><span class=\"p\">().<\/span><span class=\"n\">__init__<\/span><span class=\"p\">(<\/span><span class=\"n\">initialize<\/span><span class=\"p\">)<\/span>\n    \n    <span class=\"k\">def<\/span> <span class=\"nf\">summary<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\n        <span class=\"n\">rtn<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{}<\/span>\n        <span class=\"k\">for<\/span> <span class=\"n\">item<\/span> <span class=\"ow\">in<\/span> <span class=\"bp\">self<\/span><span class=\"p\">:<\/span>\n            <span class=\"n\">rtn<\/span><span class=\"p\">.<\/span><span class=\"n\">setdefault<\/span><span class=\"p\">(<\/span><span class=\"n\">item<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">)<\/span>\n            <span class=\"n\">rtn<\/span><span class=\"p\">[<\/span><span class=\"n\">item<\/span><span class=\"p\">]<\/span> <span class=\"o\">+=<\/span> <span class=\"mi\">1<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">rtn<\/span>\n\n<span class=\"n\">clist<\/span> <span class=\"o\">=<\/span> <span class=\"n\">CustomList<\/span><span class=\"p\">([<\/span><span class=\"s\">'a'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'b'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'c'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'d'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'a'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'b'<\/span><span class=\"p\">])<\/span>\n<span class=\"n\">summary<\/span> <span class=\"o\">=<\/span> <span class=\"n\">clist<\/span><span class=\"p\">.<\/span><span class=\"n\">summary<\/span><span class=\"p\">()<\/span>\n\n<span class=\"c1\">#  --- list \ud45c\uc900\uae30\ub2a5 --- \n<\/span><span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">clist<\/span><span class=\"p\">))<\/span>\n<span class=\"n\">clist<\/span><span class=\"p\">.<\/span><span class=\"n\">pop<\/span><span class=\"p\">()<\/span> \n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"nb\">repr<\/span><span class=\"p\">(<\/span><span class=\"n\">clist<\/span><span class=\"p\">))<\/span>\n<span class=\"n\">clist<\/span><span class=\"p\">.<\/span><span class=\"n\">append<\/span><span class=\"p\">(<\/span><span class=\"s\">'d'<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"nb\">repr<\/span><span class=\"p\">(<\/span><span class=\"n\">clist<\/span><span class=\"p\">))<\/span>\n\n<span class=\"c1\"># --- list \ucee4\uc2a4\ud140 \uae30\ub2a5 ---\n<\/span><span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">clist<\/span><span class=\"p\">.<\/span><span class=\"n\">summary<\/span><span class=\"p\">())<\/span>\n\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"mi\">6<\/span>\n<span class=\"p\">[<\/span><span class=\"s\">'a'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'b'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'c'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'d'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'a'<\/span><span class=\"p\">]<\/span>\n<span class=\"p\">[<\/span><span class=\"s\">'a'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'b'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'c'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'d'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'a'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'d'<\/span><span class=\"p\">]<\/span>\n<span class=\"p\">{<\/span><span class=\"s\">'a'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"s\">'b'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"s\">'c'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"s\">'d'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">}<\/span> <span class=\"c1\"># &lt;-- \ucee4\uc2a4\ud140 \uae30\ub2a5\n<\/span><\/code><\/pre><\/div><\/div>\n<!--more-->\n\n<h3 id=\"\uc608\uc2dc2-\ucee8\ud14c\uc774\ub108-\uc0dd\uc131---\ub9ac\uc2a4\ud2b8-\uc2dc\ud000\uc2a4-\uc2dc\ub9e8\ud2f1\uc744-\uac00\uc9c4-\ube44\uc120\ud615-\uc790\ub8cc\uad6c\uc870\uc758-\uc608\">\uc608\uc2dc2. \ucee8\ud14c\uc774\ub108 \uc0dd\uc131 - \ub9ac\uc2a4\ud2b8 \uc2dc\ud000\uc2a4 \uc2dc\ub9e8\ud2f1\uc744 \uac00\uc9c4 \ube44\uc120\ud615 \uc790\ub8cc\uad6c\uc870\uc758 \uc608<\/h3>\n<p>\ube44\uc120\ud615 \uc790\ub8cc\uad6c\uc870\uc778 Binary Tree \uc5d0 list\ub098 tuple \uac19\uc740 \uc2dc\ud000\uc2a4 \uc2dc\ub9e8\ud2f1\uc744 \uc81c\uacf5\ud558\uace0 \uc2f6\ub2e4\uace0 \ud558\uc790.<\/p>\n\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">class<\/span> <span class=\"nc\">BinaryNode<\/span><span class=\"p\">:<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">value<\/span><span class=\"p\">,<\/span> <span class=\"n\">left<\/span><span class=\"o\">=<\/span><span class=\"bp\">None<\/span><span class=\"p\">,<\/span> <span class=\"n\">right<\/span><span class=\"o\">=<\/span><span class=\"bp\">None<\/span><span class=\"p\">):<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">value<\/span> <span class=\"o\">=<\/span> <span class=\"n\">value<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">left<\/span> <span class=\"o\">=<\/span> <span class=\"n\">left<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">right<\/span> <span class=\"o\">=<\/span> <span class=\"n\">right<\/span>\n        \n<span class=\"k\">class<\/span> <span class=\"nc\">IndexableNode<\/span><span class=\"p\">(<\/span><span class=\"n\">BinaryNode<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">_search<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">count<\/span><span class=\"p\">,<\/span> <span class=\"n\">index<\/span><span class=\"p\">):<\/span>\n        <span class=\"c1\"># ...\n<\/span>        <span class=\"c1\"># \ube44\uc120\ud615 \ud2b8\ub9ac\ub97c \uc120\ud615\uc73c\ub85c \uc9c1\ub82c\ud654\ud588\uc744 \ub54c\uc758 \uc778\ub371\uc2a4 \ucc3e\uae30\n<\/span>\t\t<span class=\"c1\"># (found, count) \ubc18\ud658\n<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">__getitem__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">index<\/span><span class=\"p\">):<\/span>\n        <span class=\"n\">found<\/span><span class=\"p\">,<\/span> <span class=\"n\">_<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_search<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"n\">index<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">if<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">found<\/span><span class=\"p\">:<\/span>\n            <span class=\"k\">raise<\/span> <span class=\"nb\">IndexError<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Index out of range\"<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">found<\/span><span class=\"p\">.<\/span><span class=\"n\">value<\/span>\n\n<span class=\"n\">tree<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IndexableNode<\/span><span class=\"p\">(<\/span>\n\t<span class=\"mi\">10<\/span><span class=\"p\">,<\/span>\n\t<span class=\"n\">left<\/span><span class=\"o\">=<\/span><span class=\"n\">IndexableNode<\/span><span class=\"p\">(<\/span>\n\t\t\t<span class=\"mi\">5<\/span><span class=\"p\">,<\/span>\n\t\t\t<span class=\"n\">left<\/span><span class=\"o\">=<\/span><span class=\"n\">IndexableNode<\/span><span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">),<\/span>\n\t\t\t<span class=\"n\">right<\/span><span class=\"o\">=<\/span><span class=\"n\">IndexableNode<\/span><span class=\"p\">(<\/span><span class=\"mi\">6<\/span><span class=\"p\">,<\/span> <span class=\"n\">right<\/span><span class=\"o\">=<\/span><span class=\"n\">IndexableNode<\/span><span class=\"p\">(<\/span><span class=\"mi\">7<\/span><span class=\"p\">))<\/span>\n\t<span class=\"p\">),<\/span>\n\t<span class=\"n\">right<\/span><span class=\"o\">=<\/span><span class=\"n\">IndexableNode<\/span><span class=\"p\">(<\/span><span class=\"mi\">15<\/span><span class=\"p\">,<\/span> <span class=\"n\">left<\/span><span class=\"o\">=<\/span><span class=\"n\">IndexableNode<\/span><span class=\"p\">(<\/span><span class=\"mi\">11<\/span><span class=\"p\">))<\/span>\n<span class=\"p\">)<\/span>\n\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'LRR ='<\/span><span class=\"p\">,<\/span> <span class=\"n\">tree<\/span><span class=\"p\">.<\/span><span class=\"n\">left<\/span><span class=\"p\">.<\/span><span class=\"n\">right<\/span><span class=\"p\">.<\/span><span class=\"n\">right<\/span><span class=\"p\">.<\/span><span class=\"n\">value<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'Index 0 ='<\/span><span class=\"p\">,<\/span> <span class=\"n\">tree<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">])<\/span>\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'Index 1 ='<\/span><span class=\"p\">,<\/span> <span class=\"n\">tree<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">])<\/span>\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'11 in the tree?'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">11<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">tree<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'17 in the tree?'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">17<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">tree<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'Tree is'<\/span><span class=\"p\">,<\/span> <span class=\"nb\">list<\/span><span class=\"p\">(<\/span><span class=\"n\">tree<\/span><span class=\"p\">))<\/span>\n\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"n\">LRR<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">7<\/span>\n<span class=\"n\">Index<\/span> <span class=\"mi\">0<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">2<\/span>\n<span class=\"n\">Index<\/span> <span class=\"mi\">1<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">5<\/span>\n<span class=\"mi\">11<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">the<\/span> <span class=\"n\">tree<\/span><span class=\"err\">?<\/span> <span class=\"bp\">True<\/span>\n<span class=\"mi\">17<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">the<\/span> <span class=\"n\">tree<\/span><span class=\"err\">?<\/span> <span class=\"bp\">False<\/span>\n<span class=\"n\">Tree<\/span> <span class=\"ow\">is<\/span> <span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">,<\/span> <span class=\"mi\">6<\/span><span class=\"p\">,<\/span> <span class=\"mi\">7<\/span><span class=\"p\">,<\/span> <span class=\"mi\">10<\/span><span class=\"p\">,<\/span> <span class=\"mi\">11<\/span><span class=\"p\">,<\/span> <span class=\"mi\">15<\/span><span class=\"p\">]<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\ud2b8\ub9ac\ub294 \ube44\uc120\ud615 \uc790\ub8cc\uad6c\uc870\uc784\uc5d0\ub3c4 \ud0d0\uc0c9\uc740 \ubb3c\ub860\uc774\uace0 list\ucc98\ub7fc \uc778\ub371\uc2a4\ub85c \uc811\uadfc\ud560 \uc218\ub3c4 \uc788\ub2e4. \ubc14\ub85c <code class=\"language-plaintext highlighter-rouge\">__getitem__<\/code> \ub0b4\uc7a5\ud568\uc218\ub97c \uad6c\ud604\ud55c \uac83\uc774 \ud3ec\uc778\ud2b8\ub2e4. \ub9cc\uc57d <code class=\"language-plaintext highlighter-rouge\">len(tree)<\/code>\uacfc \uac19\uc740 \uae30\ub2a5\uc744 \uad6c\ud604 \ud558\ub824\uba74, <code class=\"language-plaintext highlighter-rouge\">__len__<\/code>\uc774\ub780 \ub0b4\uc7a5\ud568\uc218\ub97c \uad6c\ud604\ud558\uba74 \uc880 \ub354 \uc2dc\ud000\uc2a4 \uc2dc\ub9e8\ud2f1\ud55c \uc790\ub8cc\uad6c\uc870\ub85c \ub9cc\ub4e4\uc5b4\ub0bc \uc218 \uc788\ub2e4.<\/p>\n\n<p class=\"notice--info\"><strong>Sequence<\/strong><br \/>\n\uc2dc\ud000\uc2a4\ub294 \uc21c\uc11c\ub77c\ub294 \uc758\ubbf8\ub85c \ud504\ub85c\uadf8\ub798\ubc0d\uc5d0\uc11c \ud574\uc11d\ub41c\ub2e4. \uc989 \uc21c\uc11c\uac00 \uc788\ub294 \ub370\uc774\ud130\uc758 \uc9d1\ud569\uc774\uba70, \ub9ac\uc2a4\ud2b8\ub294 \uc218\ud559\uc801\uc73c\ub85c\ub294 \uc720\ud55c\uc218\uc5f4(finite sequence)\uc744 \ud504\ub85c\uadf8\ub798\ubc0d\uc801\uc73c\ub85c \ud45c\ud604\ud55c \uac83\uc774\ub2e4.<\/p>\n\n<h2 id=\"\ubc14\ub78c\uc9c1\ud55c-\ucee4\uc2a4\ud140-\ucee8\ud14c\uc774\ub108\uc758-\uc0dd\uc131\ubc29\ubc95\">\ubc14\ub78c\uc9c1\ud55c \ucee4\uc2a4\ud140 \ucee8\ud14c\uc774\ub108\uc758 \uc0dd\uc131\ubc29\ubc95<\/h2>\n<p>\ucee4\uc2a4\ud140 \ucee8\ud14c\uc774\ub108\ub97c \uc0dd\uc131\ud558\ub294 \uc608\uc2dc\uc5d0 \ub300\ud574 \ub2e4\ub904\ubd24\ub294\ub370, \ub9e4\ubc88 \uc0c8\ub85c\uc6b4 \ucee8\ud14c\uc774\ub108\ub97c \uc815\uc758\ud560 \ub54c\ub9c8\ub2e4, \ub9e4\ubc88 \uac19\uc740 \uae30\ub2a5\uc744 \uad6c\ud604\ud558\uac70\ub098 \uae30\ub300\ud558\ub294 \uae30\ub2a5\uc744 \uc815\uc758\ud558\ub294 \uc77c\uc740 \ubcf4\uae30\ubcf4\ub2e4 \uc5b4\ub835\uace0 \uae4c\ub2e4\ub86d\ub2e4. \ud30c\uc774\uc36c\uc5d0\uc11c\ub294 \uc774\ub7f0 \uc5b4\ub824\uc6c0\uc744 \ud53c\ud558\uae30 \uc704\ud574 \ub0b4\uc7a5 <code class=\"language-plaintext highlighter-rouge\">collections.abc<\/code>\ub97c \uc774\uc6a9\ud55c\ub2e4.<\/p>\n\n<h3 id=\"collectionsabc\">collections.abc<\/h3>\n<p>\uac01 \ucee8\ud14c\uc774\ub108 \ud0c0\uc785\uc5d0 \ud544\uc694\ud55c \uc77c\ubc18\uc801\uc778 \uba54\uc11c\ub4dc\ub97c \ubaa8\ub450 \uc81c\uacf5\ud558\ub294 \ucd94\uc0c1 \uae30\ubc18 \ud074\ub798\uc2a4\ub4e4\uc744 \uc815\uc758\ud558\uace0, \ud544\uc218\ub85c \uc815\uc758\ud574\uc57c\ud560 \uba54\uc11c\ub4dc\ub4e4\uc744 \uc54c\ub824\uc900\ub2e4. \uad6c\ud604\ud574\uc57c\ud560 \uba54\uc11c\ub4dc \ub4f1\uc758 \uc9c0\ud45c\ub294 <a href=\"https:\/\/docs.python.org\/3\/library\/collections.abc.html\">\ud574\ub2f9 \ub9c1\ud06c<\/a>\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kn\">from<\/span> <span class=\"nn\">collections.abc<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">Sequence<\/span>\n\n<span class=\"k\">class<\/span> <span class=\"nc\">BadType<\/span><span class=\"p\">(<\/span><span class=\"n\">Sequence<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">pass<\/span>\n\n<span class=\"n\">bad<\/span> <span class=\"o\">=<\/span> <span class=\"n\">badType<\/span><span class=\"p\">()<\/span>\n\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"nb\">TypeError<\/span><span class=\"p\">:<\/span> <span class=\"n\">Can<\/span><span class=\"s\">'t instantiate abstract class BadType with abstract methods __getitem__, __len__\n<\/span><\/code><\/pre><\/div><\/div>\n\n<p>\uc55e\uc11c \uc608\uc2dc\uc5d0\uc11c \uac70\ub860\ub41c <code class=\"language-plaintext highlighter-rouge\">__getitem__<\/code>, <code class=\"language-plaintext highlighter-rouge\">__len__<\/code>\uc744 \uad6c\ud604\ud574\uc57c \ud568\uc744 \uc54c\ub824\uc900\ub2e4.<\/p>\n\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"p\">...<\/span>\n\n<span class=\"k\">class<\/span> <span class=\"nc\">SequenceNode<\/span><span class=\"p\">(<\/span><span class=\"n\">IndexableNode<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">__len__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\n        <span class=\"n\">_<\/span><span class=\"p\">,<\/span> <span class=\"n\">count<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_search<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"bp\">None<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">count<\/span>\n\n<span class=\"k\">class<\/span> <span class=\"nc\">GoodType<\/span><span class=\"p\">(<\/span><span class=\"n\">SequenceNode<\/span><span class=\"p\">,<\/span> <span class=\"n\">Sequence<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">pass<\/span>\n\n<span class=\"n\">good<\/span> <span class=\"o\">=<\/span> <span class=\"n\">GoodType<\/span><span class=\"p\">()<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\uc774\ub807\uac8c \uad6c\ud604\ud55c \ud074\ub798\uc2a4\ub294 \uc55e\uc11c \ub9cc\ub4e0 \ud074\ub798\uc2a4\ub4e4\uacfc \ub2e4\ub974\uac8c <code class=\"language-plaintext highlighter-rouge\">index()<\/code>\ub098 <code class=\"language-plaintext highlighter-rouge\">count()<\/code> \uac19\uc740 \ubd80\uac00\uc801\uc778 \uba54\uc18c\ub4dc\ub97c \ud574\ub2f9 \ucd94\uc0c1 \ud074\ub798\uc2a4\uac00 \ubaa8\ub450 \uc81c\uacf5\ud574\uc900\ub2e4.\n<code class=\"language-plaintext highlighter-rouge\">Set<\/code>\uc774\ub098 <code class=\"language-plaintext highlighter-rouge\">MutableMapping<\/code>\ucc98\ub7fc \ud30c\uc774\uc36c\uc758 \uad00\ub840\uc5d0 \ub9de\ucdb0 \uad6c\ud604\ud574\uc57c \ud558\ub294 \uba54\uc11c\ub4dc\uac00 \ub9ce\uc740 \ubcf5\uc7a1\ud55c \uc790\ub8cc\uad6c\uc870\ub97c \uad6c\ud604\ud560 \ub54c, \uc774\ub7f0 \ucd94\uc0c1 \ud074\ub798\uc2a4\ub97c \uc0ac\uc6a9\ud558\uba74 \uc5bb\ub294 \uba54\ub9ac\ud2b8\uac00 \ub354 \ucee4\uc9c4\ub2e4.<\/p>\n","pubDate":"Fri, 14 Jun 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-create-custom-container\/","guid":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-create-custom-container\/","category":["pythonic","container","custom","Pythonic"]},{"title":"Python: asynchronous cURL requests: AsyncURL","description":"<h1 id=\"\ube44\ub3d9\uae30-curl-\ub9ac\ud018\uc2a4\ud2b8-\ub77c\uc774\ube0c\ub7ec\ub9ac-asyncurl\">\ube44\ub3d9\uae30 cURL \ub9ac\ud018\uc2a4\ud2b8 \ub77c\uc774\ube0c\ub7ec\ub9ac asyncurl<\/h1>\n<p>\ucd5c\uadfc \ud30c\uc774\uc36c\uc5d0 \uc720\uba85\ud55c \ube44\ub3d9\uae30 \ud504\ub808\uc784\uc6cc\ud06c <code class=\"language-plaintext highlighter-rouge\">sanic<\/code>\uc744 \uc0b4\ud3b4\ubcf4\ub2e4\uac00, \ub0b4\ubd80 \uc774\ubca4\ud2b8 \ub8e8\ud504\ub97c <code class=\"language-plaintext highlighter-rouge\">uvloop<\/code>\ub85c \ub300\uccb4\ud558\uc5ec \ube44\ub3d9\uae30\ud1b5\uc2e0\uc744 \ube60\ub974\uac8c \ud588\ub2e4\ub294 <a href=\"\/python\/uvloop\/\">\ubca4\uce58\ub9c8\ud0b9 \uacb0\uacfc<\/a>\ub97c \uac10\uba85\uae4a\uac8c \uc77d\uc5c8\ub2e4.\n\uacb0\uacfc\uc801\uc73c\ub85c <code class=\"language-plaintext highlighter-rouge\">asyncio<\/code>\uc758 \ud37c\ud3ec\uba3c\uc2a4\ub97c 2\ubc30 \uc774\uc0c1 \uc0c1\uc2b9\uc2dc\ud0a8 \uacb0\uacfc\ub97c \ubcf4\uace0, \uba87\ub144 \uc804 \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \ub9cc\ub4e4\uc5c8\uc5c8\ub358 \uc6f9 \ud06c\ub864\ub7ec\ub97c \ub5a0\uc62c\ub838\ub2e4.<\/p>\n\n<p>\ud30c\uc774\uc36c\uc758 <code class=\"language-plaintext highlighter-rouge\">GIL<\/code>\uc774\ub77c\ub294 \ub140\uc11d \ub54c\ubb38\uc5d0 \ub2f9\uc2dc\uc5d0\ub294 \uba40\ud2f0\ud504\ub85c\uc138\uc2f1\uc744 \uc774\uc6a9\ud558\uc5ec \ubcd1\ub82c\ucc98\ub9ac\ub97c \uad6c\ud604\ud588\uc5c8\ub294\ub370, \uc774\ubc88\uc5d0\ub294 \ud558\ub098\uc758 \uc2a4\ub808\ub4dc\ub85c \ubcd1\ub82c\ucc98\ub9ac\ub97c \uad6c\ud604\ud558\ub294 \ube44\ub3d9\uae30 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uad6c\ud604\ud558\uae30\ub85c \ub9c8\uc74c \uba39\uc5c8\ub2e4.<\/p>\n\n<h2 id=\"\uc758\uc874\uc131\">\uc758\uc874\uc131<\/h2>\n<p>\ud30c\uc774\uc36c 3.6 \uc774\uc0c1\ubd80\ud130 \uc9c0\uc6d0\ud558\uba70, \uc791\uc131\uc77c \uae30\uc900 \uc0c1\uc138 \ub77c\uc774\ube0c\ub7ec\ub9ac \uc758\uc874\uc131\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th style=\"text-align: center\">Package<\/th>\n      <th style=\"text-align: center\">Version<\/th>\n      <th style=\"text-align: center\">Description<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td style=\"text-align: center\">asyncio<\/td>\n      <td style=\"text-align: center\">&gt;=3.4.3<\/td>\n      <td style=\"text-align: center\">Asynchronous<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\">requests<\/td>\n      <td style=\"text-align: center\">&gt;=2.22.0<\/td>\n      <td style=\"text-align: center\">pycurl substitutes<\/td>\n    <\/tr>\n    <tr>\n      <td style=\"text-align: center\">uvloop<\/td>\n      <td style=\"text-align: center\">&gt;=0.12.2<\/td>\n      <td style=\"text-align: center\">for event loop policy<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n<p>\uc774\ubca4\ud2b8\ub8e8\ud504 \ub300\uccb4\uc81c\uc778 <code class=\"language-plaintext highlighter-rouge\">uvloop<\/code>, \ube44\ub3d9\uae30 \ub77c\uc774\ube0c\ub7ec\ub9ac <code class=\"language-plaintext highlighter-rouge\">asyncio<\/code>, \ub9c8\uc9c0\ub9c9\uc73c\ub85c\ub294 \ud1b5\uc2e0\uc744 \uc704\ud55c <code class=\"language-plaintext highlighter-rouge\">requests<\/code> \uc774\uc0c1 3\uac00\uc9c0\uc774\ub2e4.\n\uac1c\uc778\uc801\uc73c\ub85c <code class=\"language-plaintext highlighter-rouge\">pycurl<\/code>\uc740 \uc124\uce58 \uc758\uc874\uc131\ub3c4 \uae4c\ub2e4\ub86d\uace0, \uc0ac\uc6a9\uacfc \uc124\uce58\uc5d0 \uadc0\ucc2e\uc558\ub358 \uae30\uc5b5\ub4e4\uc774 \uc788\uc5b4\uc11c \uc0ac\uc6a9\uc131 \uba74\uc5d0\uc11c \uac11\uc778 <code class=\"language-plaintext highlighter-rouge\">requests<\/code>\ub97c \ud0dd\ud558\uc600\ub2e4.<\/p>\n\n<!--more-->\n\n<h2 id=\"concept\">Concept<\/h2>\n<p><code class=\"language-plaintext highlighter-rouge\">asyncio<\/code>\uc640 <code class=\"language-plaintext highlighter-rouge\">requests<\/code>\ub9cc \uc788\ub2e4\uba74, \ub204\uad6c\ub4e0\uc9c0 \ube44\ub3d9\uae30 cURL \ub9ac\ud018\uc2a4\ud2b8\ub97c \uad6c\ud604\ud560 \uc218 \uc788\ub2e4.\n\ud558\uc9c0\ub9cc \ud574\ub2f9 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc774\ud574\ud558\uace0 \ucf54\ub8e8\ud2f4 \uc9dc\ub294\ub370 \ub9ac\uc18c\uc2a4\uac00 \uc18c\uc694\ub418\uae30 \ub54c\ubb38\uc5d0, \uadf8\ub7f0 \ubd80\ubd84\uc744 \ud574\uc18c\ud558\uae30 \uc704\ud574 \ub9cc\ub4e0\uac83\uc774 <a href=\"https:\/\/pypi.org\/project\/asyncurl\/\">AsyncURL<\/a>\uc774\ub2e4. \n\uc870\uae08 \ub2e4\ub978 \uc810\uc774\ub77c\uace0 \ud558\uba74, \ub0b4\ubd80 \uc774\ubca4\ud2b8 \ub8e8\ud504\ub97c <code class=\"language-plaintext highlighter-rouge\">asyncio<\/code>\uc758 \ub0b4\uc7a5 \uc774\ubca4\ud2b8 \ub8e8\ud504\uac00 \uc544\ub2cc, <code class=\"language-plaintext highlighter-rouge\">uvloop<\/code>\uc758 \uc774\ubca4\ud2b8 \ub8e8\ud504 \uc815\ucc45\uc744 \uc0ac\uc6a9\ud588\ub2e8 \uc810\uc774\ub2e4.<\/p>\n\n<h2 id=\"installation\">Installation<\/h2>\n<p>\ubc30\ud3ec\ud310\uc740 <a href=\"https:\/\/github.com\/hidden-function\/asyncurl\/releases\">\uc5ec\uae30\uc11c \ub2e4\uc6b4\ub85c\ub4dc<\/a> \ud560 \uc218 \uc788\ub2e4.<\/p>\n\n<h3 id=\"using-pip\">Using pip<\/h3>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">pip<\/span> <span class=\"n\">install<\/span> <span class=\"n\">asyncurl<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"usage\">Usage<\/h2>\n<p>\uc0ac\uc2e4 \uad6c\uccb4\uc801\uc778 \uc0ac\uc6a9\ubc95\uc774\ub098 \ub0b4\uc6a9\uc740 <a href=\"https:\/\/github.com\/hidden-function\/asyncurl\">README.md<\/a>\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uace0, \uc774\ubc88 \ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294 \uc608\uc2dc\ub9cc \uc0b4\uc9dd \uacf5\uc720\ud558\uace0, \uae4a\uac8c \ub2e4\ub8e8\uc9c4 \uc54a\uaca0\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kn\">from<\/span> <span class=\"nn\">asyncurl.session<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">AsyncURLSession<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">asyncurl.fetch<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">AsyncURLFetch<\/span>\n\n<span class=\"n\">ac_fetch<\/span> <span class=\"o\">=<\/span> <span class=\"n\">AsyncURLFetch<\/span><span class=\"p\">()<\/span>\n\n<span class=\"k\">for<\/span> <span class=\"n\">x<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">range<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">):<\/span>\n    <span class=\"n\">session<\/span> <span class=\"o\">=<\/span> <span class=\"n\">AsyncURLSession<\/span><span class=\"p\">()<\/span>\n    <span class=\"n\">session<\/span><span class=\"p\">.<\/span><span class=\"n\">fetch_url<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'http:\/\/localhost'<\/span> \n    <span class=\"n\">session<\/span><span class=\"p\">.<\/span><span class=\"n\">fetch_method<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'POST'<\/span>\n    <span class=\"n\">session<\/span><span class=\"p\">.<\/span><span class=\"n\">headers<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span><span class=\"s\">'User-Agent'<\/span><span class=\"p\">:<\/span> <span class=\"s\">'Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/50.0.2661.102 Safari\/537.36'<\/span><span class=\"p\">}<\/span>\n    <span class=\"n\">ac_fetch<\/span><span class=\"p\">.<\/span><span class=\"n\">queue<\/span><span class=\"p\">.<\/span><span class=\"n\">put_nowait<\/span><span class=\"p\">(<\/span><span class=\"n\">session<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">ac_fetch<\/span><span class=\"p\">.<\/span><span class=\"n\">parallel<\/span><span class=\"p\">()<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\ud68c\uace0\">\ud68c\uace0<\/h2>\n<p>\uc0ac\uc2e4 \ubb50 \uc544\uc9c1 \ubca0\ud0c0 \uc815\ub3c4\uc758 \uac1c\ubc1c \ub2e8\uacc4\uc774\uae30 \ub54c\ubb38\uc5d0, \uac1c\uc120\ud574\uc57c \ud560 \uc5ec\uc9c0\uac00 \ub9ce\ub2e4. \ub2e4\ub978 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc640\ub3c4 \ube44\uad50 \ud574\ubcf4\uace0 \ud574\ub2f9 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub9cc\uc758 \uc7a5\uc810\uc744 \ub9cc\ub4dc\ub294 \uac83\uc774 \uc55e\uc73c\ub85c\uc758 \uc219\uc81c\ub77c\uace0 \uc0dd\uac01\ud55c\ub2e4.\n\ub610\ud55c \ud574\ub2f9 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub294 \ud1b5\uc2e0 \uacb0\uacfc\uac12 \ub4e4\uc744 \uac16\uac8c \ub418\uae30 \ub54c\ubb38\uc5d0 \uba54\ubaa8\ub9ac \ub204\uc218\uc758 \uc704\ud5d8\uc774 \uc788\ub2e4. \ud558\ub4dc\uc6e8\uc5b4 \uc801\uc778 \ubd80\ub2f4\ub3c4 \uc880 \ub354 \uc0dd\uac01\ud558\uba74\uc11c \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \ubcf4\uc644\ud560 \ud544\uc694\uac00 \uc788\ub2e4.<\/p>\n\n<p>\uc774\ubc88 \ub77c\uc774\ube0c\ub7ec\ub9ac \uc791\uc131\uc5d0\uc11c \uac00\uc7a5 \uc911\uc694\uc2dc \ud588\ub358\uac74, <code class=\"language-plaintext highlighter-rouge\">PEP8<\/code>\uc5d0 \ub9de\ub294 \ucf54\ub4dc \ucee8\ubca4\uc158\uacfc <code class=\"language-plaintext highlighter-rouge\">pythonic<\/code>\ud55c \ucf54\ub4dc \uc791\uc131\uc774\uc5c8\ub2e4. \ub9c9\uc5f0\ud788 \ud30c\uc774\uc368\ub2c9\ud55c \ucf54\ub4dc\ub97c \uc9dc\uc57c\ud55c\ub2e4\ub77c\uace0 \uc0dd\uac01\ud588\ub358 \uc810\ub4e4\uc774, \uc2e4\uc81c\ub85c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uba74\uc11c\n\ud544\uc694\ubd88\uac00\uacb0\ud55c \uc694\uc18c\ub85c \ub2e4\uac00\uc654\uace0 \ube44\ub85d \ube60\ub974\uc9c4 \uc54a\uc558\uc9c0\ub9cc, \ud2c8\ud2c8\ud788 \uacf5\ubd80\ud588\ub358 \ub0b4\uc6a9\uc5d0 \ub300\ud574\uc11c \ub9ce\uc774 \ubc18\uc5ec\ud558\uba74\uc11c \uad49\uc7a5\ud788 \uc990\uac81\uac8c \ucf54\ub529\ud560 \uc218 \uc788\uc5c8\ub2e4. \uc55e\uc73c\ub85c\ub3c4 \uacc4\uc18d \uacf5\ubd80\ud558\uace0 \uc88b\uc740 \ubc29\ud5a5\uc73c\ub85c \ubc84\uc804\uc5c5 \ud574 \ubcfc \uc608\uc815\uc774\ub2e4.<\/p>\n\n","pubDate":"Fri, 14 Jun 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/python\/asynchronous-curl-requests\/","guid":"https:\/\/hidekuma.github.io\/python\/asynchronous-curl-requests\/","category":["asynchronous","curl","request","asyncurl","library","uvloop","asyncio","Python"]},{"title":"Pythonic: \ud30c\uc774\uc36c\uc758 \ube44\uacf5\uac1c \ud544\ub4dc","description":"<h1 id=\"-\ud30c\uc774\uc36c-\ube44\uacf5\uac1c-\ud544\ub4dc\">* \ud30c\uc774\uc36c \ube44\uacf5\uac1c \ud544\ub4dc<\/h1>\n\n<p>\uc774\ub984\uc5d0\uc11c \uc608\uc0c1\ud560 \uc218 \uc788\ub4ef\uc774, \uc815\uc758 \ub41c \ud074\ub798\uc2a4\ub0b4\uc5d0\uc11c\ub9cc \uc811\uadfc\uc774 \uac00\ub2a5\ud55c \uc18d\uc131\uc774\ub2e4. \uc11c\ube0c\ud074\ub798\uc2a4\uc5d0\uc11c\ub3c4 \ubd80\ubaa8\ud074\ub798\uc2a4\uc758 \ube44\uacf5\uac1c \ud544\ub4dc\uc5d0 \uc811\uadfc\ud558\uc9c0 \ubabb\ud55c\ub2e4.<\/p>\n\n<h2 id=\"\ucef4\ud30c\uc77c\ub7ec\uc758-\ube44\uacf5\uac1c-\uc18d\uc131-\ucee8\ud2b8\ub864\">\ucef4\ud30c\uc77c\ub7ec\uc758 \ube44\uacf5\uac1c \uc18d\uc131 \ucee8\ud2b8\ub864<\/h2>\n<p>\ud30c\uc774\uc36c \ucef4\ud30c\uc77c\ub7ec\uac00 \ube44\uacf5\uac1c \uc18d\uc131\uc744 \uc815\uc758\ud558\ub294 \ubc29\ubc95\uc740 \ube44\uad50\uc801 \uac04\ub2e8\ud558\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">class<\/span> <span class=\"nc\">MyTestObject<\/span><span class=\"p\">(<\/span><span class=\"nb\">object<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">public_value<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">10<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">__private_value<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\n\n<span class=\"n\">test<\/span> <span class=\"o\">=<\/span> <span class=\"n\">MyTestObject<\/span><span class=\"p\">()<\/span>\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">test<\/span><span class=\"p\">.<\/span><span class=\"n\">__dict__<\/span><span class=\"p\">)<\/span>\n\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"p\">{<\/span><span class=\"s\">'public_value'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">10<\/span><span class=\"p\">,<\/span> <span class=\"s\">'_MyTestObject.__private_value'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">}<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\uc0c1\uae30 \ucf54\ub4dc\uc640 \uac19\uc774, <code class=\"language-plaintext highlighter-rouge\">__private_value<\/code>\uc5d0 \uc811\uadfc\ud558\ub294 \ucf54\ub4dc\ub97c \ubc1c\uacac\ud558\uba74 <code class=\"language-plaintext highlighter-rouge\">_{class_name}__{private_field}<\/code>\ub85c \ubcc0\ud658\ud55c\ub2e4.<\/p>\n\n<p>\ub530\ub77c\uc11c \uc6b0\ub9ac\uac00 \ube44\uacf5\uac1c \uc18d\uc131\uc5d0 \uc9c1\uc811 \uc811\uadfc\ud560 \ub54c \ubcf4\ub294 \uc5d0\ub7ec\ub294 \ub2e8\uc21c\ud788 \ucef4\ud30c\uc77c\ub7ec\uac00 \ubcc0\uacbd\ud55c \uc18d\uc131\uc758 \uc774\ub984\uc744 \ucc3e\uc9c0 \ubabb\ud574 \ubc1c\uc0dd\ud55c\ub2e4. \uc774 \uaddc\uce59\uc744 \uc774\ud574\ud558\uba74 \uc0ac\uc2e4 \uc6b0\ub9ac\ub294 \ub9c8\uc74c\ub9cc \uba39\uc73c\uba74 \uc5b8\uc81c\ub4e0\uc9c0 \uac1d\uccb4\ub0b4\ubd80\ub97c \uc870\uc791\ud558\uace0, \ube44\uacf5\uac1c \uc18d\uc131\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n<!--more-->\n<h3 id=\"\ubcf4\ud638-\uc18d\uc131---\ube44\uacf5\uac1c-\uc18d\uc131\">\ubcf4\ud638 \uc18d\uc131 \/  \ube44\uacf5\uac1c \uc18d\uc131<\/h3>\n<p>\ud30c\uc774\uc36c\uc5d0\uc120 \ubcf4\ud638 \uc18d\uc131\uacfc \ube44\uacf5\uac1c \uc18d\uc131\uc744 \ub2e4\uc74c\uacfc \uac19\uc740 \uaddc\uce59(<strong>\uc18d\uc131\uc55e\uc5d0 \uc5b8\ub354\uc2a4\ucf54\uc5b4 \uac1c\uc218<\/strong>)\uc73c\ub85c \uc815\uc758\ud55c\ub2e4.<\/p>\n<ul>\n  <li><code class=\"language-plaintext highlighter-rouge\">_protected_value<\/code> = \ubcf4\ud638<\/li>\n  <li><code class=\"language-plaintext highlighter-rouge\">__private_value<\/code> = \ube44\uacf5\uac1c<\/li>\n  <li><code class=\"language-plaintext highlighter-rouge\">public_value<\/code> = \uacf5\uac1c<\/li>\n<\/ul>\n\n<h2 id=\"\ube44\uacf5\uac1c-\uc18d\uc131\uc744-\uc5c4\uaca9\ud558\uac8c-\uac15\uc81c\ud558\uc9c0-\uc54a\uc740-\uc774\uc720\">\ube44\uacf5\uac1c \uc18d\uc131\uc744 \uc5c4\uaca9\ud558\uac8c \uac15\uc81c\ud558\uc9c0 \uc54a\uc740 \uc774\uc720<\/h2>\n<blockquote>\n  <p>\u201cWe are consenting adults.\u201d (\uc6b0\ub9ac \ubaa8\ub450 \uc131\uc778\uc774\ub77c\ub294 \uc0ac\uc2e4\uc5d0 \ub3d9\uc758\ud55c\ub2e4)<\/p>\n<\/blockquote>\n\n<p>\uc778\uc6a9\ubb38\uc5d0\uc11c \uc54c \uc218 \uc788\ub4ef\uc774, \ud30c\uc774\uc36c \ud504\ub85c\uadf8\ub798\uba38\ub4e4\uc740 \ud3d0\uc1c4\ub85c \uc5bb\ub294 \ub514\uba54\ub9ac\ud2b8\ubcf4\ub2e4 \uac1c\ubc29\uc73c\ub85c \uc5bb\ub294 \uba54\ub9ac\ud2b8\uac00 \ub354 \ud06c\ub2e4\uace0 \ubbff\ub294\ub2e4. \ub610\ud55c, \uc774\ub85c\uc368 \ud30c\uc0dd\ub418\ub294 \ubb34\ubd84\ubcc4\ud55c \uac1d\uccb4\uc5d0\uc758 \ub0b4\ubd80\uc811\uadfc\uacfc \uadf8\uc5d0 \ub530\ub978 \uc704\ud5d8\uc744 \ucd5c\uc18c\ud654\ud558\uae30 \uc704\ud574, <a href=\"\/pythonic\/pythonic-pep8\/\">\ud30c\uc774\uc36c \uc2a4\ud0c0\uc77c \uac00\uc774\ub4dc<\/a>\ub97c \ub530\ub974\ub294 \uac83\uc774 \ub9e4\uc6b0 \uc911\uc694\ud574\uc9c0\ub294 \uc774\uc720\uc774\ub2e4.<\/p>\n\n<p>\uc8fc\ub85c \ud30c\uc774\uc368\ub2c9\ud558\uac8c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc740, \ubcf4\ud638\uc18d\uc131\uc744 \uc0ac\uc6a9\ud558\uc5ec \ube44\uacf5\uac1c\uc18d\uc131\ucc98\ub7fc \uc811\uadfc\uc744 \uac15\uc81c\ub85c \uc81c\uc5b4\ud558\uc9c0 \ub9d0\uace0 \ubcf4\ud638 \ud544\ub4dc\ub97c \ubb38\uc11c\ud654(docstring)\ud558\uc5ec, \ud074\ub798\uc2a4 \uc0ac\uc6a9\uc5d0 \ud544\uc694\ud55c \uc9c0\uce68\uc744 \uc81c\uacf5\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4.<\/p>\n\n<h3 id=\"docstring\">docstring<\/h3>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">class<\/span> <span class=\"nc\">MyTestObject<\/span><span class=\"p\">(<\/span><span class=\"nb\">object<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\n        <span class=\"s\">\"\"\"\n        &lt;docsting example&gt;\n        1. init\uc5d0\uc11c \ucd08\uae30\ud654 \ub418\ub294 \ubcf4\ud638 \uc18d\uc131\uc774\ub2e4.\n        2. \ubb38\uc790\uc5f4\uc774 \uc544\ub2cc int\ub85c \uc815\uc758\ub418\uc5b4\uc57c \ud55c\ub2e4.\n        3. \uac1d\uccb4\ub85c \ud560\ub2f9\ub418\uace0 \ub098\uc11c\ub294 immutable\ud574\uc57c\ud55c\ub2e4.\n        \"\"\"<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">public_value<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">10<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">__private_value<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_protect_value<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">100<\/span>\n\n<span class=\"n\">test<\/span> <span class=\"o\">=<\/span> <span class=\"n\">MyTestObject<\/span><span class=\"p\">()<\/span>\n<\/code><\/pre><\/div><\/div>\n","pubDate":"Mon, 27 May 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-private-field\/","guid":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-private-field\/","category":["pythonic","private field","protectd field","public field","Pythonic"]},{"title":"Pythonic: \uc0c1\ud0dc\ubcf4\uc874 \ud074\ub85c\uc800","description":"<h1 id=\"-\uc0c1\ud0dc\ubcf4\uc874-\ud074\ub85c\uc800\">* \uc0c1\ud0dc\ubcf4\uc874 \ud074\ub85c\uc800<\/h1>\n\n<h2 id=\"\uc608\uc2dc-1-\ud568\uc218\ud615\ud0dc\">\uc608\uc2dc 1. \ud568\uc218\ud615\ud0dc<\/h2>\n<p>\ub515\uc154\ub108\ub9ac \ud0c0\uc785\uc758 <code class=\"language-plaintext highlighter-rouge\">before<\/code>\uc5d0 \ud29c\ud50c\ub85c \uad6c\uc131 \ub41c <code class=\"language-plaintext highlighter-rouge\">loop<\/code>\ub370\uc774\ud130\ub97c \uc21c\ud68c\ud558\uba74\uc11c, \ud574\ub2f9 <code class=\"language-plaintext highlighter-rouge\">value<\/code>\ub97c \ud569\uc0b0\ud558\uace0 \uc0c8\ub85c\uc6b4 \uac12\uc774 \ucd94\uac00 \ub420\ub54c\ub9c8\ub2e4 <code class=\"language-plaintext highlighter-rouge\">print<\/code>\ub97c \ucc0d\ub294 \ud568\uc218\uc774\ub2e4. \ud074\ub85c\uc800\uac00 \uc77d\uc5b4\uc9c0\ub294 \uc21c\uc11c\uc5d0 \ub300\ud574 \uc798 \ubaa8\ub978\ub2e4\uba74, <a href=\"\/pythonic\/pythonic-closure\/\">\ud574\ub2f9 \ubb38\uc11c<\/a>\ub97c \ucc38\uace0\ud560 \uac83.<\/p>\n\n<p class=\"notice--info\"><strong>defaultdict<\/strong><br \/>\ud574\ub2f9 \uc790\ub8cc\uad6c\uc870\ub294 \ucc3e\uc744 \uc218 \uc5c6\ub294 \ud0a4\uc5d0 \uc811\uadfc\ud560 \ub54c\ub9c8\ub2e4 \ud638\ucd9c\ub420 \ud568\uc218\ub97c \ud6c4\ud06c(hook)\uc73c\ub85c \ubc1b\ub294\ub2e4.<\/p>\n\n<!--more-->\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kn\">from<\/span> <span class=\"nn\">collections<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">defaultdict<\/span>\n\n<span class=\"c1\"># \uae30\ubcf8 \ub370\uc774\ud130\n<\/span><span class=\"n\">before<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span><span class=\"s\">'A'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"s\">'C'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"s\">'D'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">5<\/span><span class=\"p\">}<\/span>\n<span class=\"c1\"># loop\ub97c \ub3cc \ub370\uc774\ud130\n<\/span><span class=\"n\">loop<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\n    <span class=\"p\">(<\/span><span class=\"s\">'A'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">),<\/span>\n    <span class=\"p\">(<\/span><span class=\"s\">'B'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">),<\/span>\n    <span class=\"p\">(<\/span><span class=\"s\">'E'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">6<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">]<\/span>\n\n<span class=\"k\">def<\/span> <span class=\"nf\">preserve_state<\/span><span class=\"p\">(<\/span><span class=\"n\">before<\/span><span class=\"p\">,<\/span> <span class=\"n\">loop<\/span><span class=\"p\">):<\/span>\n    <span class=\"n\">count_num<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span> <span class=\"c1\"># \uc0c1\ud0dc\ub97c \ubcf4\uc874\uc2dc\ud0ac \ub370\uc774\ud130\n<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">added_count<\/span><span class=\"p\">():<\/span>\n        <span class=\"k\">nonlocal<\/span> <span class=\"n\">count_num<\/span> <span class=\"c1\"># \uc0c1\ud0dc\ubcf4\uc874 \ud074\ub85c\uc800\n<\/span>        <span class=\"n\">count_num<\/span> <span class=\"o\">+=<\/span> <span class=\"mi\">1<\/span>\n        <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'-- Added new value %d --'<\/span> <span class=\"o\">%<\/span> <span class=\"p\">(<\/span><span class=\"n\">count_num<\/span><span class=\"p\">))<\/span>\n        <span class=\"k\">return<\/span> <span class=\"mi\">0<\/span>\n\n    <span class=\"n\">after<\/span> <span class=\"o\">=<\/span> <span class=\"n\">defaultdict<\/span><span class=\"p\">(<\/span><span class=\"n\">added_count<\/span><span class=\"p\">,<\/span> <span class=\"n\">before<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">for<\/span> <span class=\"n\">k<\/span><span class=\"p\">,<\/span> <span class=\"n\">v<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">loop<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">after<\/span><span class=\"p\">[<\/span><span class=\"n\">k<\/span><span class=\"p\">]<\/span> <span class=\"o\">+=<\/span> <span class=\"n\">v<\/span>\n\n    <span class=\"k\">return<\/span> <span class=\"n\">after<\/span><span class=\"p\">,<\/span> <span class=\"n\">count_num<\/span>\n\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'BEFORE: '<\/span><span class=\"p\">,<\/span> <span class=\"n\">before<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">after<\/span><span class=\"p\">,<\/span> <span class=\"n\">count_num<\/span> <span class=\"o\">=<\/span> <span class=\"n\">preserve_state<\/span><span class=\"p\">(<\/span><span class=\"n\">before<\/span><span class=\"p\">,<\/span> <span class=\"n\">loop<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'AFTER: '<\/span><span class=\"p\">,<\/span> <span class=\"nb\">dict<\/span><span class=\"p\">(<\/span><span class=\"n\">after<\/span><span class=\"p\">))<\/span>\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'ADDED COUNT: '<\/span><span class=\"p\">,<\/span> <span class=\"n\">count_num<\/span><span class=\"p\">)<\/span>\n\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"n\">BEFORE<\/span><span class=\"p\">:<\/span>  <span class=\"p\">{<\/span><span class=\"s\">'A'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"s\">'C'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"s\">'D'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">5<\/span><span class=\"p\">}<\/span>\n<span class=\"o\">--<\/span> <span class=\"n\">Added<\/span> <span class=\"n\">new<\/span> <span class=\"n\">value<\/span> <span class=\"mi\">1<\/span> <span class=\"o\">--<\/span>\n<span class=\"o\">--<\/span> <span class=\"n\">Added<\/span> <span class=\"n\">new<\/span> <span class=\"n\">value<\/span> <span class=\"mi\">2<\/span> <span class=\"o\">--<\/span>\n<span class=\"n\">AFTER<\/span><span class=\"p\">:<\/span>  <span class=\"p\">{<\/span><span class=\"s\">'A'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"s\">'C'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"s\">'D'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">5<\/span><span class=\"p\">,<\/span> <span class=\"s\">'B'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"s\">'E'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">6<\/span><span class=\"p\">}<\/span>\n<span class=\"n\">ADDED<\/span> <span class=\"n\">COUNT<\/span><span class=\"p\">:<\/span>  <span class=\"mi\">2<\/span>\n<\/code><\/pre><\/div><\/div>\n<p class=\"notice--warning\">\uc0c8\ub86d\uac8c \ucd94\uac00\ub418\ub294 \ub370\uc774\ud130\ub294 B\uc640 E\uc774\ubbc0\ub85c Added new value\uac00 2\ubc88 \ud504\ub9b0\ud305\ub418\uc5b4 \uae30\ub300\ud558\ub294 \uacb0\uacfc\ub97c \ub3c4\ucd9c\ud558\uc600\ub2e4.\n<strong>nonlocal<\/strong><br \/>\nnonlocal\uc740 \ud2b9\uc815 \ubcc0\uc218 \uc774\ub984\uc5d0 \ud560\ub2f9\ud560 \ub54c, \uc2a4\ucf54\ud504\ud0d0\uc0c9\uc774 \uc77c\uc5b4\ub098\uc57c \ud568\uc744 \ub098\ud0c0\ub0b8\ub2e4. \ud2b9\ud788, \uc804\uc5ed \ubcc0\uc218\uc758 \uc624\uc5fc\uc744 \ud53c\ud558\uae30 \uc704\ud574\uc11c(\uce58\uba85\uc801\uc778 \uc624\ub958\ub85c \ubc1c\uc804\ud560 \uc218\uc788\uc74c) \ubaa8\ub4c8 \uc218\uc900\uae4c\uc9c0\uc758 \uc2a4\ucf54\ud504\uae4c\uc9c0\ub294 \ud0d0\uc0c9\ud560 \uc218 \uc5c6\ub2e4.<\/p>\n\n<h2 id=\"\uc608\uc2dc-2-\ud074\ub798\uc2a4-\ud615\ud0dc\">\uc608\uc2dc 2. \ud074\ub798\uc2a4 \ud615\ud0dc<\/h2>\n<p>\ubcf4\uc874\ud560 \uc0c1\ud0dc\ub97c \ucea1\uc290\ud654\ud558\ub294 \uc791\uc740 \ud074\ub798\uc2a4\ub97c \uc815\uc758\ud558\ub294 \ubc29\uc2dd<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kn\">from<\/span> <span class=\"nn\">collections<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">defaultdict<\/span>\n\n<span class=\"n\">before<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span><span class=\"s\">'A'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"s\">'C'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"s\">'D'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">5<\/span><span class=\"p\">}<\/span>\n<span class=\"n\">loop<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\n    <span class=\"p\">(<\/span><span class=\"s\">'A'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">),<\/span>\n    <span class=\"p\">(<\/span><span class=\"s\">'B'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">),<\/span>\n    <span class=\"p\">(<\/span><span class=\"s\">'E'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">6<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">]<\/span>\n\n<span class=\"k\">class<\/span> <span class=\"nc\">PreserveState<\/span><span class=\"p\">(<\/span><span class=\"nb\">object<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">count_num<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span>\n\n    <span class=\"k\">def<\/span> <span class=\"nf\">added_count<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">count_num<\/span> <span class=\"o\">+=<\/span> <span class=\"mi\">1<\/span>\n        <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'-- Added new value %d --'<\/span> <span class=\"o\">%<\/span> <span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">count_num<\/span><span class=\"p\">))<\/span>\n        <span class=\"k\">return<\/span> <span class=\"mi\">0<\/span>\n\n\n<span class=\"n\">preserve_state<\/span> <span class=\"o\">=<\/span> <span class=\"n\">PreserveState<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">after<\/span> <span class=\"o\">=<\/span> <span class=\"n\">defaultdict<\/span><span class=\"p\">(<\/span><span class=\"n\">preserve_state<\/span><span class=\"p\">.<\/span><span class=\"n\">added_count<\/span><span class=\"p\">,<\/span> <span class=\"n\">before<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">for<\/span> <span class=\"n\">k<\/span><span class=\"p\">,<\/span> <span class=\"n\">v<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">loop<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">after<\/span><span class=\"p\">[<\/span><span class=\"n\">k<\/span><span class=\"p\">]<\/span> <span class=\"o\">+=<\/span> <span class=\"n\">v<\/span>\n\n<span class=\"k\">assert<\/span> <span class=\"n\">preserve_state<\/span><span class=\"p\">.<\/span><span class=\"n\">count_num<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">2<\/span>\n\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"o\">--<\/span> <span class=\"n\">Added<\/span> <span class=\"n\">new<\/span> <span class=\"n\">value<\/span> <span class=\"mi\">1<\/span> <span class=\"o\">--<\/span>\n<span class=\"o\">--<\/span> <span class=\"n\">Added<\/span> <span class=\"n\">new<\/span> <span class=\"n\">value<\/span> <span class=\"mi\">2<\/span> <span class=\"o\">--<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\ud5ec\ud37c\ud074\ub798\uc2a4\ub97c \uc774\uc6a9\ud558\ub294 \ud3b8\uc774 \uc55e\uc11c \ub9d0\ud55c, \ud568\uc218\ud615\ud0dc\uc758 \ud074\ub85c\uc800\ubcf4\ub2e4 \uba85\ud655\ud558\ub2e4. \uadf8\ub7ec\ub098 \uc2e4\uc81c\ub85c \ud574\ub2f9 \ud568\uc218\uac00 \uc0ac\uc6a9\ub418\ub294 \uc608\ub97c \ubcf4\uae30 \uc804\uae4c\uc9c0 \ud074\ub798\uc2a4\uac00 \uc5b4\ub5a4\uc2dd\uc73c\ub85c \ub3d9\uc791\ud558\ub294 \uc720\ucd94\ud558\uae30 \uc5b4\ub835\ub2e4.<\/p>\n\n<p>\uc774\ub7f0 \uc0c1\ud669\uc5d0\uc11c \uc6b0\ub9ac\ub294 <code class=\"language-plaintext highlighter-rouge\">__call__<\/code> \uba54\uc11c\ub4dc\ub97c \uc774\uc6a9\ud55c\ub2e4. \ud574\ub2f9 \uba54\uc11c\ub4dc\ub294 \uac1d\uccb4\ub97c \ud568\uc218\ucc98\ub7fc \ud638\ucd9c\ud560 \uc218 \uc788\uac8c \ub9cc\ub4e4\uc5b4 \uc900\ub2e4.<\/p>\n\n<h2 id=\"\uc608\uc2dc-3-__call__-\uba54\uc11c\ub4dc\">\uc608\uc2dc 3. <code class=\"language-plaintext highlighter-rouge\">__call__<\/code> \uba54\uc11c\ub4dc<\/h2>\n<p>\ud574\ub2f9 \uba54\uc11c\ub4dc\ub294 \ucf54\ub4dc\ub97c \ucc98\uc74c\ubcf4\ub294 \uc0ac\ub78c\uc5d0\uac8c \ud074\ub798\uc2a4\uc758 \uc8fc\uc694 \ub85c\uc9c1\uc744 \ub2f4\uace0\uc788\ub294 <code class=\"language-plaintext highlighter-rouge\">entry point<\/code>\ub85c \uc548\ub0b4\ud558\ub294 \uc5ed\ud560\uc740 \ud558\uae30 \ub54c\ubb38\uc5d0, \ud574\ub2f9 \ud074\ub798\uc2a4\uac00 \uc0c1\ud0dc\ubcf4\uc874\uc744 \uc704\ud568\uc774\ub77c\ub294 \ud78c\ud2b8\ub97c \uc81c\uacf5\ud55c\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kn\">from<\/span> <span class=\"nn\">collections<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">defaultdict<\/span>\n\n<span class=\"n\">before<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span><span class=\"s\">'A'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"s\">'C'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"s\">'D'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">5<\/span><span class=\"p\">}<\/span>\n<span class=\"n\">loop<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\n    <span class=\"p\">(<\/span><span class=\"s\">'A'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">),<\/span>\n    <span class=\"p\">(<\/span><span class=\"s\">'B'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">),<\/span>\n    <span class=\"p\">(<\/span><span class=\"s\">'E'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">6<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">]<\/span>\n\n<span class=\"k\">class<\/span> <span class=\"nc\">PreserveState<\/span><span class=\"p\">(<\/span><span class=\"nb\">object<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">count_num<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span>\n\n    <span class=\"k\">def<\/span> <span class=\"nf\">__call__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span> <span class=\"c1\"># &lt;--  __call__\ub85c\ub9cc \ubc14\uafd4\uc8fc\uc5c8\ub2e4.\n<\/span>        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">count_num<\/span> <span class=\"o\">+=<\/span> <span class=\"mi\">1<\/span>\n        <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'-- Added new value %d --'<\/span> <span class=\"o\">%<\/span> <span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">count_num<\/span><span class=\"p\">))<\/span>\n        <span class=\"k\">return<\/span> <span class=\"mi\">0<\/span>\n\n\n<span class=\"n\">preserve_state<\/span> <span class=\"o\">=<\/span> <span class=\"n\">PreserveState<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">after<\/span> <span class=\"o\">=<\/span> <span class=\"n\">defaultdict<\/span><span class=\"p\">(<\/span><span class=\"n\">preserve_state<\/span><span class=\"p\">,<\/span> <span class=\"n\">before<\/span><span class=\"p\">)<\/span> <span class=\"c1\"># &lt;-- \ud638\ucd9c \uc2dc\uc5d0 \ub530\ub85c \ud568\uc218\ub97c \ud638\ucd9c\ud558\uc9c0 \uc54a\uace0, \uac1d\uccb4 \uc790\uc2e0\uc744 \ub123\uc5b4\uc8fc\uba74 \ub41c\ub2e4.\n<\/span><span class=\"k\">for<\/span> <span class=\"n\">k<\/span><span class=\"p\">,<\/span> <span class=\"n\">v<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">loop<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">after<\/span><span class=\"p\">[<\/span><span class=\"n\">k<\/span><span class=\"p\">]<\/span> <span class=\"o\">+=<\/span> <span class=\"n\">v<\/span>\n\n<span class=\"k\">assert<\/span> <span class=\"n\">preserve_state<\/span><span class=\"p\">.<\/span><span class=\"n\">count_num<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">2<\/span>\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"nb\">dict<\/span><span class=\"p\">(<\/span><span class=\"n\">after<\/span><span class=\"p\">))<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\uc0ac\uc6a9\uc131\uc801\uc778 \uba74\uc5d0\uc11c\ub3c4 <strong>\uc608\uc2dc2<\/strong> \ubcf4\ub2e4 \uac04\ub2e8\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc81c\uacf5\ud55c\ub2e4. \uc0c1\ud669\uc5d0 \ub9de\uac8c \uc54c\ub9de\uc740 \ubc29\ubc95\uc744 \ucc44\ud0dd\ud558\uc5ec \uad6c\ud604\ud558\uba74 \ub41c\ub2e4.<\/p>\n","pubDate":"Thu, 16 May 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-preserve-the-state-of-python-closure\/","guid":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-preserve-the-state-of-python-closure\/","category":["pythonic","closure","preserve","state","Pythonic"]},{"title":"Docker: \ub3c4\ucee4\ud30c\uc77c \uc81c\uc791 \uc2dc, \uae30\ubcf8 \ud301","description":"<h1 id=\"-\uba40\ud2f0\ud50c-\ub3c4\ucee4-\ud30c\uc77c\">* \uba40\ud2f0\ud50c \ub3c4\ucee4 \ud30c\uc77c<\/h1>\n<h2 id=\"\ub3c4\ucee4-\uc624\ubc84\ub77c\uc774\ub4dc-default\">\ub3c4\ucee4 \uc624\ubc84\ub77c\uc774\ub4dc (Default)<\/h2>\n<p>\ub3c4\ucee4 \ucef4\ud3ec\uc988\uac00 \ucef4\ud3ec\uc988 \ud30c\uc77c\uc744 \ub530\ub85c \uc81c\uc2dc\ud558\uc9c0 \uc54a\ub294 \uc774\uc0c1, <code class=\"language-plaintext highlighter-rouge\">docker-compose.yml<\/code>\uc744 \uc77d\ub294\ub2e4\ub294 \uac83\uc740 \ubaa8\ub450\ub2e4 \uc544\ub294 \uc0ac\uc2e4\uc774\ub2e4. \ud558\uc9c0\ub9cc \uc2e4\uc81c\ub85c \ub3c4\ucee4 \ucef4\ud3ec\uc988\ub294 \uae30\ubcf8\uc801\uc73c\ub85c \ub2e4\uc74c\uacfc \uac19\uc740 \uc21c\uc11c\ub85c <u>2\uac1c\uc758 \ud30c\uc77c<\/u>\uc744 \uc77d\ub294\ub2e4.<\/p>\n<ol>\n  <li><code class=\"language-plaintext highlighter-rouge\">docker-compose.yml<\/code><\/li>\n  <li><code class=\"language-plaintext highlighter-rouge\">docker-compose.override.yml<\/code> (optional)<\/li>\n<\/ol>\n\n<p><code class=\"language-plaintext highlighter-rouge\">docker-compose.override.yml<\/code>\uc740 \uc635\uc154\ub110\uc774\uba70, \uae30\ubcf8\uc801\uc73c\ub85c\ub294 <code class=\"language-plaintext highlighter-rouge\">docker-compose.yml<\/code>\uc5d0 \ubca0\uc774\uc2a4 \uc124\uc815\uc744 \ud558\uace0, \uc624\ubc84\ub77c\uc774\ub4dc \ud30c\uc77c\ud1b5\ud574\uc11c \ud574\ub2f9 \uc124\uc815\uc744 \ub36e\uc5b4\uc4f0\uac70\ub098 \uc0dd\uc131\ud55c\ub2e4. \uc8fc\ub85c \uac1c\ubc1c\ud658\uacbd\uacfc \ub514\ud50c\ub85c\uc774 \ud658\uacbd\uc744 \uad6c\ubd84\ud558\uae30 \uc704\ud574\uc11c \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n<!--more-->\n<h2 id=\"\uc608\uc2dc---\ub3c4\ucee4-\uc624\ubc84\ub77c\uc774\ub4dc-default\">\uc608\uc2dc - \ub3c4\ucee4 \uc624\ubc84\ub77c\uc774\ub4dc (Default)<\/h2>\n<p>\ud558\uae30 \ub450\uac1c\uc758 \ucef4\ud3ec\uc988\ud30c\uc77c\uc774 \ub3d9\uc77c\uc120\uc0c1\uc5d0 \uc788\uc744 \uacbd\uc6b0.<\/p>\n\n<h3 id=\"\uc608\uc2dc\ud30c\uc77c\">\uc608\uc2dc\ud30c\uc77c<\/h3>\n<ul>\n  <li><u>docker-compose.yml<\/u>\n    <div class=\"language-docker highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>version: '3'\nservices:\nbasic:\n  build:\n    context: .\n  command: echo 'hello from basic'\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li><u>docker-compose.override.yml<\/u>\n    <div class=\"language-docker highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>version: '3'\nservices:\noverride:\n  build:\n    context: .\n  command: echo 'hello from override'\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n<\/ul>\n\n<h3 id=\"\uc2e4\ud589\uacb0\uacfc\">\uc2e4\ud589\uacb0\uacfc<\/h3>\n<p><code class=\"language-plaintext highlighter-rouge\">docker-compose.yml<\/code>\uacfc <code class=\"language-plaintext highlighter-rouge\">docker-compose.override.yml<\/code>\uc774 \ud569\uccd0\uc9c4\ub2e4.<\/p>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>docker-compose config\nservices:\n  basic:\n    build:\n      context: \/Users\/hidekuma\/Documents\/private\n    <span class=\"nb\">command<\/span>: <span class=\"nb\">echo<\/span> <span class=\"s1\">'hello from basic'<\/span>\n  override:\n    build:\n      context: \/Users\/hidekuma\/Documents\/private\n    <span class=\"nb\">command<\/span>: <span class=\"nb\">echo<\/span> <span class=\"s1\">'hello from override'<\/span>\nversion: <span class=\"s1\">'3.0'<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h3 id=\"\ub9cc\uc57d--f\ucee4\ub9e8\ub4dc-\uc635\uc158\uc744-\uc0ac\uc6a9\ud560-\uacbd\uc6b0\">\ub9cc\uc57d <code class=\"language-plaintext highlighter-rouge\">-f<\/code>\ucee4\ub9e8\ub4dc \uc635\uc158\uc744 \uc0ac\uc6a9\ud560 \uacbd\uc6b0<\/h3>\n<p>\uc5bc\ud54f\ubcf4\uba74 \ub450 \ucee4\ub9e8\ub4dc\uac00  \ub3d9\uc77c\ud558\ub2e4\uace0 \uc0dd\uac01\ud560 \uc218 \uc788\uc73c\ub098, <code class=\"language-plaintext highlighter-rouge\">-f<\/code>\uc635\uc158\uc744 \uc0ac\uc6a9\ud558\uba74, \ud574\ub2f9 \ud30c\uc77c\ub9cc\uc744 \uc77d\uae30 \ub54c\ubb38\uc5d0 <code class=\"language-plaintext highlighter-rouge\">docker-compose.override.yml<\/code>\uc740 \uc77d\ud788\uc9c0 \uc54a\ub294\ub2e4.<\/p>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>docker-compose config <span class=\"c\"># docker-compose.yml + docker-compose.override.yml<\/span>\n<span class=\"nv\">$ <\/span>docker-compose <span class=\"nt\">-f<\/span> docker-compose.yml config <span class=\"c\"># docker-compose.yml<\/span>\n<\/code><\/pre><\/div><\/div>\n<hr \/>\n<h2 id=\"\ucee4\uc2a4\ud140-\ub3c4\ucee4-\uc624\ubc84\ub77c\uc774\ub4dc\">\ucee4\uc2a4\ud140 \ub3c4\ucee4 \uc624\ubc84\ub77c\uc774\ub4dc<\/h2>\n<p>\uae30\ubcf8\uc801\uc73c\ub85c \ub3c4\ucee4 \ucef4\ud3ec\uc988\uac00 \ud30c\uc77c\uc744 \uc77d\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc54c\uc544\ubd24\ub294\ub370, \uadf8\ub7ec\uba74 \uc6b0\ub9ac\ub294 \uaf2d \uc624\ubc84\ub77c\uc774\ub4dc \ud560 \ud30c\uc77c\uc744 <code class=\"language-plaintext highlighter-rouge\">docker-compose.override.yml<\/code>\ub85c \uc815\uc758\ud574\uc57c \ud560\uae4c? <strong>\ubc29\ubc95\uc740 \uc788\ub2e4. \uc704\uc5d0\uc11c \uc7a0\uc2dc \uac70\ub860\ud588\ub358 <code class=\"language-plaintext highlighter-rouge\">-f<\/code> \uc635\uc158\uc744 \uc0ac\uc6a9\ud558\uba74 \ub41c\ub2e4.<\/strong> \ud574\ub2f9 \uc635\uc158\uc740 \ub3c4\ucee4 \ucef4\ud3ec\uc988 \ud30c\uc77c\uc758 <code class=\"language-plaintext highlighter-rouge\">path<\/code>\ub97c \uc815\uc758\ud558\ub294 \uc635\uc158\uc774\ub2e4. \ud574\ub2f9 \uc635\uc158\uc740 <u>\ubcf5\uc218\ubc88<\/u> \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n<h2 id=\"\uc608\uc2dc---\ucee4\uc2a4\ud140-\ub3c4\ucee4-\uc624\ubc84\ub77c\uc774\ub4dc\">\uc608\uc2dc - \ucee4\uc2a4\ud140 \ub3c4\ucee4 \uc624\ubc84\ub77c\uc774\ub4dc<\/h2>\n<h3 id=\"\uc608\uc2dc\ud30c\uc77c-1\">\uc608\uc2dc\ud30c\uc77c<\/h3>\n<ul>\n  <li><u>docker-compose.test1.yml<\/u>\n    <div class=\"language-docker highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>version: '3'\nservices:\ntest1:\n  build:\n    context: .\n  command: echo 'hello from test1'\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li><u>docker-compose.test2.yml<\/u>\n    <div class=\"language-docker highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>version: '3'\nservices:\ntest2:\n  build:\n    context: .\n  command: echo 'hello from test2'\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li><u>docker-compose.test3.yml<\/u>\n    <div class=\"language-docker highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>version: '3'\nservices:\ntest3:\n  build:\n    context: .\n  command: echo 'hello from test3'\n<\/code><\/pre><\/div>    <\/div>\n    <h3 id=\"\uc2e4\ud589\uacb0\uacfc-1\">\uc2e4\ud589\uacb0\uacfc<\/h3>\n    <p><code class=\"language-plaintext highlighter-rouge\">-f<\/code>\uc635\uc158\uc744 \uc5ec\ub7ec \ubc88 \uc0ac\uc6a9\ud558\uc600\ub2e4. \ud558\ub2e8 \ucf54\ub4dc\uc758 \uacb0\uacfc\ub294<code class=\"language-plaintext highlighter-rouge\">docker-compose.test*.yml<\/code>\uc744 \ubaa8\ub450 \uc624\ubc84\ub77c\uc774\ub4dc \ud55c\ub2e4.<\/p>\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>docker-compose <span class=\"nt\">-f<\/span> docker-compose.test1.yml <span class=\"nt\">-f<\/span> docker-compose.test2.yml <span class=\"nt\">-f<\/span> docker-compose.test3.yml config\nservices:\ntest1:\n  build:\n    context: \/Users\/hidekuma\/Documents\/private\n  <span class=\"nb\">command<\/span>: <span class=\"nb\">echo<\/span> <span class=\"s1\">'hello from test1'<\/span>\ntest2:\n  build:\n    context: \/Users\/hidekuma\/Documents\/private\n  <span class=\"nb\">command<\/span>: <span class=\"nb\">echo<\/span> <span class=\"s1\">'hello from test2'<\/span>\ntest3:\n  build:\n    context: \/Users\/hidekuma\/Documents\/private\n  <span class=\"nb\">command<\/span>: <span class=\"nb\">echo<\/span> <span class=\"s1\">'hello from test3'<\/span>\nversion: <span class=\"s1\">'3.0'<\/span>\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n<\/ul>\n","pubDate":"Tue, 14 May 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/docker\/extend-services-in-compose\/","guid":"https:\/\/hidekuma.github.io\/docker\/extend-services-in-compose\/","category":["docker","docker-compose","Docker"]},{"title":"Pythonic: \ud30c\uc774\uc36c \ud5ec\ud37c\ud074\ub798\uc2a4","description":"<h1 id=\"-dict\uc640-tuple\ubcf4\ub2e4-class\ub97c-\uc0ac\uc6a9\ud574\uc57c-\ud560-\ub54c\">* dict\uc640 tuple\ubcf4\ub2e4 class\ub97c \uc0ac\uc6a9\ud574\uc57c \ud560 \ub54c<\/h1>\n<h2 id=\"\uc190-\uc26c\uc6b4-\uc0ac\uc6a9\uc740-\ucf54\ub4dc\ub97c-\ucde8\uc57d\ud558\uac8c-\ud55c\ub2e4\">\uc190 \uc26c\uc6b4 \uc0ac\uc6a9\uc740 \ucf54\ub4dc\ub97c \ucde8\uc57d\ud558\uac8c \ud55c\ub2e4<\/h2>\n<p>dict\ub294 \uac1d\uccb4\uc758 \uc218\uba85\uc774 \uc9c0\uc18d\ub418\ub294 \ub3d9\uc548 \uc608\uce21\ubd88\uac00\ub2a5\ud55c \uc2dd\ubcc4\uc790\ub4e4\uc744 \uad00\ub9ac\ud558\ub294 \uc6a9\ub3c4\ub85c \uc544\uc8fc \uc88b\ub2e4.<\/p>\n\n<h3 id=\"\uc608\uc2dc-1-\uc544\uc774\ud15c\uc744-\ub4dc\ub78d\ud558\ub294-\ubaac\uc2a4\ud130\">\uc608\uc2dc 1. \uc544\uc774\ud15c\uc744 \ub4dc\ub78d\ud558\ub294 \ubaac\uc2a4\ud130<\/h3>\n<p>\uc608\ub97c \ub4e4\uc5b4, \ub2e4\uc74c \ucf54\ub4dc\ub97c \ubd10\ubcf4\uc790. \ubaac\uc2a4\ud130 \ubcc4 \ub4dc\ub78d\ub418\ub294 \uc544\uc774\ud15c\uc744 \uc27d\uac8c \uc9c0\uc815\ud558\uace0 \uadf8 \uacb0\uacfc\ub97c \ubcfc \uc218\uc788\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kn\">import<\/span> <span class=\"nn\">random<\/span>\n\n<span class=\"k\">class<\/span> <span class=\"nc\">Monsters<\/span><span class=\"p\">(<\/span><span class=\"nb\">object<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_list<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{}<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">add_monster<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">name<\/span><span class=\"p\">):<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_list<\/span><span class=\"p\">[<\/span><span class=\"n\">name<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[]<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">set_drop<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"n\">item<\/span><span class=\"p\">):<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_list<\/span><span class=\"p\">[<\/span><span class=\"n\">name<\/span><span class=\"p\">].<\/span><span class=\"n\">append<\/span><span class=\"p\">(<\/span><span class=\"n\">item<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">drop<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">name<\/span><span class=\"p\">):<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">random<\/span><span class=\"p\">.<\/span><span class=\"n\">choice<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_list<\/span><span class=\"p\">[<\/span><span class=\"n\">name<\/span><span class=\"p\">])<\/span>\n\n<span class=\"n\">monsters<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Monsters<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">monsters<\/span><span class=\"p\">.<\/span><span class=\"n\">add_monster<\/span><span class=\"p\">(<\/span><span class=\"s\">'hidekuma'<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">monsters<\/span><span class=\"p\">.<\/span><span class=\"n\">set_drop<\/span><span class=\"p\">(<\/span><span class=\"s\">'hidekuma'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'sword'<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">monsters<\/span><span class=\"p\">.<\/span><span class=\"n\">set_drop<\/span><span class=\"p\">(<\/span><span class=\"s\">'hidekuma'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'shield'<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">monsters<\/span><span class=\"p\">.<\/span><span class=\"n\">drop<\/span><span class=\"p\">(<\/span><span class=\"s\">'hidekuma'<\/span><span class=\"p\">))<\/span>\n\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"n\">sword<\/span>\n<\/code><\/pre><\/div><\/div>\n<!--more-->\n\n<h3 id=\"\uc608\uc2dc-2-\uc544\uc774\ud15c\uc744-\ub4dc\ub78d\ud558\ub294-\uc18d\uc131\uc744-\uac00\uc9c4-\ubaac\uc2a4\ud130\">\uc608\uc2dc 2. \uc544\uc774\ud15c\uc744 \ub4dc\ub78d\ud558\ub294 \uc18d\uc131\uc744 \uac00\uc9c4 \ubaac\uc2a4\ud130<\/h3>\n<p>\ub9cc\uc57d \ubaac\uc2a4\ud130\uac00 \ucd94\ud6c4\uc5d0 \ub354 \ub9ce\uc740 property(ex: HP, MP, \uacbd\ud5d8\uce58 \ub4f1)\uc744 \uac00\uc9c4\ub2e4\uace0 \uac00\uc815\ud558\uace0, \ub4dc\ub78d\ud558\ub294 \uc544\uc774\ud15c\uc744 \ud558\ub098\uc758 \uc18d\uc131\uc73c\ub85c \uac04\uc8fc\ud558\uc5ec, \ub2e4\uc2dc \ub9cc\ub4e4\uc5b4\ubcf4\uc790.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kn\">import<\/span> <span class=\"nn\">random<\/span>\n\n<span class=\"k\">class<\/span> <span class=\"nc\">Monsters2<\/span><span class=\"p\">(<\/span><span class=\"nb\">object<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_list<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{}<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">add_monster<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">name<\/span><span class=\"p\">):<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_list<\/span><span class=\"p\">[<\/span><span class=\"n\">name<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{}<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">set_drop<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"n\">item<\/span><span class=\"p\">):<\/span>\n        <span class=\"n\">monster<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_list<\/span><span class=\"p\">[<\/span><span class=\"n\">name<\/span><span class=\"p\">]<\/span>\n        <span class=\"n\">drops<\/span> <span class=\"o\">=<\/span> <span class=\"n\">monster<\/span><span class=\"p\">.<\/span><span class=\"n\">setdefault<\/span><span class=\"p\">(<\/span><span class=\"s\">'drops'<\/span><span class=\"p\">,<\/span> <span class=\"p\">[])<\/span>\n        <span class=\"n\">drops<\/span><span class=\"p\">.<\/span><span class=\"n\">append<\/span><span class=\"p\">(<\/span><span class=\"n\">item<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">drop<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">name<\/span><span class=\"p\">):<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">random<\/span><span class=\"p\">.<\/span><span class=\"n\">choice<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_list<\/span><span class=\"p\">[<\/span><span class=\"n\">name<\/span><span class=\"p\">][<\/span><span class=\"s\">'drops'<\/span><span class=\"p\">])<\/span>\n\n<span class=\"n\">monsters<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Monsters2<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">monsters<\/span><span class=\"p\">.<\/span><span class=\"n\">add_monster<\/span><span class=\"p\">(<\/span><span class=\"s\">'hidekuma'<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">monsters<\/span><span class=\"p\">.<\/span><span class=\"n\">set_drop<\/span><span class=\"p\">(<\/span><span class=\"s\">'hidekuma'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'spear'<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">monsters<\/span><span class=\"p\">.<\/span><span class=\"n\">set_drop<\/span><span class=\"p\">(<\/span><span class=\"s\">'hidekuma'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'sword'<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">monsters<\/span><span class=\"p\">.<\/span><span class=\"n\">set_drop<\/span><span class=\"p\">(<\/span><span class=\"s\">'hidekuma'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'shield'<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">monsters<\/span><span class=\"p\">.<\/span><span class=\"n\">drop<\/span><span class=\"p\">(<\/span><span class=\"s\">'hidekuma'<\/span><span class=\"p\">))<\/span>\n\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"n\">shield<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\uc544\uc9c1\uae4c\uc9c4 \ucda9\ubd84\ud788 \uc9c1\uad00\uc801\uc774\ub2e4.<\/p>\n\n<h3 id=\"\uc608\uc2dc-3-\uc18d\uc131\uc744-\uac00\uc9c4-\uc544\uc774\ud15c\uc744-\ub4dc\ub78d\ud558\ub294-\uc18d\uc131\uc744-\uac00\uc9c4-\ubaac\uc2a4\ud130\">\uc608\uc2dc 3. \uc18d\uc131\uc744 \uac00\uc9c4 \uc544\uc774\ud15c\uc744 \ub4dc\ub78d\ud558\ub294 \uc18d\uc131\uc744 \uac00\uc9c4 \ubaac\uc2a4\ud130<\/h3>\n<p>\uac00\uc7a5 \uc548\ucabd \ub515\uc154\ub108\ub9ac\uc5d0 \uc544\uc774\ud15c\uacfc \ud30c\uc6cc \uadf8\ub9ac\uace0 \ub7ad\ud06c\ub97c \ub2f4\uc740 tuple\uc744 \ub9f5\ud551\ud558\uc600\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kn\">import<\/span> <span class=\"nn\">random<\/span>\n\n<span class=\"k\">class<\/span> <span class=\"nc\">Monsters3<\/span><span class=\"p\">(<\/span><span class=\"nb\">object<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_list<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{}<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">add_monster<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">name<\/span><span class=\"p\">):<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_list<\/span><span class=\"p\">[<\/span><span class=\"n\">name<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{}<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">set_drop<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"n\">item<\/span><span class=\"p\">,<\/span> <span class=\"n\">rank<\/span><span class=\"p\">,<\/span> <span class=\"n\">power<\/span><span class=\"p\">):<\/span>\n        <span class=\"n\">monster<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_list<\/span><span class=\"p\">[<\/span><span class=\"n\">name<\/span><span class=\"p\">]<\/span>\n        <span class=\"n\">drops<\/span> <span class=\"o\">=<\/span> <span class=\"n\">monster<\/span><span class=\"p\">.<\/span><span class=\"n\">setdefault<\/span><span class=\"p\">(<\/span><span class=\"s\">'drops'<\/span><span class=\"p\">,<\/span> <span class=\"p\">[])<\/span>\n        <span class=\"n\">drops<\/span><span class=\"p\">.<\/span><span class=\"n\">append<\/span><span class=\"p\">((<\/span><span class=\"n\">item<\/span><span class=\"p\">,<\/span> <span class=\"n\">rank<\/span><span class=\"p\">,<\/span> <span class=\"n\">power<\/span><span class=\"p\">))<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">drop<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">name<\/span><span class=\"p\">):<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">random<\/span><span class=\"p\">.<\/span><span class=\"n\">choice<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_list<\/span><span class=\"p\">[<\/span><span class=\"n\">name<\/span><span class=\"p\">][<\/span><span class=\"s\">'drops'<\/span><span class=\"p\">])<\/span>\n\n<span class=\"n\">monsters<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Monsters3<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">monsters<\/span><span class=\"p\">.<\/span><span class=\"n\">add_monster<\/span><span class=\"p\">(<\/span><span class=\"s\">'hidekuma'<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">monsters<\/span><span class=\"p\">.<\/span><span class=\"n\">set_drop<\/span><span class=\"p\">(<\/span><span class=\"s\">'hidekuma'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'C'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'spear'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">monsters<\/span><span class=\"p\">.<\/span><span class=\"n\">set_drop<\/span><span class=\"p\">(<\/span><span class=\"s\">'hidekuma'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'B'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'sword'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">12<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">monsters<\/span><span class=\"p\">.<\/span><span class=\"n\">set_drop<\/span><span class=\"p\">(<\/span><span class=\"s\">'hidekuma'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'A'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'shield'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">17<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">monsters<\/span><span class=\"p\">.<\/span><span class=\"n\">drop<\/span><span class=\"p\">(<\/span><span class=\"s\">'hidekuma'<\/span><span class=\"p\">))<\/span>\n\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"p\">(<\/span><span class=\"s\">'A'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'shield'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">17<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\uc774\uc81c \ud638\ucd9c \uc2dc\uc5d0\ub3c4 \ucc98\uc74c\uc5d0 \ube44\ud574 \uc704\uce58 \uc778\uc218\ub4e4\uc774 \ub9ce\uc544\uc84c\uace0, \uc810\uc810 \ubcf5\uc7a1\ud574\uc9c0\uae30 \uc2dc\uc791\ud558\uc600\ub2e4. \ucc98\uc74c\uc5d0\ub294 \ub2e8\uc21c\ud788 \ubaac\uc2a4\ud130\uc758 \ub4dc\ub78d \uc544\uc774\ud15c\uc744 \ub098\ud0c0\ub0b4\uae30 \uc704\ud55c \ub515\uc154\ub108\ub9ac \uc600\uc9c0\ub9cc, \ucd94\ud6c4\uc5d0 \uc18d\uc131\uacfc \uae30\ub2a5\uc774 \ucd94\uac00 \ub420 \uc218\ub85d \uc720\uc9c0\ubcf4\uc218\uc758 \ub2aa\uc5d0 \ube60\uc9c0\uac8c \ub420 \uac83\uc774\ub2e4.<\/p>\n\n<p>\uc9c0\uae08\ucc98\ub7fc \uacc4\uce35\uc774 \ud55c \ub2e8\uacc4\uac00 \ub118\ub294 \uc911\ucca9\uc740 \ud53c\ud558\ub294 \uac83\uc774 \ubc14\ub78c\uc9c1\ud558\uba70, \ucea1\uc290\ud654\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc81c\uacf5\ud558\uae30 \uc704\ud574\uc11c \uc774\ub7f0 \uc0c1\ud669\uc5d0\uc120 \uc989\uc2dc \ud074\ub798\uc2a4\ub85c \uc62e\uaca8\uac00\uc57c\ud55c\ub2e4.<\/p>\n\n<h2 id=\"\ub450-\ub2e8\uacc4-\uc774\uc0c1\uc758-\uacc4\uce35-\uad6c\uc870\ub294-\ud074\ub798\uc2a4\ub85c-\uad6c\ud604\ud558\uc790\">\ub450 \ub2e8\uacc4 \uc774\uc0c1\uc758 \uacc4\uce35 \uad6c\uc870\ub294 \ud074\ub798\uc2a4\ub85c \uad6c\ud604\ud558\uc790<\/h2>\n<p>\uba3c\uc800 \uc544\uc774\ud15c\uc5d0\ub294 \uacf5\uaca9\ub825 \uc678\uc5d0\ub3c4 \uacf5\uaca9 \uc18d\ub3c4, \ucd94\uac00 \ubc84\ud504\ub4e4\uc774 \ubd99\uc5ec\uc9c8 \uac00\ub2a5\uc131\uc774 \ub9e4\uc6b0\ud06c\ub2e4. \ub530\ub77c\uc11c, \ud29c\ud50c\uc758 \uc544\uc774\ud15c\uc774 \ub450 \uac1c\uac00 \ub118\uc5b4\uac08 \uac00\ub2a5\uc131\uc774 \ub9e4\uc6b0 \ud070\ub370, \uc774\ub7f0 \uc694\uad6c\uc5d0 \uc815\ud655\ud788 \ubd80\ud569\ud558\ub294 \uac83\uc774 \ubc14\ub85c <code class=\"language-plaintext highlighter-rouge\">namedtuple<\/code>\uc774\ub2e4.<\/p>\n\n<h3 id=\"immutable-data-class\">Immutable data class<\/h3>\n<p>namedtuple\uc740 \uc704\uce58 \uc778\uc218\ub098 \ud0a4\uc6cc\ub4dc \uc778\uc218\ub85c \uc0dd\uc131\uac00\ub2a5\ud558\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kn\">import<\/span> <span class=\"nn\">collections<\/span>\n<span class=\"n\">Item<\/span> <span class=\"o\">=<\/span> <span class=\"n\">collections<\/span><span class=\"p\">.<\/span><span class=\"n\">namedtuple<\/span><span class=\"p\">(<\/span><span class=\"s\">'Item'<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"s\">'rank'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'name'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'power'<\/span><span class=\"p\">))<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h3 id=\"collectionsnamedtuple\">collections.namedtuple<\/h3>\n<ul>\n  <li>namedtuple\uc740 \ud0a4\uc6cc\ub4dc \uc778\uc218\ub85c \uc0dd\uc131\uac00\ub2a5 \ud558\ub098, \uae30\ubcf8\uac12\uc744 \uc124\uc815\ud560 \uc218 \uc5c6\ub2e4. \ub530\ub77c\uc11c \ub370\uc774\ud130\uc758 \uc120\ud0dd\uc801\uc778 \uc18d\uc131\uc774 \ub9ce\uc544\uc9c0\uba74 \ub2e4\ub8e8\uae30 \ud798\ub4e4\uc5b4\uc9c4\ub2e4.<\/li>\n  <li>namedtuple\uc740 \uc5ec\uc804\ud788 \uc22b\uc790\ub85c \ub41c \uc778\ub371\uc2a4\uc640 \uc774\ud130\ub808\uc774\ud130 \ubc29\ubc95\uc73c\ub85c \uc21c\ud68c\uac00\ub2a5\ud558\ub098, \uc0c1\ud669\uc5d0 \ub530\ub77c\uc120 \uc758\ub3c4\uc640 \ub2e4\ub974\uac8c \uc0ac\uc6a9\ub420 \uc218\ub3c4 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc0ac\uc6a9\uc5d0 \ud56d\uc0c1 \uc8fc\uc758\ud55c\ub2e4.\n:::<\/li>\n<\/ul>\n\n<h3 id=\"\uc608\uc2dc-4-\ud074\ub798\uc2a4-\ub9ac\ud329\ud1a0\ub9c1\">\uc608\uc2dc 4. \ud074\ub798\uc2a4 \ub9ac\ud329\ud1a0\ub9c1<\/h3>\n<p>\ucf54\ub4dc\ub294 \uc774\uc804\ubcf4\ub2e4 \uae38\uc5b4\uc84c\uc9c0\ub9cc, \ud638\ucd9c\ubd80\uac00 \ud6e8\uc52c \uc774\ud574\ud558\uae30 \uc27d\uace0 \uc608\uc81c\ub3c4 \uba85\ud655\ud558\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kn\">import<\/span> <span class=\"nn\">random<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">collections<\/span>\n\n<span class=\"n\">Item<\/span> <span class=\"o\">=<\/span> <span class=\"n\">collections<\/span><span class=\"p\">.<\/span><span class=\"n\">namedtuple<\/span><span class=\"p\">(<\/span><span class=\"s\">'Item'<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"s\">'rank'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'name'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'power'<\/span><span class=\"p\">))<\/span>\n\n<span class=\"k\">class<\/span> <span class=\"nc\">Drops<\/span><span class=\"p\">(<\/span><span class=\"nb\">object<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_items<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[]<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">set_drop<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">rank<\/span><span class=\"p\">,<\/span> <span class=\"n\">item<\/span><span class=\"p\">,<\/span> <span class=\"n\">power<\/span><span class=\"p\">):<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_items<\/span><span class=\"p\">.<\/span><span class=\"n\">append<\/span><span class=\"p\">(<\/span><span class=\"n\">Item<\/span><span class=\"p\">(<\/span><span class=\"n\">rank<\/span><span class=\"p\">,<\/span> <span class=\"n\">item<\/span><span class=\"p\">,<\/span> <span class=\"n\">power<\/span><span class=\"p\">))<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">drop<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\n        <span class=\"k\">if<\/span> <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_items<\/span><span class=\"p\">:<\/span>\n            <span class=\"k\">return<\/span> <span class=\"n\">random<\/span><span class=\"p\">.<\/span><span class=\"n\">choice<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_items<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">else<\/span><span class=\"p\">:<\/span>\n            <span class=\"k\">raise<\/span> <span class=\"nb\">NotImplementedError<\/span>\n\n<span class=\"k\">class<\/span> <span class=\"nc\">Monster<\/span><span class=\"p\">(<\/span><span class=\"nb\">object<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">name<\/span><span class=\"p\">):<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_name<\/span> <span class=\"o\">=<\/span> <span class=\"n\">name<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_drops<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Drops<\/span><span class=\"p\">()<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">__str__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\n        <span class=\"k\">return<\/span> <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_name<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">drops<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\n        <span class=\"k\">return<\/span> <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_drops<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">drop<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\n        <span class=\"k\">return<\/span> <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_drops<\/span><span class=\"p\">.<\/span><span class=\"n\">drop<\/span><span class=\"p\">()<\/span>\n\n<span class=\"k\">class<\/span> <span class=\"nc\">Monsters<\/span><span class=\"p\">(<\/span><span class=\"nb\">object<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_list<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{}<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">monster<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">name<\/span><span class=\"p\">):<\/span>\n        <span class=\"k\">if<\/span> <span class=\"n\">name<\/span> <span class=\"ow\">not<\/span> <span class=\"ow\">in<\/span> <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_list<\/span><span class=\"p\">:<\/span>\n            <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_list<\/span><span class=\"p\">[<\/span><span class=\"n\">name<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Monster<\/span><span class=\"p\">(<\/span><span class=\"n\">name<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">return<\/span> <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_list<\/span><span class=\"p\">[<\/span><span class=\"n\">name<\/span><span class=\"p\">]<\/span>\n\n<span class=\"n\">monsters<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Monsters<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">hidekuma<\/span> <span class=\"o\">=<\/span> <span class=\"n\">monsters<\/span><span class=\"p\">.<\/span><span class=\"n\">monster<\/span><span class=\"p\">(<\/span><span class=\"s\">'hidekuma'<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">drops<\/span> <span class=\"o\">=<\/span> <span class=\"n\">hidekuma<\/span><span class=\"p\">.<\/span><span class=\"n\">drops<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">drops<\/span><span class=\"p\">.<\/span><span class=\"n\">set_drop<\/span><span class=\"p\">(<\/span><span class=\"s\">'A'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'sword'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">17<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">hidekuma<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">hidekuma<\/span><span class=\"p\">.<\/span><span class=\"n\">drop<\/span><span class=\"p\">())<\/span>\n\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"n\">hidekuma<\/span>\n<span class=\"n\">Item<\/span><span class=\"p\">(<\/span><span class=\"n\">rank<\/span><span class=\"o\">=<\/span><span class=\"s\">'A'<\/span><span class=\"p\">,<\/span> <span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"s\">'sword'<\/span><span class=\"p\">,<\/span> <span class=\"n\">power<\/span><span class=\"o\">=<\/span><span class=\"mi\">17<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"\uc694\uc57d\">\uc694\uc57d<\/h2>\n<ul>\n  <li>\uc911\ucca9\ub41c \ub515\uc154\ub108\ub9ac\ub098 \uae34 \ud29c\ud50c\uc740 \uba40\ub9ac\ud558\uc790<\/li>\n<\/ul>\n","pubDate":"Fri, 10 May 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-helper-class\/","guid":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-helper-class\/","category":["pythonic","class","Pythonic"]},{"title":"Python: asyncio\ub97c \ub354 \ube60\ub974\uac8c \ub9cc\ub4dc\ub294 uvloop \uc0b4\ud3b4\ubcf4\uae30","description":"<h1 id=\"-uvloop\">* uvloop<\/h1>\n<p>uvloop\ub294 asyncio\uc758 \uc774\ubca4\ud2b8 \ub8e8\ud504 \ub300\uccb4\uc7ac\ub85c,  asyncio\ub97c \ub354 \ube60\ub974\uac8c \ub9cc\ub4e4\uace0,  nodejs, gevent \ubc0f \ub2e4\ub978 python \ud504\ub808\uc784\uc6cc\ud06c\uc640 \ube44\uad50\ud574\ubd10\ub3c4, 2\ubc30\uc774\uc0c1\uc758 \ud37c\ud3ec\uba3c\uc2a4\ub97c \ubcf4\uc5ec\uc900\ub2e4.<\/p>\n\n<p class=\"notice--info\"><strong>tip<\/strong><br \/>\npython3.5 \ubd80\ud130 \ud30c\uc774\uc36c \ud45c\uc900 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0 \ucd94\uac00\ub41c asyncio\ub294 \ube44\ub3d9\uae30 I\/O \ud504\ub808\uc784\uc6cc\ud06c\uc774\ub2e4.<\/p>\n\n<h2 id=\"asyncio--uvloop\">asyncio &amp; uvloop<\/h2>\n<p>asnycio\ub294 \ub124\ud2b8\uc6cc\ud06c \uc804\uc1a1, \ud504\ub85c\ud1a0\ucf5c \ubc0f \uc2a4\ud2b8\ub9bc \ucd94\uc0c1\ud654 \uceec\ub809\uc158\uacfc \uc774\ubca4\ud2b8 \ub8e8\ud504 \uae30\ub2a5\uc774 \uc788\uc73c\uba70, \uc774\ubca4\ud2b8 \ub8e8\ud504\ub294 asyncio\uc758 \ud575\uc2ec\uc774\ub2e4. asyncio\uc758 \uc8fc\uc694\uae30\ub2a5\ub4e4\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<ul>\n  <li>\uc2a4\ucf00\uc904\ub9c1\uc5d0 \uc758\ud55c \ud638\ucd9c<\/li>\n  <li>\ub124\ud2b8\uc6cc\ud06c\ub97c \ud1b5\ud55c \ub370\uc774\ud130 \uc804\uc1a1<\/li>\n  <li>DNS \ucffc\ub9ac\uc218\ud589<\/li>\n  <li>OS \uc2e0\ud638 \ud578\ub4e4\ub9c1<\/li>\n  <li>\uc11c\ubc84\uc640 \ucee4\ub125\uc158\uc744 \ub9cc\ub4dc\ub294 \ud3b8\ub9ac\ud55c \ucd94\uc0c1\ud654<\/li>\n  <li>\ube44\ub3d9\uae30\uc801 \uc11c\ube0c\ud504\ub85c\uc138\uc2a4\n<!--more--><\/li>\n<\/ul>\n\n<p>uvloop\ub294 asyncio\uc758 \ub0b4\uc7a5 \uc774\ubca4\ud2b8 \ub8e8\ud504\ub97c \ub300\uccb4\ud558\uba70 \uc124\uce58\ubc29\ubc95 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>pip <span class=\"nb\">install <\/span>uvloop\n<\/code><\/pre><\/div><\/div>\n<p>asyncio \ucf54\ub4dc\uc5d0 uvloop\ub97c \uc811\ubaa9\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kn\">import<\/span> <span class=\"nn\">asyncio<\/span><span class=\"p\">,<\/span> <span class=\"n\">uvloop<\/span>\n<span class=\"n\">asyncio<\/span><span class=\"p\">.<\/span><span class=\"n\">set_event_loop_policy<\/span><span class=\"p\">(<\/span><span class=\"n\">uvloop<\/span><span class=\"p\">.<\/span><span class=\"n\">EventLoopPolicy<\/span><span class=\"p\">())<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\ud574\ub2f9 \ucf54\ub4dc\ub294 <code class=\"language-plaintext highlighter-rouge\">asyncio.get_event_loop()<\/code>\ub97c \ud638\ucd9c\ud558\uba74, uvloop\uc758 \uc778\uc2a4\ud134\uc2a4\ub97c \ub9ac\ud134\ud558\uac8c \ub9cc\ub4e0\ub2e4.<\/p>\n\n<h2 id=\"\uc544\ud0a4\ud14d\ucc98\">\uc544\ud0a4\ud14d\ucc98<\/h2>\n<p>uvloop\ub294 <a href=\"http:\/\/libuv.org\/\">libuv<\/a>\ub97c \uae30\ubc18\uc73c\ub85c Cython\uc73c\ub85c \uc791\uc131\ub418\uc5c8\ub2e4.\nlibuv\ub294 nodejs\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \uace0\uc131\ub2a5 \uba40\ud2f0 \ud50c\ub7ab\ud3fc \ube44\ub3d9\uae30 I \/ O \ub77c\uc774\ube0c\ub7ec\ub9ac\uc774\uba70, \ube60\ub974\uace0 \uc548\uc815\uc801\uc774\ub2e4. nodej\uac00 \uc778\uae30\ub97c \uc5bb\uace0 \ub110\ub9ac \ubcf4\uae09\ub41c \uc774\uc720\uac00 libuv \ub355\ubd84\uc774\ub77c\uace0 \ud574\ub3c4 \uacfc\uc5b8\uc774 \uc544\ub2c8\ub2e4.<\/p>\n\n<h2 id=\"\ubca4\uce58\ub9c8\ud06c\">\ubca4\uce58\ub9c8\ud06c<\/h2>\n<h3 id=\"tcp-\ubca4\uce58\ub9c8\ud06c\">TCP \ubca4\uce58\ub9c8\ud06c<\/h3>\n<ul>\n  <li>\uacf5\ud1b5\uc870\uac74\n    <ul>\n      <li>Intel Xeon CPU E5-1620 v2 @ 3.70GHz<\/li>\n      <li>Ubuntu Linux<\/li>\n      <li>1, 10, 100 KiB \ud06c\uae30\uc758 \uba54\uc2dc\uc9c0<\/li>\n      <li>\ub3d9\uc2dc\uc131\uc218\uc900: 10<\/li>\n      <li>\ub7ec\ub2dd\ud0c0\uc784 : 30s<\/li>\n    <\/ul>\n  <\/li>\n  <li>asyncio, uvloop\n    <ul>\n      <li>Python 3.5<\/li>\n    <\/ul>\n  <\/li>\n  <li>Go\n    <ul>\n      <li>GOMAXPROCS = 1<\/li>\n      <li><code class=\"language-plaintext highlighter-rouge\">net.Conn.Read\/Write<\/code> \ud638\ucd9c<\/li>\n    <\/ul>\n  <\/li>\n  <li>nodejs\n    <ul>\n      <li>No cluster<\/li>\n      <li>v4.2.6<\/li>\n    <\/ul>\n  <\/li>\n<\/ul>\n\n<h3 id=\"tcp-\ubca4\uce58\ub9c8\ud06c-\uacb0\uacfc\">TCP \ubca4\uce58\ub9c8\ud06c \uacb0\uacfc<\/h3>\n<p><img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/uvloop\/tcp-perf.png\" alt=\"image-center\" class=\"align-center\" \/><\/p>\n\n<h3 id=\"http-\ubca4\uce58\ub9c8\ud06c\">HTTP \ubca4\uce58\ub9c8\ud06c<\/h3>\n<ul>\n  <li>\uc870\uac74\n    <ul>\n      <li>\ub3d9\uc2dc\uc131\uc218\uc900: 300<\/li>\n      <li>\ub7ec\ub2dd\ud0c0\uc784: 30s<\/li>\n    <\/ul>\n  <\/li>\n<\/ul>\n\n<h3 id=\"http-\ubca4\uce58\ub9c8\ud06c-\uacb0\uacfc\">HTTP \ubca4\uce58\ub9c8\ud06c \uacb0\uacfc<\/h3>\n<p><img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/uvloop\/http-perf.png\" alt=\"image-center\" class=\"align-center\" \/><\/p>\n\n<p>\uace0\uc131\ub2a5 HTTP\ud30c\uc11c\uc758 \ub3c4\uc6c0\uc744 \ubc1b\ub294 asyncio\ub294 \ub3d9\uc77c\ud55c HTTP\ud30c\uc11c\ub97c \uc774\uc6a9\ud558\ub294 nodejs\ubcf4\ub2e4 \ube60\ub974\ub2e4. \uc2ec\uc9c0\uc5b4 uvloop\ub97c \ud0d1\uc7ac\ud560 \uacbd\uc6b0, nodejs\uc758 \uc57d 2\ubc30,  Go\uc640 \ube44\uc2b7\ud55c \uc218\uc900\uc758 \ud37c\ud3ec\uba3c\uc2a4\ub97c \ubcf4\uc5ec\uc8fc\uba70 \uc11c\ube44\uc2a4 \ud488\uc9c8\uc740 \ub9e4\uc6b0 \uc6b0\uc218\ud558\ub2e4\uace0 \ud560 \uc218 \uc788\ub2e4.<\/p>\n\n<p>httptools \uae30\ubc18 \uc11c\ubc84\ub294 \ub2e4\ub978 \uad6c\ud604\uacfc \ub2ec\ub9ac \ub77c\uc6b0\ud305 \ub85c\uc9c1\uc744 \ud3ec\ud568\ud558\uc9c0 \uc54a\uc544 \ub9e4\uc6b0 \ubbf8\ud761\ud558\ub098, \ud574\ub2f9 \ubca4\uce58 \ub9c8\ud06c\ub294 \ud6a8\uc728\uc801\uc73c\ub85c \uad6c\ud604 \ub41c \ud504\ub85c\ud1a0\ucf5c\ub85c uvloop\uac00 \uc5bc\ub9c8\ub098 \ube60\ub97c \uc218 \uc788\ub294\uc9c0 \ubcf4\uc5ec\uc8fc\uace0 \uc788\ub2e4. \ud574\ub2f9 <u>\ubca4\uce58\ub9c8\ud06c\uc5d0 \uc601\uac10\uc744 \ubc1b\uc544 \ud0c4\uc0dd\ud55c Python \uc6f9\ud504\ub808\uc784\uc6cc\ud06c\uac00 \ubc14\ub85c **Sanic**<\/u>\uc774\ub2e4.<\/p>\n\n<p class=\"notice--info\"><strong>aiohttp<\/strong><br \/>\naiohttp\ub294 \ube44\ub3d9\uae30 HTTP \uc11c\ubc84\ub97c asyncio\ub97c \uc0ac\uc6a9\ud558\uc5ec \uad6c\ud604\ud560 \ub54c \uac00\uc7a5 \ub9ce\uc774 \uc0ac\uc6a9\ub418\ub294 \ud504\ub808\uc784\uc6cc\ud06c\uc774\ub098, HTTP parser\ub54c\ubb38\uc5d0 \uc131\ub2a5 \ubcd1\ubaa9 \ud604\uc0c1\uc774 \ubc1c\uc0dd\ud558\uc600\ub2e4. \ud574\ub2f9 \ubd80\ubd84\uc744 \ucc98\ub9ac\ud558\uae30 \uc704\ud574, Nginx \uc6a9\uc73c\ub85c \uac1c\ubc1c \ub41c nodejs HTTP \ud30c\uc11c C \ub77c\uc774\ube0c\ub7ec\ub9ac\uc778 httptools\ub97c \uc774\uc6a9\ud558\uc600\ub2e4.<\/p>\n\n<h2 id=\"\ub808\ud37c\ub7f0\uc2a4\">\ub808\ud37c\ub7f0\uc2a4<\/h2>\n<ul>\n  <li><a href=\"https:\/\/magic.io\/blog\/uvloop-blazing-fast-python-networking\/\">uvloop: Blazing fast Python networking<\/a><\/li>\n<\/ul>\n","pubDate":"Tue, 07 May 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/python\/uvloop\/","guid":"https:\/\/hidekuma.github.io\/python\/uvloop\/","category":["uvloop","asyncio","Python"]},{"title":"Pythonic: \ud30c\uc774\uc36c\uc758 \ud0a4\uc6cc\ub4dc \uc804\uc6a9\uc778\uc218","description":"<h1 id=\"-\ud0a4\uc6cc\ub4dc-\uc804\uc6a9\uc778\uc218\">* \ud0a4\uc6cc\ub4dc \uc804\uc6a9\uc778\uc218<\/h1>\n<p>\ud30c\uc774\uc36c \ubfd0\ub9cc\uc544\ub2c8\ub77c \ub9ce\uc740 \uc5b8\uc5b4\uc5d0\uc11c \uc6b0\ub9ac\ub294 \ub2f9\uc5f0\ud55c\ub4ef \uc790\uc8fc \uc0ac\uc6a9\ud558\ub294 \ubd80\ubd84\uc77c \uac83\uc774\ub2e4. \ud0a4\uc6cc\ub4dc \uc778\uc218\ub97c \ud1b5\ud574 \uc6b0\ub9ac\ub294 \ud568\uc218\uc758 \uba85\ub8cc\uc131\uc744 \uac15\uc870\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n<h2 id=\"\uc704\uce58-\uc778\uc218\ub9cc\uc744-\uc774\uc6a9\ud55c-\ud568\uc218\">\uc704\uce58 \uc778\uc218\ub9cc\uc744 \uc774\uc6a9\ud55c \ud568\uc218<\/h2>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">def<\/span> <span class=\"nf\">say<\/span><span class=\"p\">(<\/span><span class=\"n\">msg<\/span><span class=\"p\">,<\/span> <span class=\"n\">delimiter<\/span><span class=\"p\">,<\/span> <span class=\"n\">user<\/span><span class=\"p\">):<\/span>\n  <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'{user} say {delimiter} {msg}'<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">msg<\/span><span class=\"o\">=<\/span><span class=\"n\">msg<\/span><span class=\"p\">,<\/span> <span class=\"n\">delimiter<\/span><span class=\"o\">=<\/span><span class=\"n\">delimiter<\/span><span class=\"p\">,<\/span> <span class=\"n\">user<\/span><span class=\"o\">=<\/span><span class=\"n\">user<\/span><span class=\"p\">))<\/span>\n\n<span class=\"n\">say<\/span><span class=\"p\">(<\/span><span class=\"s\">'test'<\/span><span class=\"p\">,<\/span> <span class=\"s\">':'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'unknown'<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">say<\/span><span class=\"p\">(<\/span><span class=\"s\">'test'<\/span><span class=\"p\">,<\/span> <span class=\"s\">':'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'hidekuma'<\/span><span class=\"p\">)<\/span>\n\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"n\">unknown<\/span> <span class=\"n\">say<\/span> <span class=\"p\">:<\/span> <span class=\"n\">test<\/span>\n<span class=\"n\">hidekuma<\/span> <span class=\"n\">say<\/span> <span class=\"p\">:<\/span> <span class=\"n\">test<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\ud06c\uac8c \uc5b4\ub835\uc9c0 \uc54a\uac8c \uc774\ud574\ud560 \uc218 \uc788\ub294 \ucf54\ub4dc\uc774\ub2e4. \ubb38\uc81c\ub294 \uc704\uce58\uc778\uc218 \ubaa8\ub450 <code class=\"language-plaintext highlighter-rouge\">str<\/code> \ud0c0\uc785\uc744 \ubc1b\uae30 \ub54c\ubb38\uc5d0, \uc778\uc218\uc758 \uc704\uce58\ub97c \ud63c\ub3d9\ud558\uae30 \uc27d\ub2e4\ub294 \uac83\uc774\ub2e4.\n\uc774 \ub54c\ubb38\uc5d0 \ud568\uc218\uc758 \ub0b4\uc6a9\uc774 \ubcf5\uc7a1\ud574\uc9c0\uba74 \ubcf5\uc7a1\ud574\uc9c8 \uc218\ub85d, \ucc3e\uae30 \uc5b4\ub824\uc6b4 \ubc84\uadf8\uac00 \uc27d\uac8c \ubc1c\uc0dd\ud560 \uc218\uc788\ub2e4. \ud574\ub2f9 \ucf54\ub4dc\uc758 \uac00\ub3c5\uc131\uc744 \ub192\uc5ec\ubcf4\uc790.<\/p>\n\n<!--more-->\n<h2 id=\"\ud0a4\uc6cc\ub4dc-\uc778\uc218\ub97c-\uc774\uc6a9\ud55c-\ud568\uc218\">\ud0a4\uc6cc\ub4dc \uc778\uc218\ub97c \uc774\uc6a9\ud55c \ud568\uc218<\/h2>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">def<\/span> <span class=\"nf\">say<\/span><span class=\"p\">(<\/span><span class=\"n\">msg<\/span><span class=\"p\">,<\/span> <span class=\"n\">delimiter<\/span><span class=\"p\">,<\/span> <span class=\"n\">user<\/span><span class=\"o\">=<\/span><span class=\"s\">'unknown'<\/span><span class=\"p\">):<\/span>\n  <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'{user} say {delimiter} {msg}'<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">msg<\/span><span class=\"o\">=<\/span><span class=\"n\">msg<\/span><span class=\"p\">,<\/span> <span class=\"n\">delimiter<\/span><span class=\"o\">=<\/span><span class=\"n\">delimiter<\/span><span class=\"p\">,<\/span> <span class=\"n\">user<\/span><span class=\"o\">=<\/span><span class=\"n\">user<\/span><span class=\"p\">))<\/span>\n  \n<span class=\"n\">say<\/span><span class=\"p\">(<\/span><span class=\"s\">'test'<\/span><span class=\"p\">,<\/span> <span class=\"s\">':'<\/span><span class=\"p\">)<\/span> <span class=\"c1\"># \ub514\ud3f4\ud2b8 \uac12\uc744 \uc0ac\uc6a9\ud558\uc5ec \ud638\ucd9c \n<\/span><span class=\"n\">say<\/span><span class=\"p\">(<\/span><span class=\"s\">'test'<\/span><span class=\"p\">,<\/span> <span class=\"s\">':'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'wabi'<\/span><span class=\"p\">)<\/span> <span class=\"c1\"># \ud0a4\uc6cc\ub4dc \uc778\uc218\uc774\ub098 \uc704\uce58 \uc778\uc218\ub85c \uba85\uc2dc\ud558\uc5ec \ud638\ucd9c --&gt; \uba85\ub8cc\uc131 \uba74\uc5d0\uc11c \ud070 \uba54\ub9ac\ud2b8\uac00 \uc5c6\uc74c.\n<\/span><span class=\"n\">say<\/span><span class=\"p\">(<\/span><span class=\"s\">'test'<\/span><span class=\"p\">,<\/span> <span class=\"s\">':'<\/span><span class=\"p\">,<\/span> <span class=\"n\">user<\/span><span class=\"o\">=<\/span><span class=\"s\">'hidekuma'<\/span><span class=\"p\">)<\/span> <span class=\"c1\"># \ud0a4\uc6cc\ub4dc \uc778\uc218\ub97c \uba85\uc2dc\ud558\uc5ec \ud638\ucd9c\n<\/span>\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"n\">unknown<\/span> <span class=\"n\">say<\/span> <span class=\"p\">:<\/span> <span class=\"n\">test<\/span>\n<span class=\"n\">wabi<\/span> <span class=\"n\">say<\/span> <span class=\"p\">:<\/span> <span class=\"n\">test<\/span>\n<span class=\"n\">hidekuma<\/span> <span class=\"n\">say<\/span> <span class=\"p\">:<\/span> <span class=\"n\">test<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\uc544\uc8fc \uc775\uc219\ud55c \ud615\ud0dc\uc758 \ud568\uc218\uc77c \uac83\uc774\ub2e4. \ud558\uc9c0\ub9cc \ubb38\uc81c\ub294 \uc788\ub2e4. \uc0c1\uae30 \uc608\uc2dc\ucc98\ub7fc \ud0a4\uc6cc\ub4dc \uc778\uc218\uac00 \uc120\ud0dd\uc801\uc73c\ub85c \uc0ac\uc6a9\ub418\uae30 \ub54c\ubb38\uc5d0, \uc5ec\uc804\ud788 \uc704\uce58 \uc778\uc218 \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ub420 \uc218 \uc788\ub2e4\ub294 \uac83\uc774\ub2e4.\n\uc989, \ud638\ucd9c\ubd80\uc5d0\uc11c \ud0a4\uc6cc\ub4dc \uc778\uc218\ub85c \ud638\ucd9c \uc758\ub3c4\ub97c \uba85\ud655\ud558\uac8c \ub4dc\ub7ec\ub0b4\uc9c0 \uc54a\uace0\ub294 \uc704\uc5d0\uc11c \uc5b8\uae09\ud588\ub358 \uba85\ub8cc\uc131\uc5d0 \ud070 \uba54\ub9ac\ud2b8\uac00 \uc5c6\ub2e4\ub294 \uac83\uc774\ub2e4.<\/p>\n\n<p>\ubcf5\uc7a1\ud55c \ud568\uc218\ub97c \uc791\uc131\ud558\uba74 \ud560 \uc218\ub85d, \ud638\ucd9c\ud558\ub294 \ucabd\uc5d0\uc11c \uc758\ub3c4\ub97c \uba85\ud655\ud558\uac8c \ub4dc\ub7ec\ub0b4\ub3c4\ub85d \ud568\uc218 \uc791\uc131\ub2e8\uc5d0\uc11c \uac15\uc81c\uc131\uc744 \ubd80\uc5ec\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.<\/p>\n\n<h2 id=\"\ud0a4\uc6cc\ub4dc-\uc804\uc6a9\uc778\uc218\ub97c-\uc774\uc6a9\ud55c-\ud568\uc218-python3\">\ud0a4\uc6cc\ub4dc \uc804\uc6a9\uc778\uc218\ub97c \uc774\uc6a9\ud55c \ud568\uc218 (Python3)<\/h2>\n<p>\ud30c\uc774\uc36c 3\uc5d0\uc11c\ub294 <code class=\"language-plaintext highlighter-rouge\">Keyword-only argument<\/code>\ub85c \ud568\uc218 \ud638\ucd9c \uc2dc, <strong>\ud0a4\uc6cc\ub4dc \uc778\uc218<\/strong>\ub85c\ub9cc \ub118\uae38 \uc218 \uc788\uac8c \uac15\uc81c\uc131\uc744 \ubd80\uc5ec\ud560 \uc218 \uc788\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">def<\/span> <span class=\"nf\">say<\/span><span class=\"p\">(<\/span><span class=\"n\">msg<\/span><span class=\"p\">,<\/span> <span class=\"n\">delimiter<\/span><span class=\"p\">,<\/span> <span class=\"o\">*<\/span><span class=\"p\">,<\/span> <span class=\"n\">user<\/span><span class=\"o\">=<\/span><span class=\"s\">'unknown'<\/span><span class=\"p\">):<\/span> <span class=\"c1\"># &lt;-- \uc704\uce58 \uc778\uc218\uc640 \ud0a4\uc6cc\ub4dc \uc778\uc218 \uc0ac\uc774\uc5d0 *\ub85c \uad6c\ubd84\ud55c\ub2e4.\n<\/span>  <span class=\"c1\"># ...                                  \n<\/span>\n<span class=\"n\">say<\/span><span class=\"p\">(<\/span><span class=\"s\">'test'<\/span><span class=\"p\">,<\/span> <span class=\"s\">':'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'hidekuma'<\/span><span class=\"p\">)<\/span> <span class=\"c1\"># \ud0a4\uc6cc\ub4dc \uc778\uc218\uc774\ub098 \uc704\uce58 \uc778\uc218\ub85c \uba85\uc2dc\ud558\uc5ec \ud638\ucd9c \uc2dc\n<\/span>\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"nb\">TypeError<\/span><span class=\"p\">:<\/span> <span class=\"n\">say<\/span><span class=\"p\">()<\/span> <span class=\"n\">takes<\/span> <span class=\"mi\">2<\/span> <span class=\"n\">positional<\/span> <span class=\"n\">arguments<\/span> <span class=\"n\">but<\/span> <span class=\"mi\">3<\/span> <span class=\"n\">were<\/span> <span class=\"n\">given<\/span> \n<\/code><\/pre><\/div><\/div>\n<p>\uc774\uc81c \ud574\ub2f9 \ucf54\ub4dc\ub294 \uc704\uce58 \uc778\uc218\ub85c\ub294 \ub3d9\uc791\ud558\uc9c0 \uc54a\uc73c\uba70, \ud0a4\uc6cc\ub4dc \uc778\uc218\ub85c\ub9cc \uae30\ub300\ud55c \uacb0\uacfc\ub97c \uc5bb\uc744 \uc218 \uc788\ub2e4.<\/p>\n\n<h2 id=\"\ud0a4\uc6cc\ub4dc-\uc804\uc6a9\uc778\uc218\ub97c-\uc774\uc6a9\ud55c-\ud568\uc218-python2\">\ud0a4\uc6cc\ub4dc \uc804\uc6a9\uc778\uc218\ub97c \uc774\uc6a9\ud55c \ud568\uc218 (Python2)<\/h2>\n<p>\uc0c1\uae30 \uc124\uba85\ud55c \ud0a4\uc6cc\ub4dc \uc804\uc6a9 \uc778\uc218\ub294 <code class=\"language-plaintext highlighter-rouge\">python2<\/code>\uc5d0\uc11c\ub294 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294\ub2e4. \ud558\uc9c0\ub9cc, \ub2e4\uc74c\uacfc \uac19\uc740 \ubc29\ubc95\uc73c\ub85c \uc5b4\ub290\uc815\ub3c4 \ud749\ub0b4 \ub0bc \uc218 \uc788\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">def<\/span> <span class=\"nf\">say<\/span><span class=\"p\">(<\/span><span class=\"n\">msg<\/span><span class=\"p\">,<\/span> <span class=\"n\">delimiter<\/span><span class=\"p\">,<\/span> <span class=\"o\">**<\/span><span class=\"n\">kwargs<\/span><span class=\"p\">):<\/span>\n  <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"n\">kwargs<\/span><span class=\"p\">.<\/span><span class=\"n\">pop<\/span><span class=\"p\">(<\/span><span class=\"s\">'user'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'unknown'<\/span><span class=\"p\">)<\/span>\n  <span class=\"k\">if<\/span> <span class=\"n\">kwargs<\/span><span class=\"p\">:<\/span>\n    <span class=\"k\">raise<\/span> <span class=\"nb\">TypeError<\/span><span class=\"p\">(<\/span><span class=\"s\">'Unexpected **kwargs: %r'<\/span> <span class=\"o\">%<\/span> <span class=\"n\">kwargs<\/span><span class=\"p\">)<\/span>\n    \n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'{user} say {delimiter} {msg}'<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">msg<\/span><span class=\"o\">=<\/span><span class=\"n\">msg<\/span><span class=\"p\">,<\/span> <span class=\"n\">delimiter<\/span><span class=\"o\">=<\/span><span class=\"n\">delimiter<\/span><span class=\"p\">,<\/span> <span class=\"n\">user<\/span><span class=\"o\">=<\/span><span class=\"n\">user<\/span><span class=\"p\">))<\/span>\n  \n<span class=\"n\">say<\/span><span class=\"p\">(<\/span><span class=\"s\">'test'<\/span><span class=\"p\">,<\/span> <span class=\"s\">':'<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">say<\/span><span class=\"p\">(<\/span><span class=\"s\">'test'<\/span><span class=\"p\">,<\/span> <span class=\"s\">':'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'wabi'<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">say<\/span><span class=\"p\">(<\/span><span class=\"s\">'test'<\/span><span class=\"p\">,<\/span> <span class=\"s\">':'<\/span><span class=\"p\">,<\/span> <span class=\"n\">user<\/span><span class=\"o\">=<\/span><span class=\"s\">'hidekuma'<\/span><span class=\"p\">)<\/span>\n\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"n\">unknown<\/span> <span class=\"n\">say<\/span> <span class=\"p\">:<\/span> <span class=\"n\">test<\/span> \n<span class=\"nb\">TypeError<\/span><span class=\"p\">:<\/span> <span class=\"n\">say<\/span><span class=\"p\">()<\/span> <span class=\"n\">takes<\/span> <span class=\"mi\">2<\/span> <span class=\"n\">positional<\/span> <span class=\"n\">arguments<\/span> <span class=\"n\">but<\/span> <span class=\"mi\">3<\/span> <span class=\"n\">were<\/span> <span class=\"n\">given<\/span> \n<span class=\"n\">hidekuma<\/span> <span class=\"n\">say<\/span> <span class=\"p\">:<\/span> <span class=\"n\">test<\/span> \n<\/code><\/pre><\/div><\/div>\n","pubDate":"Sat, 27 Apr 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-keyword-only-args\/","guid":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-keyword-only-args\/","category":["pythonic","kwargs","Pythonic"]},{"title":"Pythonic: \ud30c\uc774\uc36c\uc758 \uac00\ubcc0 \uc704\uce58 \uc778\uc218","description":"<h1 id=\"-\uac00\ubcc0-\uc704\uce58-\uc778\uc218\">* \uac00\ubcc0 \uc704\uce58 \uc778\uc218<\/h1>\n<h2 id=\"\uc120\ud0dd\uc801-\uc704\uce58-\uc778\uc218\">\uc120\ud0dd\uc801 \uc704\uce58 \uc778\uc218<\/h2>\n<p>\uad00\ub840\uc801\uc73c\ub85c <code class=\"language-plaintext highlighter-rouge\">*args<\/code> \ud639\uc740 <code class=\"language-plaintext highlighter-rouge\">star args<\/code>\ub77c\uace0 \ud55c\ub2e4. \ud574\ub2f9 \uc704\uce58 \uc778\uc218\ub97c \ud1b5\ud574 \ud568\uc218 \ud638\ucd9c\uc744 \uba85\ud655\ud788 \ud560 \uc218 \uc788\ub2e4.  \ub2e4\uc74c <a href=\"#\uc608\uc2dc1\">\uc608\uc2dc1<\/a>\uc744 \ubd10\ubcf4\uc790. \ud638\ucd9c \ub2e8\uc5d0\uc11c \uba87 \uac00\uc9c0 \ubb38\uc81c\uc810\uc774 \ubcf4\uc5ec\uc9c8 \uac83\uc774\ub2e4.<\/p>\n\n<h3 id=\"\uc608\uc2dc1\">\uc608\uc2dc1<\/h3>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">def<\/span> <span class=\"nf\">printt<\/span><span class=\"p\">(<\/span><span class=\"n\">inputs<\/span><span class=\"p\">):<\/span>\n    <span class=\"n\">prt<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'Nope'<\/span> \n    <span class=\"k\">if<\/span> <span class=\"n\">inputs<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">prt<\/span> <span class=\"o\">=<\/span> <span class=\"s\">' '<\/span><span class=\"p\">.<\/span><span class=\"n\">join<\/span><span class=\"p\">(<\/span><span class=\"nb\">str<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">)<\/span> <span class=\"k\">for<\/span> <span class=\"n\">x<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">inputs<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">prt<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">printt<\/span><span class=\"p\">([<\/span><span class=\"s\">'args'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'must'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'be'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'included'<\/span><span class=\"p\">])<\/span>\n<span class=\"n\">printt<\/span><span class=\"p\">([])<\/span> <span class=\"c1\"># \uad73\uc774 \ube48 \ub9ac\uc2a4\ud2b8\ub97c \ub123\uc5b4\uc918\uc57c \ud55c\ub2e4.\n<\/span><span class=\"n\">printt<\/span><span class=\"p\">()<\/span> <span class=\"c1\"># \uc5d0\ub7ec\ubc1c\uc0dd.\n<\/span>\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"n\">args<\/span> <span class=\"n\">must<\/span> <span class=\"n\">be<\/span> <span class=\"n\">included<\/span>\n<span class=\"n\">Nope<\/span>\n<span class=\"nb\">TypeError<\/span><span class=\"p\">:<\/span> <span class=\"n\">printt<\/span><span class=\"p\">()<\/span> <span class=\"n\">takes<\/span> <span class=\"n\">exactly<\/span> <span class=\"mi\">1<\/span> <span class=\"n\">argument<\/span> <span class=\"p\">(<\/span><span class=\"mi\">0<\/span> <span class=\"n\">given<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\ud574\ub2f9 \ucf54\ub4dc\uac19\uc740 \uacbd\uc6b0 \uad73\uc774 \ud504\ub9b0\ud2b8 \ud560 \ub370\uc774\ud130\uac00 \uc5c6\ub2e4 \ud574\ub3c4 \ube48 \ub9ac\uc2a4\ud2b8\ub97c \ub123\uc5b4\uc8fc\uc9c0 \uc54a\uc73c\uba74, \ub9c8\uc9c0\ub9c9\ucc98\ub7fc \uc5d0\ub7ec\uac00 \ub09c\ub2e4. \ud574\ub2f9 \ucf54\ub4dc\ub97c \uc120\ud0dd\uc801 \uc704\uce58 \uc778\uc218\ub85c \uc774\uc6a9\ud574\ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n<!--more-->\n<h3 id=\"\uc608\uc2dc2\">\uc608\uc2dc2<\/h3>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">def<\/span> <span class=\"nf\">printt<\/span><span class=\"p\">(<\/span><span class=\"o\">*<\/span><span class=\"n\">inputs<\/span><span class=\"p\">):<\/span> <span class=\"c1\"># &lt;-- * \uc744 \uc778\uc218 \uc55e\uc5d0 \ubd99\uc5ec\uc90c.\n<\/span>    <span class=\"n\">prt<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'Nope'<\/span> \n    <span class=\"k\">if<\/span> <span class=\"n\">inputs<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">prt<\/span> <span class=\"o\">=<\/span> <span class=\"s\">' '<\/span><span class=\"p\">.<\/span><span class=\"n\">join<\/span><span class=\"p\">(<\/span><span class=\"nb\">str<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">)<\/span> <span class=\"k\">for<\/span> <span class=\"n\">x<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">inputs<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">prt<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">printt<\/span><span class=\"p\">(<\/span><span class=\"s\">'args'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'must'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'be'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'included'<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">printt<\/span><span class=\"p\">()<\/span> <span class=\"c1\"># \uc5d0\ub7ec\ubc1c\uc0dd \uc548\ud568.\n<\/span>\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"n\">args<\/span> <span class=\"n\">must<\/span> <span class=\"n\">be<\/span> <span class=\"n\">included<\/span>\n<span class=\"n\">Nope<\/span>\n<\/code><\/pre><\/div><\/div>\n<p><code class=\"language-plaintext highlighter-rouge\">*<\/code>\ub97c \uc778\uc218\uc5d0 \ubd99\uc778 \uac83 \ub9d0\uace0\ub294 \ud568\uc218 \ubcf8\ubb38\uc744 \uc218\uc815\ud560 \ud544\uc694 \uc5c6\uace0, \uc778\uc218\ub294 \uc120\ud0dd\uc801\uc73c\ub85c \ub118\uaca8\uc8fc\uba74\uc11c \ud568\uc218 \ud638\ucd9c\ubd80\uac00 \uae54\ub054\ud574\uc84c\ub2e4. \ud639\uc2dc\ub098 \uc5ec\uae30\uc11c <u>\uad73\uc774 \ub9ac\uc2a4\ud2b8\ub97c \uc778\uc218\ub85c \ub123\uc5b4\uc8fc\uace0 \uc2f6\ub2e4\uba74<\/u> \ubc29\ubc95\uc740 \uc788\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">input_list<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"s\">'args'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'must'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'be'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'included'<\/span><span class=\"p\">]<\/span>\n<span class=\"n\">printt<\/span><span class=\"p\">(<\/span><span class=\"o\">*<\/span><span class=\"n\">input_list<\/span><span class=\"p\">)<\/span> <span class=\"c1\"># &lt;-- \uc774\ub807\uac8c \uc54c\ub824\uc900\ub2e4.\n<\/span>\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"n\">args<\/span> <span class=\"n\">must<\/span> <span class=\"n\">be<\/span> <span class=\"n\">included<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\ud558\uc9c0\ub9cc, \uc0c1\uae30 \ucf54\ub4dc\uc5d0\uc11c input_list\uac00 \uc81c\ub108\ub808\uc774\ud130\uc600\ub2e4\uba74 \uc5b4\ub5a8\uae4c.<\/p>\n\n<h3 id=\"\uc608\uc2dc3\">\uc608\uc2dc3<\/h3>\n<p>\uc81c\ub108\ub808\uc774\ud130 \uc0dd\uc131\ubc95\uc744 \ubaa8\ub978\ub2e4\uba74, <a href=\"\/pythonic\/generator.html#\uc81c\ub108\ub808\uc774\ud130\">\ud574\ub2f9 \ubb38\uc11c<\/a>\ub97c \ucc38\uace0\ud55c\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">input_gen<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">x<\/span> <span class=\"k\">for<\/span> <span class=\"n\">x<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">range<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">))<\/span>\n\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">input_gen<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">printt<\/span><span class=\"p\">(<\/span><span class=\"o\">*<\/span><span class=\"n\">input_gen<\/span><span class=\"p\">)<\/span>\n\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"o\">&lt;<\/span><span class=\"n\">generator<\/span> <span class=\"nb\">object<\/span> <span class=\"o\">&lt;<\/span><span class=\"n\">genexpr<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">at<\/span> <span class=\"mh\">0x107f06a50<\/span><span class=\"o\">&gt;<\/span>\n<span class=\"mi\">0<\/span> <span class=\"mi\">1<\/span> <span class=\"mi\">2<\/span> <span class=\"mi\">3<\/span> <span class=\"mi\">4<\/span> <span class=\"mi\">5<\/span> <span class=\"mi\">6<\/span> <span class=\"mi\">7<\/span> <span class=\"mi\">8<\/span> <span class=\"mi\">9<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\uc81c\ub108\ub808\uc774\ud130 \ub610\ud55c \ubb38\uc81c\uc5c6\uc774 \ub3d9\uc791\uc740 \ud558\uc9c0\ub9cc, \ubbf8\ub9ac \uc120\uc5b8\ub41c <a href=\"#\uc608\uc2dc2\">\uc608\uc2dc2<\/a>\uc758 \ub9ac\uc2a4\ud2b8\uc640 \ub2ec\ub9ac, \ud574\ub2f9 \ucf54\ub4dc\ub294 \uc81c\ub108\ub808\uc774\ud130\ub85c\ubd80\ud130 \uc0dd\uc131\ub41c \ubaa8\ub4e0 \uac12\uc744 \ud29c\ud50c\ub85c \ub2f4\uc73c\ubbc0\ub85c \uba54\ubaa8\ub9ac \uc810\uc720\uc728\uc774 \uae09\uaca9\ud558\uac8c \uc0c1\uc2b9\ud560 \uc218 \uc788\ub294 \ubb38\uc81c\uc810\uc774 \uc788\ub2e4. \ub530\ub77c\uc11c, <code class=\"language-plaintext highlighter-rouge\">*args<\/code>\ub97c \ubc1b\ub294 \ud568\uc218\ub294 \uc778\uc218 \ub9ac\uc2a4\ud2b8\uac00 \uc5b4\ub290 \uc815\ub3c4 \uc801\uc815\uc120\uc774\ub77c\ub294 \uc810\uc5d0\uc11c \uc801\ud569\ud55c \ubc29\ubc95\uc774\ub2e4.<\/p>\n\n<p class=\"notice--info\"><strong>\uc81c\ub108\ub808\uc774\ud130\uc5d0 * \uac00 \uc758\ubbf8\ud558\ub294 \uac83\uc740?<\/strong><br \/>\n\uc81c\ub108\ub808\uc774\ud130\uac00 \uc18c\uc9c4 \ub420 \ub54c\uae4c\uc9c0 \uc21c\ud68c\ud568\uc744 \uc758\ubbf8\ud55c\ub2e4. \uacb0\uacfc\ub294 \ud29c\ud50c\ub85c \ub2f4\uae34\ub2e4.<\/p>\n","pubDate":"Fri, 26 Apr 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-star-args\/","guid":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-star-args\/","category":["pythonic","args","Pythonic"]},{"title":"Pythonic: \uc774\ud130\ub808\uc774\ud130 \uc54c\uc544\ubcf4\uae30","description":"<h1 id=\"-\uc774\ud130\ub808\uc774\ud130\uc758-\ud2b9\ubcc4\ud55c-\ud2b9\uc9d5\">* \uc774\ud130\ub808\uc774\ud130\uc758 \ud2b9\ubcc4\ud55c \ud2b9\uc9d5<\/h1>\n<h2 id=\"\uc18c\uc9c4\uc131\">\uc18c\uc9c4\uc131<\/h2>\n<p>\uc81c\ub108\ub808\uc774\ud130\uac00 \ubc18\ud658\ud55c \uc774\ud130\ub808\uc774\ud130\ub294 \ud638\ucd9c \ub418\uba74, <code class=\"language-plaintext highlighter-rouge\">StopItreration Exception<\/code>\uc744 \uc77c\uc73c\ud0a8 \ud6c4 \ub370\uc774\ud130\uac00 \uc18c\uc9c4\ub41c\ub2e4.<\/p>\n\n<h3 id=\"\uc608\uc2dc1\">\uc608\uc2dc1<\/h3>\n<p>\uc81c\ub108\ub808\uc774\ud130\ub97c \uc0dd\uc131\ud558\ub294 \ud568\uc218\uc774\uba70, \ub9ac\ud134\ubc1b\uc740 \uc774\ud130\ub808\uc774\ud130\ub97c \ub9ac\uc2a4\ud2b8\ub85c \ub9cc\ub4e0\ub2e4(\uc21c\ud68c\uc2dc\ud0a8\ub2e4).<\/p>\n\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">def<\/span> <span class=\"nf\">generated_data<\/span><span class=\"p\">():<\/span>\n    <span class=\"k\">for<\/span> <span class=\"n\">i<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">range<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">):<\/span>\n        <span class=\"k\">yield<\/span> <span class=\"n\">i<\/span>\n<span class=\"n\">result<\/span> <span class=\"o\">=<\/span> <span class=\"n\">generated_data<\/span><span class=\"p\">()<\/span>\n\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">result<\/span><span class=\"p\">)<\/span> <span class=\"c1\"># \uc81c\ub108\ub808\uc774\ud130 \uc0dd\uc131\ud655\uc778\n<\/span><span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"nb\">list<\/span><span class=\"p\">(<\/span><span class=\"n\">result<\/span><span class=\"p\">))<\/span> <span class=\"c1\"># \uc81c\ub108\ub808\uc774\ud130 \uccab\ubc88\uc9f8 \uc21c\ud68c - \uc774\ud130\ub808\uc774\ud130 \uc21c\ud68c (StopIteation)\n<\/span>\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"o\">&lt;<\/span><span class=\"n\">generator<\/span> <span class=\"nb\">object<\/span> <span class=\"n\">generated_data<\/span> <span class=\"n\">at<\/span> <span class=\"mh\">0x102402be0<\/span><span class=\"o\">&gt;<\/span>\n<span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">,<\/span> <span class=\"mi\">6<\/span><span class=\"p\">,<\/span> <span class=\"mi\">7<\/span><span class=\"p\">,<\/span> <span class=\"mi\">8<\/span><span class=\"p\">,<\/span> <span class=\"mi\">9<\/span><span class=\"p\">]<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\uc5ec\uae30\uc11c \ud55c\ubc88 \ub354 \ud638\ucd9c\ud574\ubcf8\ub2e4.<\/p>\n\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"nb\">list<\/span><span class=\"p\">(<\/span><span class=\"n\">result<\/span><span class=\"p\">))<\/span> <span class=\"c1\"># \uc81c\ub108\ub808\uc774\ud130\uc758 \ub450\ubc88\uc9f8 \uc21c\ud68c - \uc774\ud130\ub808\uc774\ud130 \uc774\ubbf8 \uc18c\uc9c4\n<\/span>\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"p\">[]<\/span> <span class=\"c1\"># \ube48 list\n<\/span><\/code><\/pre><\/div><\/div>\n<p>\uc81c\ub108\ub808\uc774\ud130\uc758 \ubc18\ud658 \uac12\uc5d0 \uc544\ubb34\ub7f0 \uacb0\uacfc\ub3c4 \uc0dd\uc131\ub418\uc9c0 \uc54a\ub294\ub2e4. \uc774\ub7f0 \ud2b9\uc9d5\uc744 \uc77c\ud68c\uc131(\uc18c\uc9c4\uc131)\uc774\ub77c\uace0 \ud55c\ub2e4. \uc774\ub7ec\ud55c \uc18c\uc9c4\uc131\uc744 \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c\ub294 \uc81c\ub108\ub808\uc774\ud130\uc5d0\uc11c \ubc18\ud658\ud55c \uc774\ud130\ub808\uc774\ud130\ub97c \uc0c8\ub85c\uc6b4 \ubcc0\uc218\uc5d0 \ud560\ub2f9\ud558\uc5ec, \ubcf5\uc0ac\ud574\uc57c\ud55c\ub2e4.\n<!--more--><\/p>\n\n<h3 id=\"\uc608\uc2dc2\">\uc608\uc2dc2<\/h3>\n<p><strong>\uc608\uc2dc1<\/strong>\uacfc \uac19\uc740 \ucf54\ub4dc\uc774\ub098 \uacb0\uacfc\uac12\uc744 \ubcf5\uc0ac\ud558\uc600\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">def<\/span> <span class=\"nf\">generated_data<\/span><span class=\"p\">():<\/span>\n    <span class=\"k\">for<\/span> <span class=\"n\">i<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">range<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">):<\/span>\n        <span class=\"k\">yield<\/span> <span class=\"n\">i<\/span>\n<span class=\"n\">result<\/span> <span class=\"o\">=<\/span> <span class=\"n\">generated_data<\/span><span class=\"p\">()<\/span>\n\n<span class=\"n\">result_copy<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">list<\/span><span class=\"p\">(<\/span><span class=\"n\">result<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">result_copy<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">result_copy<\/span><span class=\"p\">)<\/span>\n\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">,<\/span> <span class=\"mi\">6<\/span><span class=\"p\">,<\/span> <span class=\"mi\">7<\/span><span class=\"p\">,<\/span> <span class=\"mi\">8<\/span><span class=\"p\">,<\/span> <span class=\"mi\">9<\/span><span class=\"p\">]<\/span>\n<span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">,<\/span> <span class=\"mi\">6<\/span><span class=\"p\">,<\/span> <span class=\"mi\">7<\/span><span class=\"p\">,<\/span> <span class=\"mi\">8<\/span><span class=\"p\">,<\/span> <span class=\"mi\">9<\/span><span class=\"p\">]<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\ucf54\ub4dc\uac00 \uc798 \ub3d9\uc791\ud558\uc9c0\ub9cc, \uc774\ub807\uac8c \ud558\ub294 \ubc29\ubc95\uc740 \ucc98\uc74c\ubd80\ud130 \ub9ac\uc2a4\ud2b8\ub97c \ub9cc\ub4dc\ub294 \uac83\uacfc \ud37c\ud3ec\uba3c\uc2a4 \uc801\uc73c\ub85c \ud070 \uae30\ub300\ub97c \ud560 \uc218 \uc5c6\ub2e4. \ud2b9\ud788, \uc785\ub825\ubc1b\uc740 \ub370\uc774\ud130\uac00 \ud06c\ub2e4\uba74 \ub354\uc6b1\uc774 \ubb38\uc81c\uc774\ub2e4.<\/p>\n\n<h2 id=\"\uc774\ud130\ub808\uc774\ud130-\ud504\ub85c\ud1a0\ucf5c\">\uc774\ud130\ub808\uc774\ud130 \ud504\ub85c\ud1a0\ucf5c<\/h2>\n<p><code class=\"language-plaintext highlighter-rouge\">Iterator protocol<\/code>\uc740 <code class=\"language-plaintext highlighter-rouge\">for<\/code>\ubb38\uacfc \uac19\uc740 \ud30c\uc774\uc36c \ud45c\ud604\uc2dd\uc774 \ucf58\ud150\uce20(\ucee8\ud14c\uc774\ub108 \ud0c0\uc785)\ub97c \ud0d0\uc0c9\ubc29\ubc95\uc774\ub2e4.<\/p>\n\n<p>\uc608\ub97c \ub4e4\uc5b4, \ud30c\uc774\uc36c\uc774 <code class=\"language-plaintext highlighter-rouge\">for<\/code>\ubb38\uc744 \ud574\uc11d\ud560 \ub54c, \uacb0\uacfc\uc801\uc73c\ub85c\ub294 \uc785\ub825\uac12\uc758 <code class=\"language-plaintext highlighter-rouge\">__iter__<\/code>\ub97c \ud638\ucd9c\ud55c\ub2e4. \uc880 \ub354 \uc790\uc138\ud55c \ud750\ub984\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<ol>\n  <li><code class=\"language-plaintext highlighter-rouge\">for x in x_list<\/code> \ud574\uc11d\uc2dc\uc791<\/li>\n  <li><code class=\"language-plaintext highlighter-rouge\">iter(x_list)<\/code> \ub0b4\uc7a5\ud568\uc218 \uc2e4\ud589<\/li>\n  <li><code class=\"language-plaintext highlighter-rouge\">x_list.__iter__<\/code> \ud638\ucd9c<\/li>\n  <li><code class=\"language-plaintext highlighter-rouge\">__iter__<\/code>\ub294 \uc774\ud130\ub808\uc774\ud130 \uac1d\uccb4\ub97c \ubc18\ud658<\/li>\n<\/ol>\n\n<p>\ub530\ub77c\uc11c <code class=\"language-plaintext highlighter-rouge\">for<\/code>\ubb38\uc758 \uc785\ub825\uac12\uc5d0 \uc774\ud130\ub808\uc774\ud130\uac00 \uc544\ub2cc \ub370\uc774\ud130 \ud0c0\uc785\uc744 \ub123\uac8c \ub418\uba74, \uc6b0\ub9ac\ub294 \uc885\uc885 \ub2e4\uc74c\uacfc \uac19\uc740 \uc5d0\ub7ec\ub97c \ub9c8\uc8fc\ud558\uac8c \ub41c\ub2e4.<\/p>\n\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nb\">TypeError<\/span><span class=\"p\">:<\/span> <span class=\"s\">'int'<\/span> <span class=\"nb\">object<\/span> <span class=\"ow\">is<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">iterable<\/span>\n<\/code><\/pre><\/div><\/div>\n<p class=\"notice--info\"><strong>for \ubb38\uc758 \uc6d0\ub9ac<\/strong><br \/>\uc989, \uc6b0\ub9ac\uac00 \uc790\uc8fc \uc0ac\uc6a9\ud558\ub294 for \ubb38\uc758 \uc6d0\ub9ac\ub294 __iter__\uc5d0\uac8c\uc11c \ubc18\ud658\ub41c \uc774\ud130\ub808\uc774\ud130\uac00 StopItreration Exception\uc774 \uc77c\uc5b4\ub0a0\ub54c \uae4c\uc9c0 \uc774\ud130\ub808\uc774\ud130\uc758 next()\ub97c \uacc4\uc18d \ud638\ucd9c\ud55c\ub2e4.<\/p>\n\n<h2 id=\"\uc774\ud130\ub7ec\ube14iterable\uc21c\ud68c\uae30\ub2a5-\uad6c\ud604\">\uc774\ud130\ub7ec\ube14(iterable:\uc21c\ud68c\uae30\ub2a5) \uad6c\ud604<\/h2>\n<p><strong>\uc608\uc2dc2<\/strong>\ub97c \ub2e8\uc810\uc744 \ud574\uacb0\ud558\uace0\uc790 \uae30\ub2a5\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \ucee8\ud14c\uc774\ub108 \ud0c0\uc785\uc73c\ub85c \uad6c\ud604\ud55c\ub2e4.<\/p>\n\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">class<\/span> <span class=\"nc\">generator_data<\/span><span class=\"p\">(<\/span><span class=\"nb\">object<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">length<\/span><span class=\"p\">):<\/span>\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">length<\/span> <span class=\"o\">=<\/span> <span class=\"n\">length<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">__iter__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\n        <span class=\"k\">for<\/span> <span class=\"n\">i<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">range<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">length<\/span><span class=\"p\">):<\/span>\n            <span class=\"k\">yield<\/span> <span class=\"n\">i<\/span>\n\n<span class=\"n\">gen_data<\/span> <span class=\"o\">=<\/span> <span class=\"n\">generator_data<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">gen_data<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"nb\">list<\/span><span class=\"p\">(<\/span><span class=\"n\">gen_data<\/span><span class=\"p\">))<\/span> <span class=\"c1\"># \uccab\ubc88\uc9f8 \ud638\ucd9c - __iter__\uac00 \ud638\ucd9c\ub418\uc5b4 \uc0c8\ub85c\uc6b4 \uc774\ud130\ub808\uc774\ud130 \ubc18\ud658\n<\/span><span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"nb\">list<\/span><span class=\"p\">(<\/span><span class=\"n\">gen_data<\/span><span class=\"p\">))<\/span> <span class=\"c1\"># \ub450\ubc88\uc9f8 \ud638\ucd9c - \uc0c1\uae30 \ub3d9\uc77c\n<\/span><span class=\"o\">&gt;&gt;&gt;<\/span>\n\n<span class=\"o\">&lt;<\/span><span class=\"n\">__main__<\/span><span class=\"p\">.<\/span><span class=\"n\">generator_data<\/span> <span class=\"nb\">object<\/span> <span class=\"n\">at<\/span> <span class=\"mh\">0x10c973c50<\/span><span class=\"o\">&gt;<\/span>\n<span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">,<\/span> <span class=\"mi\">6<\/span><span class=\"p\">,<\/span> <span class=\"mi\">7<\/span><span class=\"p\">,<\/span> <span class=\"mi\">8<\/span><span class=\"p\">,<\/span> <span class=\"mi\">9<\/span><span class=\"p\">]<\/span>\n<span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">,<\/span> <span class=\"mi\">6<\/span><span class=\"p\">,<\/span> <span class=\"mi\">7<\/span><span class=\"p\">,<\/span> <span class=\"mi\">8<\/span><span class=\"p\">,<\/span> <span class=\"mi\">9<\/span><span class=\"p\">]<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\ud574\ub2f9 \ucf54\ub4dc\ub85c \uc6b0\ub9ac\uac00 \uc6d0\ud558\ub294 \uacb0\uacfc\ub97c \uc5bb\uc744 \uc218 \uc788\uc5c8\ub2e4. \ucf54\ub4dc\uac00 \uc815\uc0c1\uc801\uc73c\ub85c \ub3d9\uc791\ud558\ub294 \uc774\uc720\ub294, \uac01\uac01\uc758 \uc21c\ud68c \uacfc\uc815\uc5d0\uc11c \uc774\ud130\ub808\uc774\ud130\ub294 \ub3c5\ub9bd\uc801\uc73c\ub85c \ub3d9\uc791(\uc0c8\ub85c\uc6b4 \uc774\ud130\ub808\uc774\ud130 \uac1d\uccb4\uac00 \ubc18\ud658)\ud558\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n<h3 id=\"\ucee8\ud14c\uc774\ub108-\ud0c0\uc785\uacfc-\uc774\ud130\ub808\uc774\ud130-\ud0c0\uc785\">\ucee8\ud14c\uc774\ub108 \ud0c0\uc785\uacfc \uc774\ud130\ub808\uc774\ud130 \ud0c0\uc785<\/h3>\n<ul>\n  <li>iter\ub0b4\uc7a5 \ud568\uc218\uc5d0 \uc774\ud130\ub808\uc774\ud130\ub97c \ub118\uae30\uba74 \uc774\ud130\ub808\uc774\ud130 \uc790\uccb4\ub97c \ubc18\ud658\n    <ul>\n      <li>\uc18c\uc9c4\ub41c \uc774\ud130\ub808\uc774\ud130\uac00 \ub4e4\uc5b4\uc624\uba74 \uc18c\uc9c4\ub41c \ucc44\ub85c \ubc18\ud658<\/li>\n    <\/ul>\n  <\/li>\n  <li>iter\ub0b4\uc7a5 \ud568\uc218\uc5d0 \ucee8\ud14c\uc774\ub108 \ud0c0\uc785\uc744 \ub118\uae30\uba74 \ub9e4\ubc88 \uc0c8\ub85c\uc6b4 \uc774\ud130\ub808\uc774\ud130\ub97c \uc0dd\uc131\ud574\uc11c \ubc18\ud658<\/li>\n<\/ul>\n","pubDate":"Tue, 23 Apr 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-feature-of-iterator\/","guid":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-feature-of-iterator\/","category":["pythonic","iterator","Pythonic"]},{"title":"Pythonic: \ud30c\uc774\uc36c\uc758 \ud074\ub85c\uc800","description":"<h1 id=\"-\ud074\ub85c\uc800\uc640-\ubcc0\uc218-\uc2a4\ucf54\ud504\uc5d0-\uc0c1\ud638\uc791\uc6a9\">* \ud074\ub85c\uc800\uc640 \ubcc0\uc218 \uc2a4\ucf54\ud504\uc5d0 \uc0c1\ud638\uc791\uc6a9<\/h1>\n<h2 id=\"\ud074\ub85c\uc800closure\ub780\">\ud074\ub85c\uc800(Closure)\ub780?<\/h2>\n<p>\ud074\ub85c\uc800\ub780, \uc790\uc2e0\uc774 \uc815\uc758\ub41c \uc2a4\ucf54\ud504(scope:\uc720\ud6a8\ubc94\uc704)\uc5d0 \uc788\ub294 \ubcc0\uc218\ub97c \ucc38\uc870\ud558\ub294 \ud568\uc218\ub2e4. \ud558\uae30 \uc608\uc81c \ucf54\ub4dc\ub97c \ubcf4\uba74, <code class=\"language-plaintext highlighter-rouge\">change_core<\/code>\ud568\uc218\uac00 <code class=\"language-plaintext highlighter-rouge\">change<\/code>\ud568\uc218\uc758 <code class=\"language-plaintext highlighter-rouge\">left<\/code>\uc778\uc218\uc5d0 \ubc14\ub85c \uc811\uadfc\ud558\uace0 \uc788\ub294\ub370, \ubc14\ub85c \ud074\ub85c\uc800 \ub355\ubd84\uc5d0 \uc811\uadfc\uc774 \uac00\ub2a5\ud55c \uac83\uc774\ub2e4.<\/p>\n\n<h3 id=\"\uc608\uc81c1\">\uc608\uc81c1<\/h3>\n<p>\ub4e4\uc5b4\uc628 \uc778\uc218 \uc704\uce58\ub97c \ubc14\uafd4 \ucd9c\ub825\ud558\ub294 \ud568\uc218<\/p>\n\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">def<\/span> <span class=\"nf\">change<\/span><span class=\"p\">(<\/span><span class=\"n\">left<\/span><span class=\"p\">,<\/span> <span class=\"n\">right<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">change_core<\/span><span class=\"p\">(<\/span><span class=\"n\">in_right<\/span><span class=\"p\">):<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">in_right<\/span><span class=\"p\">,<\/span> <span class=\"n\">left<\/span>\n    <span class=\"n\">rtn<\/span> <span class=\"o\">=<\/span> <span class=\"n\">change_core<\/span><span class=\"p\">(<\/span><span class=\"n\">right<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">rtn<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">change<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\n\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre><\/div><\/div>\n<!--more-->\n\n<p class=\"notice--danger\">\uc0c1\uae30 \ucf54\ub4dc\ub294 \uc774\ud574\ub97c \ub3d5\uae30\uc704\ud55c \uc608\uc81c\uc77c \ubfd0,  \ud574\ub2f9 \uae30\ub2a5\uc740 \uc774\ub807\uac8c \uc791\uc131\ud558\uba74 \uc548\ub41c\ub2e4.<\/p>\n\n<h3 id=\"\uc608\uc81c2\">\uc608\uc81c2<\/h3>\n<p>\ub4e4\uc5b4\uc628 \uc778\uc218 \uc704\uce58\ub97c \ubc14\uafb8\uace0, \uadf8 \uc2e4\ud589\uc5ec\ubd80\ub97c \ucc38\/\uac70\uc9d3\uc73c\ub85c \ucd9c\ub825\ud558\ub294 \ud568\uc218<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">def<\/span> <span class=\"nf\">change<\/span><span class=\"p\">(<\/span><span class=\"n\">left<\/span><span class=\"p\">,<\/span> <span class=\"n\">right<\/span><span class=\"p\">):<\/span>\n    <span class=\"n\">changed<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">False<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">change_core<\/span><span class=\"p\">(<\/span><span class=\"n\">in_right<\/span><span class=\"p\">):<\/span>\n        <span class=\"n\">changed<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">True<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">in_right<\/span><span class=\"p\">,<\/span> <span class=\"n\">left<\/span>\n    <span class=\"n\">rtn<\/span> <span class=\"o\">=<\/span> <span class=\"n\">change_core<\/span><span class=\"p\">(<\/span><span class=\"n\">right<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">rtn<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">changed<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">change<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">)<\/span> <span class=\"c1\"># \uacb0\uacfc\ub97c \uc608\uc0c1\ud574\ubcf4\uc790.\n<\/span><\/code><\/pre><\/div><\/div>\n<p>\ub300\ubd80\ubd84 \uc544\ub798\uc640 \uac19\uc774 \uc608\uc0c1\ud560 \uac83\uc774\ub2e4.<\/p>\n\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n<span class=\"bp\">True<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\ud558\uc9c0\ub9cc \uc2e4\uc81c\ub85c \uc2e4\ud589\uc2dc\ucf1c\ubcf4\uba74, \ucd9c\ub825\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n<span class=\"bp\">False<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\uc778\uc218\uc758 \uc704\uce58\ub97c \ubc14\uafd4 \ucd9c\ub825\ud558\ub294 \ud568\uc218\uc758 \uae30\ub2a5\uc740 \ub3d9\uc791\ud558\uc600\uc73c\ub098, \uadf8 \uc2e4\ud589\uc5ec\ubd80\ub97c <code class=\"language-plaintext highlighter-rouge\">False<\/code>\ub85c \ucd9c\ub825\ud558\uace0\uc788\ub2e4. \uc5b4\uc9f8\uc11c \uc77c\uae4c?<\/p>\n\n<h2 id=\"\uc2a4\ucf54\ud504-\ud0d0\uc0c9-\uc21c\uc11c\">\uc2a4\ucf54\ud504 \ud0d0\uc0c9 \uc21c\uc11c<\/h2>\n<p>\ud30c\uc774\uc36c \uc778\ud130\ud504\ub9ac\ud130\ub294 \ubcc0\uc218\uc758 \ucc38\uc870\ub97c \uc9c4\ud589\ud560 \ub54c, \ub2e4\uc74c\uacfc \uac19\uc740 \uc21c\uc11c\ub85c \uc720\ud6a8\ubc94\uc704\ub97c \ud0d0\uc0c9\ud55c\ub2e4. 1~4\ubc88\uae4c\uc9c0\uc758 \uc2a4\ucf54\ud504\uc5d0\uc11c \ubcc0\uc218\ub97c \ucc3e\uc9c0 \ubabb\ud558\uba74, <code class=\"language-plaintext highlighter-rouge\">NameError<\/code>\uac00 \ubc1c\uc0dd\ud55c\ub2e4.<\/p>\n<ol>\n  <li>\ud604\uc7ac \ud568\uc218\uc758 \uc2a4\ucf54\ud504<\/li>\n  <li>\ud604\uc7ac \ud568\uc218\ub97c \uac10\uc2f8\ub294 \uc2a4\ucf54\ud504<\/li>\n  <li>\ud604\uc7ac \ud568\uc218\uac00 \uc4f0\uc5ec\uc9c4 \ucf54\ub4dc, \ubaa8\ub4c8 \uc2a4\ucf54\ud504(\uc804\uc5ed \uc2a4\ucf54\ud504)<\/li>\n  <li>\ub0b4\uc7a5 \ud568\uc218 \uc2a4\ucf54\ud504(\ub0b4\uc7a5 \uc2a4\ucf54\ud504)<\/li>\n<\/ol>\n\n<p>\uc989, <u>\ud604\uc7ac \uc2a4\ucf54\ud504\ubd80\ud130 \uc2dc\uc791\ud574\uc11c \ubd80\ubaa8\uae09\uc73c\ub85c \ud0d0\uc0c9<\/u>\uc744 \ud574\ub098\uac00\uae30 \ub54c\ubb38\uc5d0, <strong>\uc608\uc81c2<\/strong>\uc758 \ucf54\ub4dc \uacb0\uacfc\uac00 \uc124\uba85\uc774 \ub41c\ub2e4. \uc774 \ub54c, <code class=\"language-plaintext highlighter-rouge\">change_core<\/code>\ud568\uc218 \uc548\uc5d0\uc11c <code class=\"language-plaintext highlighter-rouge\">changed<\/code>\ubcc0\uc218\ub294 \uc0c8\ub85c\uc6b4 \ubcc0\uc218\ub85c \ud560\ub2f9\ub41c\ub2e4. <strong>\uc608\uc81c3<\/strong>\uc744 \ubcf4\uba74 \uc774\ud574\uac00 \uc27d\ub2e4.<\/p>\n<h3 id=\"\uc608\uc81c3\">\uc608\uc81c3<\/h3>\n<p>\uc608\uc81c2\uc640 \uac19\uc740 \ucf54\ub4dc\uc774\ub098, <code class=\"language-plaintext highlighter-rouge\">change_core<\/code>\ud568\uc218\uc548\uc5d0\uc11c <code class=\"language-plaintext highlighter-rouge\">changed<\/code>\ubcc0\uc218\ucd9c\ub825\uc744 \ucd94\uac00\ud558\uc600\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">def<\/span> <span class=\"nf\">change<\/span><span class=\"p\">(<\/span><span class=\"n\">left<\/span><span class=\"p\">,<\/span> <span class=\"n\">right<\/span><span class=\"p\">):<\/span>\n    <span class=\"n\">changed<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">False<\/span> <span class=\"c1\"># scope: change\n<\/span>    <span class=\"k\">def<\/span> <span class=\"nf\">change_core<\/span><span class=\"p\">(<\/span><span class=\"n\">in_right<\/span><span class=\"p\">):<\/span>\n        <span class=\"n\">changed<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">True<\/span> <span class=\"c1\"># scope: change_core\n<\/span>        <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">changed<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">in_right<\/span><span class=\"p\">,<\/span> <span class=\"n\">left<\/span>\n    <span class=\"n\">rtn<\/span> <span class=\"o\">=<\/span> <span class=\"n\">change_core<\/span><span class=\"p\">(<\/span><span class=\"n\">right<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">rtn<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">changed<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">change<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\n\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"bp\">True<\/span>\n<span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n<span class=\"bp\">False<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\ub9ce\uc740 \uc0ac\ub78c\ub4e4\uc774 \uc798 \ud63c\ub3d9\ud558\ub294 \ubb38\uc81c\uc774\ub2e4. \ubb3c\ub860 \uc774\uc640 \uac19\uc740 \uacb0\uacfc\ub294 \ud30c\uc774\uc36c \uc124\uacc4\uc790\uc758 \uc758\ub3c4\uc774\uba70, \ud568\uc218\uc758 \uc9c0\uc5ed\ubcc0\uc218\uac00 \ubaa8\ub4c8\uc758 \uc804\uc5ed\ubcc0\uc218\ub97c \uc624\uc5fc\uc2dc\ud0a4\ub294 \uac83\uc744 \ubc29\uc9c0\ud574\uc900\ub2e4. \ud574\ub2f9 \ubd80\ubd84\uc740 \ud30c\uc774\uc36c \ucf54\ub529\uc5d0 \uc788\uc5b4, \uc774\ud574\uac00 \uaf2d \ud544\uc694\ud558\uba70 \ub9e4\uc6b0 \uc911\uc694\ud558\ub2e4.<\/p>\n","pubDate":"Mon, 22 Apr 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-closure\/","guid":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-closure\/","category":["pythonic","closure","Pythonic"]},{"title":"Pythonic: None\uc744 \ubc18\ud658\ud558\uae30\ubcf4\ub2e4\ub294, \uc5d0\ub7ec\ub97c \uc77c\uc73c\ud0a4\uc790","description":"<h1 id=\"-none\uc744-\ubc18\ud658\ud558\uc9c0-\uc54a\uae30\">* None\uc744 \ubc18\ud658\ud558\uc9c0 \uc54a\uae30<\/h1>\n<h2 id=\"none\uc744-\ubc18\ud658\ud560-\uacbd\uc6b0\">None\uc744 \ubc18\ud658\ud560 \uacbd\uc6b0<\/h2>\n<p>\ub098\ub204\uae30 \ud568\uc218\ub97c \uc791\uc131\ud574\ubcf4\uc790.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">def<\/span> <span class=\"nf\">divide<\/span><span class=\"p\">(<\/span><span class=\"n\">a<\/span><span class=\"p\">,<\/span> <span class=\"n\">b<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">try<\/span><span class=\"p\">:<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">a<\/span> <span class=\"o\">\/<\/span> <span class=\"n\">b<\/span>\n    <span class=\"k\">except<\/span> <span class=\"nb\">ZeroDivisionError<\/span><span class=\"p\">:<\/span> <span class=\"c1\"># --&gt; 0\uc73c\ub85c \ub098\ub204\ub824\uace0 \ud560 \ub54c(\ubd80\ubaa8\uac00 0), \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud55c\ub2e4.\n<\/span>        <span class=\"k\">return<\/span> <span class=\"bp\">None<\/span>\n\n<span class=\"n\">result<\/span> <span class=\"o\">=<\/span> <span class=\"n\">divide<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">,<\/span> <span class=\"n\">y<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">if<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">result<\/span><span class=\"p\">:<\/span> <span class=\"c1\"># --&gt; None\uc740 \ud30c\uc774\uc36c\uc5d0\uc11c false\ub85c \uac04\uc8fc\ub418\uae30 \ub54c\ubb38.\n<\/span>    <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'\uc798\ubabb\ub41c \uc785\ub825'<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\uc0c1\uae30 \ucf54\ub4dc\ub294 \uce58\uba85\uc801\uc778 \uc624\ub958\uac00 \uc788\ub2e4. \ub9cc\uc57d \ubd84\uc790\uac00 0\uc77c \uacbd\uc6b0(\uc608\uc2dc: 0 \/ 7 = 0 ), \ud574\ub2f9 <code class=\"language-plaintext highlighter-rouge\">divide<\/code>\ud568\uc218\ub294 0\uc744 \ub9ac\ud134\ud560 \uac83\uc774\uba70, \uc815\ud655\ud55c \uacc4\uc0b0\uc774\uc9c0\ub9cc \ud30c\uc774\uc36c\uc5d0\uc11c\ub294 <code class=\"language-plaintext highlighter-rouge\">{}<\/code>,<code class=\"language-plaintext highlighter-rouge\">''<\/code>, <code class=\"language-plaintext highlighter-rouge\">0<\/code>, <code class=\"language-plaintext highlighter-rouge\">None<\/code>\uc744 <code class=\"language-plaintext highlighter-rouge\">false<\/code>\ub85c \uac04\uc8fc\ud558\uae30 \ub54c\ubb38\uc5d0 \uc800 if\ubb38\uc744 \ud0c0\ubc84\ub9b4 \uac83\uc774\ub2e4.<\/p>\n\n<p>\ubb3c\ub860 \uc0c1\uae30 \ucf54\ub4dc\ub97c \ub2e4\uc74c\uacfc \uac19\uc774 \uac1c\uc120\ud558\uba74 \ubb38\uc81c\ub294 \uc5c6\ub2e4.\n<!--more--><\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">if<\/span> <span class=\"n\">result<\/span> <span class=\"ow\">is<\/span> <span class=\"bp\">None<\/span><span class=\"p\">:<\/span>\n    <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'\uc798\ubabb\ub41c \uc785\ub825'<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\ud558\uc9c0\ub9cc, <strong>\uc798\ubabb\ub41c \uc785\ub825<\/strong>\uc744 \uc54c\ub9ac\uae30 \uc704\ud574 <code class=\"language-plaintext highlighter-rouge\">None<\/code>\uc744 \ubc18\ud658\ud558\ub294 \uacbd\uc6b0! <u>\uc989, \ud2b9\ubcc4\ud55c \uc758\ubbf8\ub97c \ub098\ud0c0\ub0b4\ub824\uace0 'None'\uc744 \ubc18\ud658\ud558\ub294 \uacbd\uc6b0<\/u>\ub294 \ub9e8 \uc704 \ucf54\ub4dc\uc640 \uac19\uc774 \uc870\uac74\uc2dd\uc5d0\uc11c <code class=\"language-plaintext highlighter-rouge\">False<\/code>\ub85c \ud3c9\uac00\ub418\uae30 \ub54c\ubb38\uc5d0, \uc624\ub958\ub97c \uc77c\uc73c\ud0a4\uae30 \uc27d\ub2e4.<\/p>\n\n<h2 id=\"return-none-\ubcf4\ub2e4\ub294-raise-error\">return None \ubcf4\ub2e4\ub294 raise error<\/h2>\n<p>\uc608\uc678\ub97c \ubc1c\uc0dd\uc2dc\ucf1c, \ud638\ucd9c\ud558\ub294 \ucf54\ub4dc\uc5d0\uc11c \uc608\uc678\ub97c \uc801\uc808\ud788 \ucee8\ud2b8\ub864 \ud560 \uc218 \uc788\uac8c\ub054 \ud55c\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">def<\/span> <span class=\"nf\">divide<\/span><span class=\"p\">(<\/span><span class=\"n\">a<\/span><span class=\"p\">,<\/span> <span class=\"n\">b<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">try<\/span><span class=\"p\">:<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">a<\/span> <span class=\"o\">\/<\/span> <span class=\"n\">b<\/span>\n    <span class=\"k\">except<\/span> <span class=\"nb\">ZeroDivisionError<\/span> <span class=\"k\">as<\/span> <span class=\"n\">e<\/span><span class=\"p\">:<\/span>\n        <span class=\"k\">raise<\/span> <span class=\"nb\">ValueError<\/span><span class=\"p\">(<\/span><span class=\"s\">'\uc798\ubabb\ub41c \uc785\ub825'<\/span><span class=\"p\">)<\/span> <span class=\"k\">from<\/span> <span class=\"n\">e<\/span>\n\n<span class=\"n\">x<\/span><span class=\"p\">,<\/span> <span class=\"n\">y<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">10<\/span><span class=\"p\">,<\/span> <span class=\"mi\">9<\/span>\n<span class=\"k\">try<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">result<\/span> <span class=\"o\">=<\/span> <span class=\"n\">divide<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">,<\/span> <span class=\"n\">y<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">except<\/span> <span class=\"nb\">ValueError<\/span><span class=\"p\">:<\/span>\n    <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'\uc798\ubabb\ub41c \uc785\ub825'<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">else<\/span><span class=\"p\">:<\/span>\n    <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'\uc815\uc0c1!'<\/span><span class=\"p\">)<\/span>\n\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"n\">\uc815\uc0c1<\/span><span class=\"err\">!<\/span>\n<\/code><\/pre><\/div><\/div>\n\n","pubDate":"Sun, 21 Apr 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-dont-return-none-raise-error\/","guid":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-dont-return-none-raise-error\/","category":["pythonic","none","raise","Pythonic"]},{"title":"Pythonic: \ub9ac\uc2a4\ud2b8 \ucef4\ud504\ub9ac\ud5e8\uc158\uacfc \uc81c\ub108\ub808\uc774\ud130 \uc0b4\ud3b4\ubcf4\uae30","description":"<h1 id=\"-\ub9ac\uc2a4\ud2b8-\ucef4\ud504\ub9ac\ud5e8\uc158\uacfc-\uc81c\ub108\ub808\uc774\ud130\">* \ub9ac\uc2a4\ud2b8 \ucef4\ud504\ub9ac\ud5e8\uc158\uacfc \uc81c\ub108\ub808\uc774\ud130<\/h1>\n<h2 id=\"\ub9ac\uc2a4\ud2b8-\ucef4\ud504\ub9ac\ud5e8\uc158\">\ub9ac\uc2a4\ud2b8 \ucef4\ud504\ub9ac\ud5e8\uc158<\/h2>\n<h3 id=\"\uc0c8\ub85c\uc6b4-\ub9ac\uc2a4\ud2b8-\ub9cc\ub4e4\uae30\">\uc0c8\ub85c\uc6b4 \ub9ac\uc2a4\ud2b8 \ub9cc\ub4e4\uae30<\/h3>\n<p>map\uacfc lambda\ud568\uc218\ub97c \ud1b5\ud574\uc11c \ub9cc\ub4e4\uae30 \ubcf4\ub2e8, \ub2e4\uc74c\uacfc \uac19\uc774 \uba85\ub8cc\ud558\uac8c \ub098\ud0c0\ub0b4\uba70 \ub9ac\uc2a4\ud2b8\ub97c \uc0dd\uc131\ud55c\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">before<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">]<\/span>\n<span class=\"n\">after<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"n\">v<\/span><span class=\"o\">*<\/span><span class=\"mi\">2<\/span> <span class=\"k\">for<\/span> <span class=\"n\">v<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">before<\/span><span class=\"p\">]<\/span> <span class=\"c1\"># OK\n# after = map(lambda v: v * 2, before) # X -&gt; \ub3d9\uc791\ud558\ub098, \ud30c\uc774\uc368\ub2c9\ud558\uc9c0 \ubabb\ud568.\n<\/span><span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">after<\/span><span class=\"p\">)<\/span>\n\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"mi\">6<\/span><span class=\"p\">,<\/span> <span class=\"mi\">8<\/span><span class=\"p\">,<\/span> <span class=\"mi\">10<\/span><span class=\"p\">]<\/span>\n<\/code><\/pre><\/div><\/div>\n<!--more-->\n\n<h3 id=\"\ub9ac\uc2a4\ud2b8-\ucef4\ud504\ub9ac\ud5e8\uc158\uc5d0-\uc870\uac74\uc2dd-\ub123\uae30\">\ub9ac\uc2a4\ud2b8 \ucef4\ud504\ub9ac\ud5e8\uc158\uc5d0 \uc870\uac74\uc2dd \ub123\uae30<\/h3>\n<p>\ub2e4\uc74c\uacfc \uac19\uc774 \uc870\uac74\uc2dd \ub610\ud55c \ub123\uc744 \uc218 \uc788\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">before<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">]<\/span>\n<span class=\"n\">after<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"n\">v<\/span><span class=\"o\">*<\/span><span class=\"mi\">2<\/span> <span class=\"k\">for<\/span> <span class=\"n\">v<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">before<\/span> <span class=\"k\">if<\/span> <span class=\"n\">x<\/span> <span class=\"o\">%<\/span> <span class=\"mi\">2<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"c1\"># 2\ub85c \ub098\ub220 \ub5a8\uc5b4\uc9c0\ub294 \ub140\uc11d\ub4e4\ub9cc \uacf1\ud574 \ub2f4\uae30.\n<\/span><span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">after<\/span><span class=\"p\">)<\/span>\n\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"p\">[<\/span><span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"mi\">8<\/span><span class=\"p\">]<\/span>\n<\/code><\/pre><\/div><\/div>\n<hr \/>\n\n<h2 id=\"\uc81c\ub108\ub808\uc774\ud130\">\uc81c\ub108\ub808\uc774\ud130<\/h2>\n<h3 id=\"\uc81c\ub108\ub808\uc774\ud130\ub85c-\ub9ac\uc2a4\ud2b8-\ucef4\ud504\ub9ac\ud5e8\uc158\uc758-\ubb38\uc81c\uc810\uc744-\ud574\uacb0\ud558\uae30\">\uc81c\ub108\ub808\uc774\ud130\ub85c \ub9ac\uc2a4\ud2b8 \ucef4\ud504\ub9ac\ud5e8\uc158\uc758 \ubb38\uc81c\uc810\uc744 \ud574\uacb0\ud558\uae30<\/h3>\n<p>\ub9ac\uc2a4\ud2b8 \ucef4\ud504\ub9ac\ud5e8\uc158\uc758 \uac00\uc7a5 \ud070 \ubb38\uc81c\uc810\uc740 \uba54\ubaa8\ub9ac \ub0ad\ube44\uc774\ub2e4. \uc0c8 \ub9ac\uc2a4\ud2b8\ub97c \ud1b5\uc9f8\ub85c \uc0dd\uc131\ud558\uae30 \ub54c\ubb38\uc5d0 \uc785\ub825\uc774 \ub9ce\uc740 \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c\ub294 <code class=\"language-plaintext highlighter-rouge\">Out of memory<\/code> \uc5d0\ub7ec\ub97c \ubcfc \uac83\uc774\ub2e4. \ub2e4\uc74c \uc608\uc81c \ucf54\ub4dc\ub294 \uc774\uc804 \ucf54\ub4dc\uc640 \ub3d9\uc77c\ud55c \uae30\ub2a5\uc744 \uc81c\ub108\ub808\uc774\ud130\ub85c \ud45c\ud604\ud558\uc600\ub2e4. \ud574\ub2f9 \uc81c\ub108\ub808\uc774\ud130 \ucf54\ub4dc\ub294 \uc774\ud130\ub808\uc774\ud130(<a href=\"\/pythonic\/feature-of-iterator\">\uc0b4\ud3b4\ubcf4\uae30<\/a>)\ub85c \ud3c9\uac00\ub418\uae30 \ub54c\ubb38\uc5d0 \ucd9c\ub825\uc774 \uc9c4\ud589\ub418\uc9c4 \uc54a\ub294\ub2e4.<\/p>\n\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">before<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">]<\/span>\n<span class=\"c1\"># after = [v*2 for v in before] # X -&gt;\uc774\ubbf8 \uba54\ubaa8\ub9ac\uc5d0 \uc62c\ub77c\uac00\uba74\uc11c \uba54\ubaa8\ub9ac \uc810\uc720\uc728\uc774 \uacc4\uc18d \ucee4\uc9c0\uace0 \uc788\ub294 \uc0c1\ud669\n<\/span><span class=\"n\">after_generator<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">v<\/span><span class=\"o\">*<\/span><span class=\"mi\">2<\/span> <span class=\"k\">for<\/span> <span class=\"n\">v<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">before<\/span><span class=\"p\">)<\/span> <span class=\"c1\"># \ud29c\ud50c\uc744 \ub2f4\ub4ef ()\uc5d0 \ub2f4\uc544\uc900\ub2e4.\n<\/span><span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">after_generator<\/span><span class=\"p\">)<\/span>\n\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"o\">&lt;<\/span><span class=\"n\">generator<\/span> <span class=\"nb\">object<\/span> <span class=\"o\">&lt;<\/span><span class=\"n\">genexpr<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">at<\/span> <span class=\"mi\">0<\/span><span class=\"n\">xxx123xxx<\/span><span class=\"o\">&gt;<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h3 id=\"\uc81c\ub108\ub808\uc774\ud130\ub85c-\ucd9c\ub825\ud558\uae30\">\uc81c\ub108\ub808\uc774\ud130\ub85c \ucd9c\ub825\ud558\uae30<\/h3>\n<p>\ub0b4\uc7a5 \ud568\uc218\ub97c \ud1b5\ud574 \ud558\ub098\uc529 \ucd9c\ub825\uc774 \uac00\ub2a5\ud558\ub2e4. \ub2e4\uc591\ud55c \uc885\ub958\uc758 \ub0b4\uc7a5\ud568\uc218\ub294 \uac80\uc0c9\ud574\ubcf4\uc790.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"nb\">next<\/span><span class=\"p\">(<\/span><span class=\"n\">after_generator<\/span><span class=\"p\">))<\/span>\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"nb\">next<\/span><span class=\"p\">(<\/span><span class=\"n\">after_generator<\/span><span class=\"p\">))<\/span>\n\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<span class=\"mi\">2<\/span>\n<span class=\"mi\">4<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h3 id=\"\uc21c\ud68c\uac00-\uc544\ub2cc-\ub9ac\uc2a4\ud2b8\ub85c-\ub9cc\ub4e4\uc5b4\uc57c-\ud560-\uacbd\uc6b0\">\uc21c\ud68c\uac00 \uc544\ub2cc \ub9ac\uc2a4\ud2b8\ub85c \ub9cc\ub4e4\uc5b4\uc57c \ud560 \uacbd\uc6b0<\/h3>\n<p>for \ubb38\uc774 \ub3cc\uba74\uc11c \ub9ac\uc2a4\ud2b8\ub97c \ub9cc\ub4dc\ub294 \uc2dc\uac04 \uc790\uccb4\uc5d0\ub3c4 \uba54\ubaa8\ub9ac \uc810\uc720\ub418\uae30 \ub54c\ubb38\uc5d0, \uc81c\ub108\ub808\uc774\ud130\ub85c \ud55c\ubc88 \ub9cc\ub4e0 \ud6c4 \ub9ac\uc2a4\ud2b8\ub85c \ub9cc\ub4dc\ub294 \uac83\uc774 \ud6a8\uacfc\uc801\uc774\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># X -&gt; \ub9ac\uc2a4\ud2b8\ub97c \ubc18\ud658\ud558\ub294 \ubc29\uc2dd\n<\/span><span class=\"k\">def<\/span> <span class=\"nf\">rtn_list<\/span><span class=\"p\">(<\/span><span class=\"n\">nums<\/span><span class=\"p\">):<\/span> \n  <span class=\"n\">r<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"n\">v<\/span><span class=\"o\">*<\/span><span class=\"mi\">2<\/span> <span class=\"k\">for<\/span> <span class=\"n\">v<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">nums<\/span><span class=\"p\">]<\/span>\n  <span class=\"k\">return<\/span> <span class=\"n\">r<\/span>\n\n<span class=\"c1\"># OK -&gt; \uc81c\ub108\ub808\uc774\ud130\ub97c \ubc18\ud658\ud558\ub294 \ubc29\uc2dd\n<\/span><span class=\"k\">def<\/span> <span class=\"nf\">rtn_generator<\/span><span class=\"p\">(<\/span><span class=\"n\">nums<\/span><span class=\"p\">):<\/span>\n  <span class=\"k\">for<\/span> <span class=\"n\">v<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">nums<\/span><span class=\"p\">:<\/span>\n    <span class=\"k\">yield<\/span> <span class=\"n\">v<\/span><span class=\"o\">*<\/span><span class=\"mi\">2<\/span>\n  <span class=\"c1\">#r = (v*2 for v in nums) -- \ub3d9\uc77c\ud568\n<\/span>  <span class=\"k\">return<\/span> <span class=\"n\">r<\/span>\n\n<span class=\"n\">before<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">]<\/span>\n<span class=\"n\">after_list<\/span> <span class=\"o\">=<\/span> <span class=\"n\">rtn_list<\/span><span class=\"p\">(<\/span><span class=\"n\">before<\/span><span class=\"p\">)<\/span> <span class=\"c1\"># X -&gt; \uc774\ubbf8 \ud568\uc218\uac00 \ub3d9\uc791\ud558\ub294 \uc0c1\ud669\uc5d0\uc11c\ubd80\ud130 \uba54\ubaa8\ub9ac\uac00 \uc810\uc720\ub418\uace0 \uc788\uc5c8\uc74c\n<\/span><span class=\"n\">after_gen<\/span> <span class=\"o\">=<\/span> <span class=\"n\">rtn_generator<\/span><span class=\"p\">(<\/span><span class=\"n\">before<\/span><span class=\"p\">)<\/span> <span class=\"c1\"># OK -&gt; \uc544\uc9c1 \uba54\ubaa8\ub9ac\uc5d0 \uc548\uc62c\ub77c\uae30 \uc788\uc74c\n<\/span><span class=\"n\">after_gen<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">list<\/span><span class=\"p\">(<\/span><span class=\"n\">after_gen<\/span><span class=\"p\">)<\/span> <span class=\"c1\"># OK -&gt; \ud638\ucd9c \uc2dc\uc5d0 \uba54\ubaa8\ub9ac\uc5d0 \uc62c\ub77c\uac10\n<\/span><\/code><\/pre><\/div><\/div>\n","pubDate":"Sat, 20 Apr 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-generator\/","guid":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-generator\/","category":["pythonic","generator","list","comprehenshion","Pythonic"]},{"title":"Pythonic: PEP8 \uc2a4\ud0c0\uc77c \uac00\uc774\ub4dc","description":"<h1 id=\"-pep-8-\uc2a4\ud0c0\uc77c-\uac00\uc774\ub4dc\">* PEP 8 \uc2a4\ud0c0\uc77c \uac00\uc774\ub4dc<\/h1>\n<p><a href=\"https:\/\/www.python.org\/dev\/peps\/pep-0008\/\">\ud30c\uc774\uc36c \uac1c\uc120 \uc81c\uc548\uc11c(Python Enhancement Proposal) #8<\/a><\/p>\n\n<p>\uac04\ub2e8\ud558\uac8c \ud30c\uc774\uc36c \ucf54\ub4dc \uc2a4\ud0c0\uc77c \uac00\uc774\ub4dc\ub77c\uace0 \uc0dd\uac01\ud558\uba74 \ub41c\ub2e4.<\/p>\n\n<h2 id=\"\uae30\ub300\ud560-\uc218-\uc788\ub294-\ud6a8\uacfc\">\uae30\ub300\ud560 \uc218 \uc788\ub294 \ud6a8\uacfc<\/h2>\n<ol>\n  <li>\uc77c\uad00\uc131 \uc788\ub294 \uc2a4\ud0c0\uc77c\uc740 \uc720\uc9c0\ubcf4\uc218\ub97c \uc6a9\uc774\ud558\uac8c \ud55c\ub2e4.<\/li>\n  <li>\uac00\ub3c5\uc131\uc774 \ub192\uc544\uc9c4\ub2e4.<\/li>\n  <li>\ub2e4\ub978 \ucee4\ubba4\ub2c8\ud2f0\uc5d0 \uc18d\ud55c \ub2e4\ub978 \ud504\ub85c\uadf8\ub798\uba38\uc640\ub3c4 \ud611\uc5c5\uc774 \uc6a9\uc774\ud558\ub2e4.<\/li>\n<\/ol>\n\n<!--more-->\n<h2 id=\"\uaf2d-\uc54c\uc544\ub450\uba74-\uc88b\uc744-\ud3ec\uc778\ud2b8\">\uaf2d \uc54c\uc544\ub450\uba74 \uc88b\uc744 \ud3ec\uc778\ud2b8<\/h2>\n<h3 id=\"1-\uc2a4\ud398\uc774\uc2a4\">1. \uc2a4\ud398\uc774\uc2a4<\/h3>\n<ul>\n  <li>\uc2a4\ud398\uc774\uc2a4(\ud0edX)\ub85c \ub4e4\uc5ec\uc4f0\uae30<\/li>\n  <li>\ubb38\ubc95\uc801\uc73c\ub85c \uc758\ubbf8 \uc788\ub294 \ub4e4\uc5ec\uc4f0\uae30\ub294 \uc2a4\ud398\uc774\uc2a4 4\uac1c<\/li>\n  <li>\ud55c \uc904\uc758 \uae38\uc774 79\uc790 \uc774\ud558<\/li>\n  <li>\ud568\uc218\uc640 \ud074\ub798\uc2a4\ub294 \ube48 \uc904 2\uac1c\ub85c, \uba54\uc11c\ub4dc\ub294 1\uac1c\ub85c \uad6c\ubd84<\/li>\n  <li>\ubcc0\uc218 \ud560\ub2f9 \uc55e\ub4a4\uc5d0 \uc2a4\ud398\uc774\uc2a4 \ud558\ub098\ub9cc \uc0ac\uc6a9<\/li>\n<\/ul>\n\n<h3 id=\"2-\ub124\uc774\ubc0d\">2. \ub124\uc774\ubc0d<\/h3>\n<ul>\n  <li>\ud568\uc218, \ubcc0\uc218, \uc18d\uc131\uc740 <code class=\"language-plaintext highlighter-rouge\">lowercase_underscore<\/code><\/li>\n  <li>protected\ub294 <code class=\"language-plaintext highlighter-rouge\">_leading_underscore<\/code><\/li>\n  <li>private\ub294 <code class=\"language-plaintext highlighter-rouge\">__double_leading_underscore<\/code><\/li>\n  <li>\ud074\ub798\uc2a4\uc640 \uc608\uc678\ub294 <code class=\"language-plaintext highlighter-rouge\">CapitalizedWord<\/code><\/li>\n  <li>\uc0c1\uc218\ub294 <code class=\"language-plaintext highlighter-rouge\">ALL_CAPS<\/code><\/li>\n<\/ul>\n\n<h3 id=\"3-\ud45c\ud604\uc2dd--\ubb38\uc7a5\">3. \ud45c\ud604\uc2dd \/ \ubb38\uc7a5<\/h3>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"s\">\"\"\"\n&lt; import\uc758 \uc21c\uc11c &gt;\n1. \ud45c\uc900 \ub77c\uc774\ube0c\ub7ec\ub9ac \ubaa8\ub4c8\n2. \uc11c\ub4dc\ud30c\ud2f0 \ubaa8\ub4c8\n3. \uadf8 \uc678 \ucee4\uc2a4\ud140\ubaa8\ub4c8\n4. \uc774 \ud558\uc704\ub294 \uc54c\ud30c\ubcb3 \uc21c\n\"\"\"<\/span>\n<span class=\"c1\"># 1. import\ub294 \ud56d\uc0c1 \ud30c\uc77c\uc758 \ub9e8 \uc704\uc5d0\n<\/span><span class=\"kn\">import<\/span> <span class=\"nn\">os<\/span>\n\n<span class=\"c1\"># 2. import\ub294 \uba85\uc2dc\uc801\uc73c\ub85c\n<\/span><span class=\"kn\">from<\/span> <span class=\"nn\">bar<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">foo<\/span> <span class=\"c1\"># OK\n<\/span><span class=\"kn\">from<\/span> <span class=\"nn\">.<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">foo<\/span> <span class=\"c1\"># OK\n<\/span><span class=\"kn\">import<\/span> <span class=\"nn\">foo<\/span> <span class=\"c1\"># X\n<\/span>\n<span class=\"c1\"># 3. \uae0d\uc815\ud45c\ud604\uc2dd\uc758 \ubd80\uc815\ubcf4\ub2e4\ub294 \ube44\uad50\ubd80\uc815\n<\/span><span class=\"k\">if<\/span> <span class=\"n\">a<\/span> <span class=\"ow\">is<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">b<\/span> <span class=\"c1\"># OK\n<\/span><span class=\"k\">if<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">a<\/span> <span class=\"ow\">is<\/span> <span class=\"n\">b<\/span> <span class=\"c1\"># X\n<\/span>\n<span class=\"c1\"># 4. [] \uc640 '' \ub4f1\uc758 \ube48 \uac12\uc740 \ud30c\uc774\uc36c\uc5d0\uc11c \uc554\uc2dc\uc801\uc73c\ub85c False\n<\/span><span class=\"k\">if<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">somelist<\/span> <span class=\"c1\"># OK\n<\/span><span class=\"k\">if<\/span> <span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">somelist<\/span><span class=\"p\">)<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">0<\/span> <span class=\"c1\"># X\n<\/span>\n<span class=\"c1\"># 5. if, for \uc640 \uac19\uc740 \ubb38\uc740 \uc5ec\ub7ec \uc904\ub85c \ub098\ub220 \uba85\ub8cc\ud558\uac8c\n<\/span><span class=\"k\">for<\/span> <span class=\"n\">i<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">range<\/span><span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">):<\/span>\n  <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span><span class=\"p\">)<\/span>\n\n<\/code><\/pre><\/div><\/div>\n\n<h3 id=\"4-\ub3c4\uad6c\">4. \ub3c4\uad6c<\/h3>\n<ul>\n  <li>pylint<\/li>\n  <li>autopep8\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>pip <span class=\"nb\">install <\/span>pylint autopep8\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n<\/ul>\n","pubDate":"Fri, 19 Apr 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-pep8\/","guid":"https:\/\/hidekuma.github.io\/pythonic\/pythonic-pep8\/","category":["pythonic","pep8","Pythonic"]},{"title":"Gitbash: gitbash\uc5d0\uc11c tmux \uc0ac\uc6a9\ud558\uae30","description":"<h1 id=\"windows--git-bash--tmux\">Windows + git-bash + tmux<\/h1>\n<p>\ub098\ub294 linux\uae30\ubc18\uc778 MacOS \ucc2c\uc591\uc790\uc600\uc73c\ub098, \uc774\ubc88 \uc774\uc9c1\uc73c\ub85c \uc708\ub3c4\uc6b0 \ud658\uacbd\uc5d0\uc11c \uc77c\uc744 \ud558\uac8c \ub418\uc5c8\ub2e4. WindowOS\uc5d0\uc11c\ub294 Bash\uc0ac\uc6a9\uc774 \ubd88\ud3b8\ud560 \uc218 \ubc16\uc5d0 \uc5c6\ub294\ub370, \ubcc4 \uc218 \uc5c6\ub2e4. \ud658\uacbd\uc774\uc57c \ub9cc\ub4e4\uba74 \ub41c\ub2e4.<\/p>\n\n<h2 id=\"git-bash\">git-bash<\/h2>\n<p>\ub2e4\ud589\ud788 \uc5b4\ub835\uc9c0 \uc54a\uc558\ub2e4. cmder\ub098 powershell\ub3c4 \ub9ce\uc774 \uc0ac\uc6a9\ud558\ub294 \uac83 \uac19\uc73c\ub098, git\uc124\uce58\ub9cc\uc73c\ub85c \uac19\uc774 \uc124\uce58\ub418\ub294 git-bash\uac00 \uc0ac\uc6a9\ub3c4 \ud3b8\ub9ac\ud574\uc11c \uc774\uac78\ub85c \uc815\ud588\ub2e4. \ud3c9\uc18c\uc5d0 \ud130\ubbf8\ub110\uc5d0\uc11c tmux\ub97c \uc0ac\uc6a9\ud558\ub294\ub370, git-bash\uc5d0 \ubc18\uc601\ud558\ub294\ub370 \uc0ac\uc2e4 \uba87 \uac00\uc9c0 \ubb38\uc81c\uac00 \uc788\uc5b4\uc11c \ud574\ub2f9 \ub0b4\uc6a9\uc744 \ube14\ub85c\uae45 \ud574\ubcf4\ub824\uace0\ud55c\ub2e4. git\uc740 \uacf5\ud648\uc5d0\uc11c \ub2e4\uc6b4\ubc1b\uc544 \uc0ac\uc6a9\ud558\uba74 \ub41c\ub2e4.<\/p>\n\n<!--more-->\n<h2 id=\"git-bash--tmux\">git-bash + tmux<\/h2>\n<ol>\n  <li>msys2 \uc124\uce58\n    <ul>\n      <li>https:\/\/www.msys2.org\/\uc5d0 \uc811\uc18d\ud558\uc5ec, \uba54\ub274\uc5bc\ub300\ub85c msys2\ub97c \uc124\uce58\ud55c\ub2e4. msys2\ub294 Windows \uc6a9 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uad6c\ucd95 \ud50c\ub7ab\ud3fc\uc774\ub2e4.<\/li>\n    <\/ul>\n  <\/li>\n  <li>pacman\uc744 \ud1b5\ud574 tmux\ub97c \uc778\uc2a4\ud1a8\ud55c\ub2e4.\n    <ul>\n      <li>msys2 \ucf58\uc194\uc5d0\uc11c pacman\uc774\ub77c\ub294 \ud328\ud0a4\uc9c0 \uad00\ub9ac\ud234\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/li>\n      <li>\n        <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>pacman <span class=\"nt\">-S<\/span> tmux\n<\/code><\/pre><\/div>        <\/div>\n      <\/li>\n    <\/ul>\n  <\/li>\n  <li>\uc778\uc2a4\ud1a8\uc774 \uc644\ub8cc\ub418\uba74, \ud30c\uc77c\ud0d0\uc0c9\uae30\ub85c <code class=\"language-plaintext highlighter-rouge\">C:\\msys64\\usr\\bin<\/code>\uc5d0 \uc774\ub3d9\ud55c\ub2e4. (\ub9cc\uc57d \uc124\uce58 \uc2dc, \uacbd\ub85c\ub97c \ubc14\uafe8\ub2e4\uba74 \ud574\ub2f9 \uacbd\ub85c\ud558\uc704 bin \ud3f4\ub354\ub85c \uc774\ub3d9)<\/li>\n  <li><code class=\"language-plaintext highlighter-rouge\">tmux.exe<\/code> \uc640 <code class=\"language-plaintext highlighter-rouge\">msys-event-2-x-x.dll<\/code> \ub97c \ubcf5\uc0ac\ud55c\ub2e4.<\/li>\n  <li><code class=\"language-plaintext highlighter-rouge\">C:\\Program Files\\Git\\usr\\bin<\/code> (git \uacbd\ub85c)\uc758 bin \ub514\ub809\ud1a0\ub9ac\uc5d0 \ubd99\uc5ec\ub123\uae30 \ud574\uc900\ub2e4.<\/li>\n  <li>git-bash\uc5d0\uc11c \uc774\uc81c tmux\ub97c \uc774\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/li>\n<\/ol>\n\n<p class=\"notice--info\"><strong>\uc5c5\ub370\uc774\ud2b8<\/strong><br \/> msys-event\uac00 \ubc84\uc804\uc5c5 \ub418\uac70\ub098 \uc0c8\ub85c\uc6b4 tmux\ubc30\ud3ec\ud310\uc744 \uc124\uce58 \ud560 \uacbd\uc6b0, \ubc88\uac70\ub86d\uc9c0\ub9cc \ub3d9\uc77c\ud55c \uc791\uc5c5\uc744 \ud574\uc918\uc57c\ud55c\ub2e4.<\/p>\n","pubDate":"Wed, 03 Apr 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/windows\/gitbash\/tmux\/windows-tmux-with-git-bash\/","guid":"https:\/\/hidekuma.github.io\/windows\/gitbash\/tmux\/windows-tmux-with-git-bash\/","category":["windows","gitbash","tmux","Windows","Gitbash","Tmux"]},{"title":"Gitbash: \uc708\ub3c4\uc6b0 git bash\uc5d0\uc11c python \ucee4\ub9e8\ub4dc\uac00 \ubb35\ubb35\ubd80\ub2f5\uc77c \uacbd\uc6b0","description":"<h1 id=\"gitbash--python\">gitbash + python<\/h1>\n<p>gitbash\uc5d0\uc11c python\uc744 \uc778\uc2a4\ud1a8 \ud6c4, \uc774\uc81c \uc0ac\uc6a9\ud574\ubcf4\ub824\uace0 python \ucee4\ub9e8\ub4dc\ub97c \uce58\ub294 \uc21c\uac04.<\/p>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>python\n<\/code><\/pre><\/div><\/div>\n<p>\uc704 \uc0c1\ud0dc\ub85c \ubb35\ubb35\ubd80\ub2f5\uc774\ub2e4.<\/p>\n\n<!--more-->\n\n<h1 id=\"winpty\">winpty<\/h1>\n<p>\ub2e4\ud589\ud788\ub3c4 winpty\ub85c \ud574\uacb0 \uac00\ub2a5\ud558\ub2e4. winpty\ub294 Windows \ucf58\uc194 \ud504\ub85c\uadf8\ub7a8\uacfc \ud1b5\uc2e0\ud558\uae30 \uc704\ud574 Unix \ud658\uacbd\uacfc \uc720\uc0ac\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc81c\uacf5\ud558\ub294 \ud328\ud0a4\uc9c0\ub85c python \ucee4\ub9e8\ub4dc\ub97c \ub2e4\uc74c\uacfc \uac19\uc774 \uc785\ub825\ud558\uba74 \uc815\uc0c1\uc801\uc73c\ub85c \ub3d9\uc791\ud55c\ub2e4.<\/p>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>winpty python.exe\nPython 3.7.0 <span class=\"o\">(<\/span>default, Oct  2 2018, 09:18:58<span class=\"o\">)<\/span>\nType <span class=\"s2\">\"help\"<\/span>, <span class=\"s2\">\"copyright\"<\/span>, <span class=\"s2\">\"credits\"<\/span> or <span class=\"s2\">\"license\"<\/span> <span class=\"k\">for <\/span>more information.\n<span class=\"o\">&gt;&gt;&gt;<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\uadf8\ub7ec\ub098 \ub9e4\ubc88 \uc800\ub807\uac8c \uce58\uae34 \uadc0\ucc2e\uc73c\ub2c8, <code class=\"language-plaintext highlighter-rouge\">.bashrc<\/code>\uc5d0 \uae30\uc785\ud574\uc8fc\uba74 \ub41c\ub2e4.<\/p>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">echo<\/span> <span class=\"s2\">\"alias python='winpty python.exe'\"<\/span> <span class=\"o\">&gt;&gt;<\/span> ~\/.bashrc\n<\/code><\/pre><\/div><\/div>\n","pubDate":"Wed, 03 Apr 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/python\/gitbash\/winpty\/windows-git-bash-not-working-python\/","guid":"https:\/\/hidekuma.github.io\/python\/gitbash\/winpty\/windows-git-bash-not-working-python\/","category":["Python","gitbash","winpty","Python","Gitbash","Winpty"]},{"title":"AWS: DynamoDB + API Gateway\ub97c \uc0ac\uc6a9\ud574 Serverless RESTful API \ub9cc\ub4e4\uae30","description":"<h1 id=\"serverless-apidatabase\">Serverless API\/Database<\/h1>\n<p>AWS Lambda\ub97c \uc774\uc6a9\ud558\uc9c0 \uc54a\uace0, \uc11c\ubc84\ub9ac\uc2a4 API\/Database\ub97c \ub9cc\ub4dc\ub294 \ubc95\uc744 \uacf5\uc720\ud55c\ub2e4.<\/p>\n\n<h2 id=\"dynamodb--api-gateway\">DynamoDB + API Gateway<\/h2>\n\n<ol>\n  <li>\n    <p>\uba3c\uc800 DynamoDB\uc5d0 Table\uc744 \ub9cc\ub4e4\uc5b4\uc900\ub2e4.\n<img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/dynamo-with-api\/dynamo-1.png\" alt=\"image-left\" class=\"align-center\" \/><\/p>\n  <\/li>\n  <li>\n    <p>Create item\uc73c\ub85c \ud14c\uc2a4\ud2b8 \uc6a9 \ub370\uc774\ud130\ub97c \ub123\uc5b4\uc8fc\uc790.\n<img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/dynamo-with-api\/dynamo-5.png\" alt=\"image-center\" class=\"align-center\" \/>\n<!--more--><\/p>\n  <\/li>\n  <li>\n    <p>API Gateway\ub97c \uc124\uc815\ud558\uae30 \uc804\uc5d0 Role\uc744 \ub9cc\ub4e4\uc5b4\uc8fc\uc5b4\uc57c \ud55c\ub2e4.\n<img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/dynamo-with-api\/role-1.png\" alt=\"image-center\" class=\"align-center\" \/>\n\uadf8\ub9bc\uacfc \uac19\uc774 <u>DynamoDB\uc5d0 Full Access<\/u>\ub97c \ud560 \uc218\uc788\ub294 <code class=\"language-plaintext highlighter-rouge\">Policy<\/code>\ub97c \uac00\uc9c0\ub294 <code class=\"language-plaintext highlighter-rouge\">Role<\/code>\uc744 \ub9cc\ub4e4\uc5b4\uc900\ub2e4.<\/p>\n  <\/li>\n  <li>\n    <p>\uc774\uc81c API Gateway\ub97c \ub9cc\ub4e4\uc5b4\uc900\ub2e4.\n<img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/dynamo-with-api\/api-1.png\" alt=\"image-center\" class=\"align-center\" \/>\n\ud604\uc7ac\ub294 \ud14c\uc2a4\ud2b8\uae30 \ub54c\ubb38\uc5d0 <code class=\"language-plaintext highlighter-rouge\">Edge optimized<\/code>\ub294 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 <code class=\"language-plaintext highlighter-rouge\">Regional<\/code>\ub85c  <code class=\"language-plaintext highlighter-rouge\">Endpoint Type<\/code>\uc744 \uc124\uc815\ud55c\ub2e4.<\/p>\n  <\/li>\n  <li>\n    <p>API\uac00 \ub9cc\ub4e4\uc5b4\uc9c0\uba74, \ub9ac\uc18c\uc2a4\ub97c \uc0dd\uc131\ud55c\ub2e4.\n<img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/dynamo-with-api\/api-2.png\" alt=\"image-center\" class=\"align-center\" \/>\n<code class=\"language-plaintext highlighter-rouge\">RESTful<\/code>\ud55c API \uaddc\uce59\uc744 \ub530\ub77c\uc918\uc57c \ucd94\ud6c4\uc5d0 <code class=\"language-plaintext highlighter-rouge\">API Gateway caching<\/code>\uc744 \uc774\uc6a9\ud560 \uc218 \uc788\ub2e4. (paramter\uae4c\uc9c0 \uce90\uc2f1\ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0)\n<code class=\"language-plaintext highlighter-rouge\">Resource name\/path<\/code>\ub97c <code class=\"language-plaintext highlighter-rouge\">{test_id}<\/code>\ub85c \uc124\uc815\ud558\uc5ec <code class=\"language-plaintext highlighter-rouge\">DynamoDB<\/code>\uc758 <code class=\"language-plaintext highlighter-rouge\">PK<\/code>\ub97c \ubc1b\uc744 \uc218 \uc788\ub3c4\ub85d \ub9cc\ub4e4\uc790.<\/p>\n  <\/li>\n  <li>\ub9ac\uc18c\uc2a4\uac00 \ub9cc\ub4e4\uc5b4\uc9c0\uba74, \ud574\ub2f9 \ub9ac\uc18c\uc2a4\uc5d0 <code class=\"language-plaintext highlighter-rouge\">GET<\/code> \uba54\uc18c\ub4dc\ub97c \uc0dd\uc131\ud55c\ub2e4.\n<img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/dynamo-with-api\/api-3.png\" alt=\"image-center\" class=\"align-center\" \/>\n    <ul>\n      <li>Intergration type: <code class=\"language-plaintext highlighter-rouge\">AWS Service<\/code><\/li>\n      <li>AWS Region: <code class=\"language-plaintext highlighter-rouge\">ap-northeast-2<\/code><\/li>\n      <li>AWS Service: <code class=\"language-plaintext highlighter-rouge\">DynamoDB<\/code><\/li>\n      <li>HTTP method: <code class=\"language-plaintext highlighter-rouge\">POST<\/code>\n        <ul>\n          <li><code class=\"language-plaintext highlighter-rouge\">API Gateway<\/code> &gt; <code class=\"language-plaintext highlighter-rouge\">DynamoDB<\/code>\uc758 \ud1b5\ud569 \ud638\ucd9c\uc740 \ubaa8\ub450 <code class=\"language-plaintext highlighter-rouge\">POST<\/code>\ub85c \uc9c4\ud589\ud574\uc918\uc57c \uc815\uc0c1\ub3d9\uc791 \ud558\ub294 \uac83 \uac19\ub2e4. \ucd94\ud6c4\uc5d0 \ub2e4\uc2dc \ud655\uc778\ud574 \ubcfc \uc608\uc815.<\/li>\n        <\/ul>\n      <\/li>\n      <li>Action: <code class=\"language-plaintext highlighter-rouge\">GetItem<\/code><\/li>\n      <li>Execution role: 3\ubc88\uc5d0\uc11c \ub9cc\ub4e0 <code class=\"language-plaintext highlighter-rouge\">Role\uc758 ARN<\/code>\uc744 \ub123\uc5b4\uc900\ub2e4.<\/li>\n    <\/ul>\n  <\/li>\n  <li><code class=\"language-plaintext highlighter-rouge\">API Gateway<\/code>\uc758 \ud574\ub2f9 method\uc758  <code class=\"language-plaintext highlighter-rouge\">Intergration Request<\/code>\ub97c \ud074\ub9ad\ud558\uba74, \uadf8\ub9bc\uacfc \uac19\uc774 \uac00\uc7a5 \ud558\ub2e8\uc5d0 <code class=\"language-plaintext highlighter-rouge\">Mapping Templates<\/code>\uac00 \uc788\ub2e4.\n<img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/dynamo-with-api\/api-4.png\" alt=\"image-center\" class=\"align-center\" \/>\n    <ul>\n      <li>\ud15c\ud50c\ub9bf\uc740 \uacf5\uc2dd\ubb38\uc11c\ub97c \ucc38\uace0\ud558\uba74 \ub41c\ub2e4.<\/li>\n      <li><code class=\"language-plaintext highlighter-rouge\">application\/json<\/code>\uc744 \ucd94\uac00\ud558\uace0 <code class=\"language-plaintext highlighter-rouge\">test_id<\/code>\ub97c \uc774\uc6a9\ud574\uc11c <code class=\"language-plaintext highlighter-rouge\">test<\/code> \ud14c\uc774\ube14\uc744 \uc870\ud68c\ud558\ub294 \ud0ec\ud50c\ub9bf\uc744 \uc791\uc131\ud558\uace0 save\ud55c\ub2e4.\n        <div class=\"language-json highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"p\">{<\/span><span class=\"w\"> \n <\/span><span class=\"nl\">\"TableName\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"test\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n <\/span><span class=\"nl\">\"Key\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n <\/span><span class=\"nl\">\"test_id\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\"> \n   <\/span><span class=\"nl\">\"S\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"$input.params('test_id')\"<\/span><span class=\"w\">\n <\/span><span class=\"p\">}<\/span><span class=\"w\">\n <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre><\/div>        <\/div>\n      <\/li>\n    <\/ul>\n  <\/li>\n  <li>\n    <p>\ub4a4\ub85c\uac00\uae30 \ud55c \ud6c4\uc5d0 \uac00\uc7a5 \uc67c\ud3b8\uc744 \ubcf4\uba74 \ud14c\uc2a4\ud2b8\ub77c\uace0 \uc788\ub2e4. \ud574\ub2f9 \ubd80\ubd84\uc744 \ud074\ub9ad\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \ud654\uba74\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.\n<img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/dynamo-with-api\/api-5.png\" alt=\"image-center\" class=\"align-center\" \/>\n\uc6b0\ub9ac\uac00 <code class=\"language-plaintext highlighter-rouge\">DB<\/code>\uc5d0 <u>\ud14c\uc2a4\ud2b8<\/u>\ub77c\ub294 <code class=\"language-plaintext highlighter-rouge\">test_id<\/code>\ub97c \uac00\uc9c0\ub294 \ub370\uc774\ud130\ub97c \ub123\uc5b4\ub1a8\uae30 \ub54c\ubb38\uc5d0, \ud14c\uc2a4\ud2b8\ub77c\ub294 \uac12\uc744 <code class=\"language-plaintext highlighter-rouge\">Path<\/code>\uc5d0 \ub123\uace0 \uc2e4\ud589\ud574\ubcf4\uba74, \uc815\uc0c1\uc801\uc73c\ub85c \ub9ac\ud134\uc774 \uc624\ub294 \uac78 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n  <\/li>\n  <li><code class=\"language-plaintext highlighter-rouge\">GET<\/code>\uc740 \uc644\uc131\ud558\uc600\ub2e4. \uc774\uc81c \ub098\uba38\uc9c0 \uba54\uc18c\ub4dc\ub4e4\ub3c4 \ub9cc\ub4e4\uc5b4\ubcf4\uc790.<br \/>\n<img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/dynamo-with-api\/api-6.png\" alt=\"image-center\" class=\"align-center\" \/>\n\ud750\ub984\uc740 \ub2e4 \ub611\uac19\uc73c\ubbc0\ub85c, \ud558\ub2e8\uc5d0\ub294 \ub9ac\uc18c\uc2a4 \ud560\ub2f9 \ub0b4\uc6a9\uacfc \ud15c\ud50c\ub9bf\ub9cc \uacf5\uc720\ud558\uaca0\ub2e4.<\/li>\n<\/ol>\n\n<hr \/>\n\n<h2 id=\"get\">GET<\/h2>\n<ul>\n  <li>Intergration type: <code class=\"language-plaintext highlighter-rouge\">AWS Service<\/code><\/li>\n  <li>AWS Region: <code class=\"language-plaintext highlighter-rouge\">ap-northeast-2<\/code><\/li>\n  <li>AWS Service: <code class=\"language-plaintext highlighter-rouge\">DynamoDB<\/code><\/li>\n  <li>HTTP method: <code class=\"language-plaintext highlighter-rouge\">POST<\/code><\/li>\n  <li>Action: <code class=\"language-plaintext highlighter-rouge\">GetItem<\/code><\/li>\n  <li>Execution role: 3\ubc88\uc5d0\uc11c \ub9cc\ub4e0 <code class=\"language-plaintext highlighter-rouge\">Role\uc758 ARN<\/code><\/li>\n  <li>Intergration Request - Mapping Templates - application\/json\n    <div class=\"language-json highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"p\">{<\/span><span class=\"w\"> \n  <\/span><span class=\"nl\">\"TableName\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"test\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"Key\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"test_id\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\"> \n      <\/span><span class=\"nl\">\"S\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"$input.params('test_id')\"<\/span><span class=\"w\">\n    <\/span><span class=\"p\">}<\/span><span class=\"w\">\n  <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre><\/div>    <\/div>\n  <\/li>\n<\/ul>\n\n<h2 id=\"post\">POST<\/h2>\n<ul>\n  <li>Intergration type: <code class=\"language-plaintext highlighter-rouge\">AWS Service<\/code><\/li>\n  <li>AWS Region: <code class=\"language-plaintext highlighter-rouge\">ap-northeast-2<\/code><\/li>\n  <li>AWS Service: <code class=\"language-plaintext highlighter-rouge\">DynamoDB<\/code><\/li>\n  <li>HTTP method: <code class=\"language-plaintext highlighter-rouge\">POST<\/code><\/li>\n  <li>Action: <code class=\"language-plaintext highlighter-rouge\">PutItem<\/code><\/li>\n  <li>Execution role: 3\ubc88\uc5d0\uc11c \ub9cc\ub4e0 <code class=\"language-plaintext highlighter-rouge\">Role\uc758 ARN<\/code><\/li>\n  <li>Intergration Request - Mapping Templates - application\/json\n    <div class=\"language-json highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"p\">{<\/span><span class=\"w\"> \n  <\/span><span class=\"nl\">\"TableName\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"test\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"Item\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n        <\/span><span class=\"nl\">\"test_id\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n            <\/span><span class=\"nl\">\"S\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"$input.path('$.test_id')\"<\/span><span class=\"w\">\n        <\/span><span class=\"p\">},<\/span><span class=\"w\">\n        <\/span><span class=\"nl\">\"value\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n            <\/span><span class=\"nl\">\"S\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"$input.path('$.value')\"<\/span><span class=\"w\">\n        <\/span><span class=\"p\">}<\/span><span class=\"w\">\n    <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre><\/div>    <\/div>\n  <\/li>\n<\/ul>\n\n<h2 id=\"put\">PUT<\/h2>\n<ul>\n  <li>Intergration type: <code class=\"language-plaintext highlighter-rouge\">AWS Service<\/code><\/li>\n  <li>AWS Region: <code class=\"language-plaintext highlighter-rouge\">ap-northeast-2<\/code><\/li>\n  <li>AWS Service: <code class=\"language-plaintext highlighter-rouge\">DynamoDB<\/code><\/li>\n  <li>HTTP method: <code class=\"language-plaintext highlighter-rouge\">POST<\/code><\/li>\n  <li>Action: <code class=\"language-plaintext highlighter-rouge\">UpdateItem<\/code><\/li>\n  <li>Execution role: 3\ubc88\uc5d0\uc11c \ub9cc\ub4e0 <code class=\"language-plaintext highlighter-rouge\">Role\uc758 ARN<\/code><\/li>\n  <li>Intergration Request - Mapping Templates - application\/json\n    <div class=\"language-json highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"TableName\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"test\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"Key\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"test_id\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n          <\/span><span class=\"nl\">\"S\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"$input.params('test_id')\"<\/span><span class=\"w\">\n      <\/span><span class=\"p\">}<\/span><span class=\"w\">\n  <\/span><span class=\"p\">},<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"UpdateExpression\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"set value = :val1\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"ExpressionAttributeValues\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\":val1\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"nl\">\"S\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"$input.path('$.value')\"<\/span><span class=\"p\">}<\/span><span class=\"w\">\n  <\/span><span class=\"p\">},<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"ReturnValues\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"ALL_NEW\"<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre><\/div>    <\/div>\n  <\/li>\n<\/ul>\n\n<h2 id=\"delete\">DELETE<\/h2>\n<ul>\n  <li>Intergration type: <code class=\"language-plaintext highlighter-rouge\">AWS Service<\/code><\/li>\n  <li>AWS Region: <code class=\"language-plaintext highlighter-rouge\">ap-northeast-2<\/code><\/li>\n  <li>AWS Service: <code class=\"language-plaintext highlighter-rouge\">DynamoDB<\/code><\/li>\n  <li>HTTP method: <code class=\"language-plaintext highlighter-rouge\">POST<\/code><\/li>\n  <li>Action: <code class=\"language-plaintext highlighter-rouge\">DeleteItem<\/code><\/li>\n  <li>Execution role: 3\ubc88\uc5d0\uc11c \ub9cc\ub4e0 <code class=\"language-plaintext highlighter-rouge\">Role\uc758 ARN<\/code><\/li>\n  <li>Intergration Request - Mapping Templates - application\/json\n    <div class=\"language-json highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"p\">{<\/span><span class=\"w\"> \n  <\/span><span class=\"nl\">\"TableName\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"test\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"Key\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"test_id\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\"> \n      <\/span><span class=\"nl\">\"S\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"$input.params('test_id')\"<\/span><span class=\"w\">\n    <\/span><span class=\"p\">}<\/span><span class=\"w\">\n  <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre><\/div>    <\/div>\n  <\/li>\n<\/ul>\n\n<p class=\"notice--info\"><strong>\uc8fc\uc758\uc810<\/strong> <br \/>\n<code class=\"language-plaintext highlighter-rouge\">PutItem<\/code>\uacfc <code class=\"language-plaintext highlighter-rouge\">UpdateItem<\/code>\uc740 \ud06c\uac8c \ucc28\uc774\uac00 \uc788\ub2e4. <code class=\"language-plaintext highlighter-rouge\">PutItem<\/code>\uc740 \ud574\ub2f9 <code class=\"language-plaintext highlighter-rouge\">PK<\/code>\ub97c \uc7a1\uace0 \ub370\uc774\ud130\ub97c <code class=\"language-plaintext highlighter-rouge\">replace<\/code>\ud574\uc8fc\uace0 <code class=\"language-plaintext highlighter-rouge\">UpdateItem<\/code>\uc740 \uc815\uc758\ud55c \uceec\ub7fc\uac12\ub9cc <code class=\"language-plaintext highlighter-rouge\">set<\/code>\ud574\uc900\ub2e4.<\/p>\n\n<p>\uc644\uc131\ud558\uc600\ub2e4. \uad73\uc774 AWS Lambda\ub97c \uc4f0\uc9c0 \uc54a\uc544\ub3c4 DynamoDB CRUD API\ub97c \ub9cc\ub4e4 \uc218 \uc788\uc5c8\ub2e4.\n\ubc30\ud3ec\ub294 Deploy API\ub97c \ud1b5\ud574\uc11c \uc9c4\ud589\ud558\uba74 \ub41c\ub2e4.<\/p>\n","pubDate":"Tue, 19 Feb 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/dynamodb\/api%20gateway\/aws\/serverless\/aws-dynamo-with-api-gateway\/","guid":"https:\/\/hidekuma.github.io\/dynamodb\/api%20gateway\/aws\/serverless\/aws-dynamo-with-api-gateway\/","category":["aws","dynamo","serverless","DynamoDB","API Gateway","AWS","Serverless"]},{"title":"Docker swarm: \ub3c4\ucee4 \uc2a4\uc6dc\uc5d0\uc11c \uc6cc\ucee4 \/ \ub9e4\ub2c8\uc800 \ub178\ub4dc\uac00 \uc870\uc778\uc774 \uc2e4\ud328\ud560 \uacbd\uc6b0?","description":"<h2 id=\"\ub3c4\ucee4-\uc2a4\uc6dc-\ud658\uacbd\">\ub3c4\ucee4 \uc2a4\uc6dc \ud658\uacbd<\/h2>\n<ul>\n  <li>Versions\n    <ol>\n      <li>Docker (18.09.0)<\/li>\n      <li>Docker (1.23.2)<\/li>\n    <\/ol>\n  <\/li>\n<\/ul>\n\n<p><a href=\"https:\/\/hidekuma.github.io\/docker\/swarm\/docker-swarm\/\">\uc800\ubc88 \ud3ec\uc2a4\ud2b8<\/a>\uc5d0\uc11c \ub3c4\ucee4 \uc2a4\uc6dc \uc0ac\uc6a9\ud6c4\uae30\uc5d0 \ub300\ud574 \ub2e4\ub918\uc5c8\ub294\ub370, \uc774\ubc88\uc5d0 \uc2e4\uc81c\ub85c \ud074\ub77c\uc6b0\ub4dc \uc11c\ube44\uc2a4\ub97c \uc774\uc6a9\ud574 \ub3c4\ucee4 \uc2a4\uc6dc\uc744 \uad6c\ucd95\ud560 \ub54c \ub9c8\uc8fc\ud588\ub358 \ubb38\uc81c\uc5d0 \ub300\ud574 \uacf5\uc720\ud558\uace0\uc790 \ud55c\ub2e4.<\/p>\n\n<hr \/>\n<h1 id=\"\ub2f5\uc740-\ubc29\ud654\ubcbd-\ubb38\uc81c\uc774\ub2e4-\ub2f5\ub9cc-\ube60\ub974\uac8c-\uc54c\uace0-\uac00\uace0\uc2f6\ub2e4\uba74-\ubb38\uc11c-\ub9e8-\ubc11\uc73c\ub85c-\uac00\uba74-\ub41c\ub2e4\">\ub2f5\uc740 \ubc29\ud654\ubcbd \ubb38\uc81c\uc774\ub2e4. \ub2f5\ub9cc \ube60\ub974\uac8c \uc54c\uace0 \uac00\uace0\uc2f6\ub2e4\uba74, \ubb38\uc11c \ub9e8 \ubc11\uc73c\ub85c \uac00\uba74 \ub41c\ub2e4.<\/h1>\n\n<h2 id=\"\ubc1c\uc0dd\ubb38\uc81c\">\ubc1c\uc0dd\ubb38\uc81c<\/h2>\n<ol>\n  <li>\uc560\ucd08\uc5d0 \ub178\ub4dc\uac00 \uc870\uc778\uc774 \ub418\uc9c0 \uc54a\uc74c.<\/li>\n  <li>\ub178\ub4dc\uac00 \uc870\uc778\uc774 \ub418\uc5c8\ub294\ub370\ub3c4 \ubd88\uad6c\ud558\uace0, \ucee8\ud14c\uc774\ub108 \ubc30\ud3ec\uac00 \uc774\ub8e8\uc5b4\uc9c0\uc9c0 \uc54a\uc74c.<\/li>\n<\/ol>\n\n<h2 id=\"\uc6d0\uc778\ud30c\uc545\">\uc6d0\uc778\ud30c\uc545<\/h2>\n<p>\uc0ac\uc2e4 \uc0c1\uae30 \ubc1c\uc0dd \ubb38\uc81c\ub294 \uc608\uc0c1\ud588\ub358\ub300\ub85c \ubc29\ud654\ubcbd\uc758 \ubb38\uc81c\uc600\ub2e4. (AWS\uc5d0\uc11c\ub294 VPC\uc640 Security group\uc774 \uc5f0\uad00\ub420 \uac83\uc774\uba70, GCP\uc5d0\uc11c\ub294 \ubc29\ud654\ubcbd\uaddc\uce59, NCP\uc5d0\uc11c\ub294 ACG\uc5d0\uc11c \uc18c\uc815\uc758 \uc870\uce58\ub97c \ucde8\ud574\uc918\uc57c\ud55c\ub2e4.)<\/p>\n\n<h4 id=\"\uc2a4\uc6dc-\uc124\uc815\">\uc2a4\uc6dc \uc124\uc815<\/h4>\n<p>\uba3c\uc800 \uc6b0\ub9ac\uac00 \uc2a4\uc6dc\uc744 \uc124\uc815\ud560 \ub54c \ud558\uae30\uc640 \uac19\uc774 \ucee4\ub9e8\ub4dc\ub97c \uce5c\ub2e4.<\/p>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>docker swarm init\n<\/code><\/pre><\/div><\/div>\n<p>\uc774 \uacbd\uc6b0 <code class=\"language-plaintext highlighter-rouge\">advertise-addr<\/code>\uc774 <strong>\ub0b4\ubd80 ip<\/strong>\ub85c \uc790\ub3d9\uc73c\ub85c \uc124\uc815\ub41c\ub2e4. \n\uac01 \ub178\ub4dc(\uc11c\ubc84)\uac00 \uac19\uc740 \ub0b4\ubd80\ub9dd \ud558\uc5d0 \uc788\uc744\uacbd\uc6b0\ub294 \ubb38\uc81c\uc5c6\uc774 \ub178\ub4dc\uac00 \uc870\uc778 \ub420 \uac83\uc774\ub098, \uadf8\ub807\uc9c0 \uc54a\uc744\uacbd\uc6b0 <strong>\ud37c\ube14\ub9ad ip<\/strong>\ub85c \ud574\ub2f9 \ubd80\ubd84\uc744 \uc124\uc815\ud574\uc8fc\uc5b4\uc57c\ud55c\ub2e4.\n<!--more--><\/p>\n\n<p>\ubcf4\ud1b5 \ub178\ub4dc\ub07c\ub9ac \ucee4\ub125\uc158\uc774 \uc548 \ub420\uacbd\uc6b0, join \ucee4\ub9e8\ub4dc\uc2dc \ub2e4\uc74c\uacfc \uac19\uc740 \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud55c\ub2e4.<\/p>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>docker swarm <span class=\"nb\">join<\/span> <span class=\"nt\">--token<\/span> SWMTKN-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx &lt;private:ip&gt;:2377\n\nError response from daemon: Timeout was reached before node joined. The attempt to <span class=\"nb\">join <\/span>the swarm will <span class=\"k\">continue in <\/span>the background. Use the <span class=\"s2\">\"docker info\"<\/span> <span class=\"nb\">command <\/span>to see the current swarm status of your node.\nUse the <span class=\"s2\">\"docker info\"<\/span> <span class=\"nb\">command <\/span>to see the current swarm status of your node.\n<\/code><\/pre><\/div><\/div>\n<p>\uc5ec\uae30\uae4c\uc9c0 \uc774\ud574\ud588\ub2e4\uba74, \uc790\uc5f0\uc2a4\ub7fd\uac8c \ubc1c\uc0dd\ubb38\uc81c-1 (\uc560\ucd08\uc5d0 \ub178\ub4dc\uac00 \uc870\uc778\uc774 \ub418\uc9c0 \uc54a\uc74c)\uc758 \ud574\uacb0\ubc95\uc774 \uac10\uc774 \uc62c \uac83\uc774\ub2e4.<\/p>\n\n<h4 id=\"\ud574\uacb0\ubc29\ubc95\">\ud574\uacb0\ubc29\ubc95<\/h4>\n<ol>\n  <li>\uac19\uc740 \ub0b4\ubd80\ub9dd\uc5d0 \uc788\uc744 \uacbd\uc6b0\n    <ul>\n      <li>\ubc29\ud654\ubcbd\uc5d0\uc11c \ud574\ub2f9 \uc11c\ubc84\uc758 tcp 2377 \ud3ec\ud2b8\ub97c \uc5f4\uc5b4\uc900\ub2e4.<\/li>\n    <\/ul>\n  <\/li>\n  <li>\uac19\uc740 \ub0b4\ubd80\ub9dd\uc5d0 \uc788\uc9c0 \uc54a\uc744 \uacbd\uc6b0\n    <ul>\n      <li><code class=\"language-plaintext highlighter-rouge\">advertise-addr<\/code>\uc744 \ud37c\ube14\ub9adip\ub85c \uc124\uc815\ud574\uc900\ub2e4.<\/li>\n      <li>\ubc29\ud654\ubcbd\uc5d0\uc11c \ud574\ub2f9 \uc11c\ubc84\uc758 tcp 2377 \ud3ec\ud2b8\ub97c \uc5f4\uc5b4\uc900\ub2e4.<\/li>\n    <\/ul>\n  <\/li>\n<\/ol>\n\n<h4 id=\"\ud2b9\uc815-ip\ub85c-\ub3c4\ucee4-\uc2a4\uc6dc-\uc124\uc815\ud558\uae30\">\ud2b9\uc815 ip\ub85c \ub3c4\ucee4 \uc2a4\uc6dc \uc124\uc815\ud558\uae30<\/h4>\n<p>\uc2a4\uc6dc\uc744 \uc124\uc815\ud560 \ub54c, \uc544\uc774\ud53c\uc640 \ud3ec\ud2b8\ubc88\ud638\ub97c \uc9c0\uc815\ud574\uc8fc\uba74 \ub418\uba70, \ud3ec\ud2b8\uc758 \ub514\ud3f4\ud2b8 \uac12\uc740 2377 \ud3ec\ud2b8\uc774\ub2e4.<\/p>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>docker swarm init <span class=\"nt\">--advertise-addr<\/span> &lt;public_ip&gt;\n<\/code><\/pre><\/div><\/div>\n<ul>\n  <li>\n    <dl>\n      <dt>advertise-addr<\/dt>\n      <dd>Advertised address (format: &lt;ip\/interface&gt;[:port])<\/dd>\n    <\/dl>\n  <\/li>\n<\/ul>\n\n<p class=\"notice--danger\"><strong>!! \uc8fc\uc758 !!<\/strong> <br \/>\ud574\ub2f9 \ud3ec\ud2b8\ubc88\ud638\ub97c \uae30\ubcf8\uc73c\ub85c \uac00\uc838\uac00\ub294\uac83\uc774 \ubc14\ub78c\uc9c1\ud558\ub098, \ud53c\uce58\ubabb\ud560 \uc0ac\uc815\uc5d0 \uc758\ud574 \ubc14\uafc0\uacbd\uc6b0\uc5d0\ub294 <strong>2376<\/strong> \ud3ec\ud2b8\ub97c \uc81c\uc678\ud558\uace0 \uc124\uc815\ud574\uc57c\ud55c\ub2e4. <strong><u>2376\uc740 docker-machine\uc774 \uc0ac\uc6a9\ud558\ub294 \ud3ec\ud2b8<\/u><\/strong>\uc774\ub2e4.<\/p>\n\n<hr \/>\n\n<h2 id=\"\uacb0\uacfc\uc801\uc73c\ub85c\">\uacb0\uacfc\uc801\uc73c\ub85c<\/h2>\n<p>\ubcf4\ud1b5 1\ubc88 \ubb38\uc81c\uc5d0 \ub300\ud574 \uc778\uc2dd\uc744 \ud558\uc9c0 \ubabb\ud588\uc744 \uacbd\uc6b0, 2\ubc88 \ubb38\uc81c(\ucee8\ud14c\uc774\ub108 \ubc30\ud3ec\uac00 \uc774\ub8e8\uc5b4\uc9c0\uc9c0 \uc54a\uc744 \uacbd\uc6b0)\ub3c4 \uace0\uc2a4\ub780\ud788 \ubc1c\uc0dd\ud55c\ub2e4.\n\ud574\ub2f9 \ubb38\uc81c\ub3c4 \ub3d9\uc77c\ud558\uac8c \ubc29\ud654\ubcbd \ubb38\uc81c\uc774\ub2e4.<\/p>\n\n<p>\ub3c4\ucee4 \uacf5\uc2dd \ubb38\uc11c\uc5d0 \uc758\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \ubc29\ud654\ubcbd\uc744 \uc5f4\uc5b4\uc918\uc57c\ud55c\ub2e4.<\/p>\n<ul>\n  <li>\n    <dl>\n      <dt>TCP:2377<\/dt>\n      <dd>\ud074\ub7ec\uc2a4\ud130 \ub9e4\ub2c8\uc9c0\uba3c\ud2b8(\uc2a4\uc6dc \uc870\uc778\uacfc \uac19\uc740)\uc5d0\uc11c \uc0ac\uc6a9<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt>TCP\/UDP:7946<\/dt>\n      <dd>\ub178\ub4dc\uac04 \ud1b5\uc2e0<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt>UDP:4789<\/dt>\n      <dd>\uc624\ubc84\ub808\uc774 \ub124\ud2b8\uc6cc\ud06c \uac04 \ud2b8\ub798\ud53d \ud1b5\uc2e0<\/dd>\n    <\/dl>\n  <\/li>\n<\/ul>\n\n<p>\uc774\ub807\uac8c \ud574\ub2f9 \uc11c\ubc84\uc758 \ud3ec\ud2b8\ub9cc \uc5f4\uc5b4\uc8fc\uba74, \ubb38\uc81c\uc5c6\uc774 \uc2a4\uc6dc\uc774 \uc804\uac1c\ub41c\ub2e4.<\/p>\n\n<p class=\"notice--info\"><strong>Ingress network\uc5d0\uc11c \uc554\ud638\ud654\ub97c \uc774\uc6a9\ud560 \uacbd\uc6b0<\/strong> <br \/>\uc989, docker network\uc5d0\uc11c <code class=\"language-plaintext highlighter-rouge\">--opt encrypted<\/code> \uc635\uc158\uc744 \uc0ac\uc6a9\ud560 \uacbd\uc6b0\uc5d0\ub294 IP protocol 50 (ESP)\uac00 \uc5f4\ub824\uc788\ub294\uc9c0 \ud655\uc778\ud574\uc57c\ud55c\ub2e4.<\/p>\n","pubDate":"Fri, 18 Jan 2019 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/docker\/swarm\/docker-swarm-fail-join-node-as-worker\/","guid":"https:\/\/hidekuma.github.io\/docker\/swarm\/docker-swarm-fail-join-node-as-worker\/","category":["docker","server orchestration","Docker","Swarm"]},{"title":"Docker swarm: \ub3c4\ucee4 \uc2a4\uc6dc \uc0ac\uc6a9\ud6c4\uae30 > \ubcf5\uc218\uac1c\uc758 \ucee8\ud14c\uc774\ub108 \uc190\uc27d\uac8c \uad00\ub9ac\ud558\uae30","description":"<h3 id=\"\ub3c4\ucee4-\uc2a4\uc6dc-\ud658\uacbd\">\ub3c4\ucee4 \uc2a4\uc6dc \ud658\uacbd<\/h3>\n<ul>\n  <li>Versions\n    <ol>\n      <li>Docker (18.09.0)<\/li>\n      <li>Docker (1.23.2)<\/li>\n    <\/ol>\n  <\/li>\n<\/ul>\n\n<h4 id=\"\ub9ce\uc740-\uc11c\ubc84-\uc624\ucf00\uc2a4\ud2b8\ub808\uc774\uc158-\ud234-\uc911\uc5d0\uc11c-\ub3c4\ucee4-\uc2a4\uc6dc\uc744-\uc120\uc815\ud55c-\uc774\uc720\">\ub9ce\uc740 \uc11c\ubc84 \uc624\ucf00\uc2a4\ud2b8\ub808\uc774\uc158 \ud234 \uc911\uc5d0\uc11c \ub3c4\ucee4 \uc2a4\uc6dc\uc744 \uc120\uc815\ud55c \uc774\uc720?<\/h4>\n<ol>\n  <li>\ub2e4\ub978 \ud234\uc744 \uc124\uce58\ud560 \ud544\uc694\uac00 \uc5c6\ub2e4.<\/li>\n  <li>\ub3c4\ucee4 \uba85\ub839\uc5b4\ub97c \uadf8\ub300\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/li>\n  <li>\uc27d\uace0 \ud3b8\ub9ac\ud588\ub2e4.<\/li>\n  <li>\uc548\uc815\uc131\uc774 \uac80\uc99d\ub418\uc5b4\uc788\ub2e4.<\/li>\n  <li>\uc785\ubb38\uc73c\ub85c \uc88b\ub2e4.<\/li>\n<\/ol>\n\n<h3 id=\"\uc54c\uc544\uc57c\ud560-\uac1c\ub150\">\uc54c\uc544\uc57c\ud560 \uac1c\ub150<\/h3>\n<ul>\n  <li>\n    <dl>\n      <dt>service<\/dt>\n      <dd>\ubc30\ud3ec\ub2e8\uc704, \ud070 \ud2c0<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt>node<\/dt>\n      <dd>\uc2a4\uc6dc\uc5d0 \uc18d\ud574\uc788\ub294 \uc11c\ubc84<\/dd>\n    <\/dl>\n    <ul>\n      <li>\n        <dl>\n          <dt>manager node<\/dt>\n          <dd>worker node\ub97c \uad00\ub9ac\ud558\uba70, worker node\uc5d0\uac8c \uba85\ub839<\/dd>\n        <\/dl>\n      <\/li>\n      <li>\n        <dl>\n          <dt>worker node<\/dt>\n          <dd>\ub9e4\ub2c8\uc800 \ub178\ub4dc\uc758 \uba85\ub839\uc744 \ubc1b\uc544 \uc77c\ud568\n<!--more--><\/dd>\n        <\/dl>\n      <\/li>\n    <\/ul>\n  <\/li>\n<\/ul>\n\n<hr \/>\n<h3 id=\"\uc6d0\ud558\ub294-\uacb0\uacfc-\ud574\ubcf4\ub824\ub294-\uac83\">\uc6d0\ud558\ub294 \uacb0\uacfc (\ud574\ubcf4\ub824\ub294 \uac83)<\/h3>\n<ul>\n  <li>\n    <dl>\n      <dt>AS-IS<\/dt>\n      <dd>\ud604\uc7ac \uc0ac\uc6a9\uc911\uc778 API\uc11c\ubc84\uac00 \uc788\ub294\ub370, \uc2a4\ud399\uc774 \ub098\uc058\uc9c0 \uc54a\ub2e4.(AWS EC2 r5.large) \ud604\uc7ac \uc544\ud0a4\ud14d\ucc98\ub294 <code class=\"language-plaintext highlighter-rouge\">EC2 target group -&gt; ELB -&gt; AutoScaling<\/code>\uc73c\ub85c \ub418\uc5b4\uc788\ub294\ub370, API\uc11c\ubc84\uc5d0\uc11c \ud2b9\uc815 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \ucee4\ub125\uc158\ud560 \ub54c, \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc11c\ubc84\uac00 Pending\uc774 \ub418\ub294\uacbd\uc6b0 timeout\uae4c\uc9c0 \ucee4\ub125\uc158\uc744 \ubb3c\uace0\uc788\uc5b4\uc11c WAS\uac00 \ubc1b\uc544\ub4e4\uc774\ub294 \uc11c\ubc84 \ucee4\ub125\uc158\uc218\uac00 \ubd80\uc871\ud560 \ub54c\uac00 \uc788\ub2e4. \uadf8\ub798\uc11c \ucef4\ud4e8\ud305 \uc790\uc6d0\uc744 \uc804\ubd80 \uc774\uc6a9\ud558\uc9c0 \ubabb\ud558\uace0 \uc624\ud1a0\uc2a4\ucf00\uc77c\ub9c1\uc774 \uc804\uac1c\ub418\uc5b4 \uc694\uae08\uc5d0 \ub2e4\uc18c \uc601\ud5a5\ub825\uc774 \uc788\ub294 \uc0c1\ud669\uc774\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt>TO-BE<\/dt>\n      <dd>\ub2e4 \ud544\uc694\uc5c6\uace0, \uac19\uc740 \uc2a4\ud399\uc758 \uc11c\ubc84 1\ub300\ub85c \ubc84\ud2f8\ub54c\uae4c\uc9c0 \ubc84\ud168\ubcf4\uc790.(\ubb3c\ub860 \uc5b8\uc820\uac04 \uc2a4\ucf00\uc77c\uc544\uc6c3 \ud574\uc57c\ud558\uaca0\uc9c0\ub9cc)<\/dd>\n    <\/dl>\n  <\/li>\n<\/ul>\n\n<p class=\"notice--danger\"><strong>\uc7a0\uc2dc\ub9cc!<\/strong> <br \/>\uadfc\ubcf8\uc801\uc778 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ucabd \ud32c\ub529\uc744 \ud574\uacb0\ud558\uac70\ub098, Auto Scaling\uc774 \uc804\uac1c\ub418\ub294 \uc124\uc815\uc744 \ubc14\uafb8\uac70\ub098, WAS\ub2e8\uc5d0\uc11c \ucee4\ub125\uc158 \uc218\ub97c \uc870\uc808(\uc774\ubbf8 \uc9c4\ud589)\ud560 \uc218\ub3c4 \uc788\uc9c0\ub9cc, \ud544\uc790\ub294 \uad73\uc774 <strong><code class=\"language-plaintext highlighter-rouge\">Docker swarm<\/code><\/strong>\uc744 \uc0ac\uc6a9\ud574\ubcf4\ub824\uace0 \ud55c\ub2e4.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th>\ud56d\ubaa9<\/th>\n      <th>AS-IS<\/th>\n      <th>TO-BE<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>\ucef4\ud4e8\ud305 \uc790\uc6d0\uc0ac\uc6a9\ub960<\/td>\n      <td>20%<\/td>\n      <td>100%<\/td>\n    <\/tr>\n    <tr>\n      <td>\uc11c\ubc84 \uc218<\/td>\n      <td>Auto scaling<\/td>\n      <td>1~n<\/td>\n    <\/tr>\n    <tr>\n      <td>\uc0c1\ud669<\/td>\n      <td>\uc4f8\ub370 \uc5c6\uc774 \uc778\uc2a4\ud134\uc2a4\uac00 \ub298\uc5b4\ub098\uace0 \uc904\uc5b4\uac00\uace0\ub97c \ubc18\ubcf5\ud568<\/td>\n      <td>\uc11c\ubc84 \ud55c\ub300, \ubcf5\uc218\ucee8\ud14c\uc774\ub108\ub85c \ubc84\ud168\ubcf4\uc790<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n<hr \/>\n<h3 id=\"\ub3c4\ucee4-\uc2a4\uc6dc\ub178\ub4dc-\uc124\uc815\ud558\uae30\">\ub3c4\ucee4 \uc2a4\uc6dc\/\ub178\ub4dc \uc124\uc815\ud558\uae30<\/h3>\n<ol>\n  <li>\uc2a4\uc6dc \ucd08\uae30\uc124\uc815\n<br \/>\n\ucee8\ud53d\uc11c\ubc84\ub85c \uc0ac\uc6a9\ud560 \uc11c\ubc84\uc5d0 \ub3c4\ucee4\ub97c \uc124\uce58\ud574\uc900 \ud6c4, \ud558\uae30 \ucee4\uba58\ub4dc\ub97c \uc785\ub825\ud558\uba74 \ud574\ub2f9 \uc11c\ubc84\uac00 <code class=\"language-plaintext highlighter-rouge\">manager node<\/code>\uc778 swarm\uc774 \uc124\uc815\uc774 \ub41c\ub2e4.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>docker swarm init\nSwarm initialized: current node <span class=\"o\">(<\/span>xxxxxxxxxxxxxxxxxx<span class=\"o\">)<\/span> is now a manager.\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>\uc2a4\uc6dc\uc5d0 \ub178\ub4dc \ucd94\uac00\n<br \/>\n\ub098\uac19\uc740 \uacbd\uc6b0\ub294 \uc11c\ubc84 1\ub300\uc5d0 \ubcf5\uc218\uac1c\uc758 \ucee8\ud14c\uc774\ub108\ub97c \ub744\uc6b8 \uc0dd\uac01\uc774\ub098, \ucd94\ud6c4 \uc11c\ubc84 \ud2b8\ub808\ud53d\uc744 \ubd84\uc0b0\ud558\uae30 \uc704\ud574 \ub9e4\ub2c8\uc800\ub178\ub4dc\uc640 \uc790\uc2dd\ub178\ub4dc\ub97c \ucd94\uac00\ud558\ub294 \ubc29\ubc95\ub3c4 \uc18c\uac1c\ud558\uaca0\ub2e4. \ub178\ub4dc\ub97c \ucd94\uac00\ud558\ub824\uba74 \ub9e4\ub2c8\uc800\ub178\ub4dc\uc5d0\uc11c <code class=\"language-plaintext highlighter-rouge\">join token<\/code>\uc744 \ubc1c\uae09 \ubc1b\uc544\uc57c\ud558\ub294\ub370, <code class=\"language-plaintext highlighter-rouge\">--help<\/code>\ub97c \ud558\uba74 \uc54c\uc218 \uc788\uaca0\uc9c0\ub9cc \uac04\ub2e8\ud788 \uc124\uba85\ud558\uaca0\ub2e4.\n    <ul>\n      <li>\n        <dl>\n          <dt>\ub9e4\ub2c8\uc800\ub178\ub4dc \ud1a0\ud070<\/dt>\n          <dd>\n            <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>docker swarm join-token manager\n<\/code><\/pre><\/div>            <\/div>\n          <\/dd>\n        <\/dl>\n      <\/li>\n      <li>\n        <dl>\n          <dt>\uc6cc\ucee4\ub178\ub4dc \ud1a0\ud070<\/dt>\n          <dd>\n            <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>docker swarm join-token worker\n<\/code><\/pre><\/div>            <\/div>\n          <\/dd>\n        <\/dl>\n      <\/li>\n      <li>\n        <dl>\n          <dt>\ub178\ub4dc \ud655\uc778<\/dt>\n          <dd>\n            <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>docker node <span class=\"nb\">ls\n<\/span>ID        HOSTNAME     STATUS    AVAILABILITY    MANAGER STATUS    ENGINE VERSION\nxxxxx <span class=\"k\">*<\/span>   server-01     Ready     Active          Leader            18.09.0\n<\/code><\/pre><\/div>            <\/div>\n          <\/dd>\n        <\/dl>\n      <\/li>\n    <\/ul>\n  <\/li>\n<\/ol>\n\n<p class=\"notice--info\"><strong>\ud1a0\ud070\uc744 \ubc1c\uae09 \ubc1b\uc73c\uba74?<\/strong> <br \/> command\ub97c \ub9ac\ud134\ud574\uc8fc\ub294\ub370 \ub178\ub4dc\ub85c \ucd94\uac00\ud560 \uc11c\ubc84\uc5d0 \uac00\uc11c \ud574\ub2f9 \ucee4\ub9e8\ub4dc\ub97c \ubcf5\ubd99\ud574\uc8fc\uba74 \ub41c\ub2e4. \ub610\ud55c join\uc774 \uc2e4\ud328\ud560 \uacbd\uc6b0\uc5d0\ub294, <a href=\"https:\/\/hidekuma.github.io\/docker\/swarm\/docker-swarm-fail-join-node-as-worker\/\">\ub2e4\uc74c \ud3ec\uc2a4\ud2b8<\/a>\ub97c \ucc38\uace0\ud574\ubcf4\uba74 \ub3c4\uc6c0\uc774 \ub420 \uc218 \uc788\ub2e4.<\/p>\n\n<hr \/>\n<h3 id=\"\ub3c4\ucee4-\uc11c\ube44\uc2a4-\uc0dd\uc131\ud558\uae30\">\ub3c4\ucee4 \uc11c\ube44\uc2a4 \uc0dd\uc131\ud558\uae30<\/h3>\n<ol>\n  <li>\uc11c\ube44\uc2a4 \uc0dd\uc131\n    <ul>\n      <li>\ub178\ub4dc\ub4e4\uc774 \uc0dd\uc131\ub418\uc5c8\uc73c\ub2c8, swarm\uc758 \ud070 \ud2c0\uc778 \uc11c\ube44\uc2a4\ub97c \uad6c\ucd95\ud574\ubcf4\uc790. <code class=\"language-plaintext highlighter-rouge\">name<\/code>\uacfc <code class=\"language-plaintext highlighter-rouge\">image<\/code>\ubd80\ubd84\ub9cc \ubc14\uafd4\uc11c \uc0ac\uc6a9\ud558\uba74 \ub41c\ub2e4. (<code class=\"language-plaintext highlighter-rouge\">-p 80:80<\/code>\uc740 80\ubc88 \uc678\ubd80 \ud3ec\ud2b8\ub97c \ucee8\ud14c\uc774\ub108\uc758 80\ubc88 \ud3ec\ud2b8\ub85c \ud3ec\uc6cc\ub529 \uc2dc\ucf1c\uc900\ub2e4\ub294 \ub73b\uc774\ub2e4.)\n        <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>  <span class=\"nv\">$ <\/span>docker service create <span class=\"nt\">--name<\/span> api <span class=\"nt\">-p<\/span> 80:80 api:latest\n  <span class=\"nv\">$ <\/span>docker service create <span class=\"nt\">--name<\/span> &lt;name&gt; <span class=\"nt\">-p<\/span> 80:80 &lt;image&gt;:&lt;image_version&gt;&gt;\n<\/code><\/pre><\/div>        <\/div>\n      <\/li>\n      <li>\uc11c\ube44\uc2a4 \ud655\uc778\n        <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>  <span class=\"nv\">$ <\/span>docker service <span class=\"nb\">ls\n  <\/span>ID      NAME    MODE           REPLICAS    IMAGE        PORTS\n  xxxx    api     replicated     1\/1         api:latest   <span class=\"k\">*<\/span>:80-&gt;80\/tcp\n<\/code><\/pre><\/div>        <\/div>\n      <\/li>\n    <\/ul>\n  <\/li>\n  <li>\uc11c\ube44\uc2a4 \ub0b4 \ucee8\ud14c\uc774\ub108 \ubcf5\uc81c\n    <ul>\n      <li>\ud604\uc7ac \ud55c \uc11c\ube44\uc2a4\uc5d0 1\uac1c\uc758 \ucee8\ud14c\uc774\ub108\uac00 \ub5a0 \uc788\ub294 \uc0c1\ud669\uc778\ub370, \ubcf5\uc218\uac1c\ub97c \ub744\uc6cc\ubcf4\uc790.\n        <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>  <span class=\"nv\">$ <\/span>docker service scale <span class=\"nv\">api<\/span><span class=\"o\">=<\/span>3\n  api scaled to 3 \n  <span class=\"nv\">$ <\/span>docker service ps api\n  ID       NAME     IMAGE          NODE       DESIRED STATE  CURRENT STATE            \n  xxx1     api.1    api:latest     server-01  Running        Running 3 minutes ago\n  xxx2     api.2    api:latest     server-01  Running        Preparing 4 seconds ago\n  xxx3     api.3    api:latest     server-01  Running        Preparing 4 seconds ago\n<\/code><\/pre><\/div>        <\/div>\n      <\/li>\n    <\/ul>\n  <\/li>\n  <li>\ud558\ub098\uc758 \uc11c\ubc84\uc5d0\uc11c 3\uac1c\uc758 \ucee8\ud14c\uc774\ub108\uac00 \uc804\uac1c\ub418\uc5c8\ub2e4.<\/li>\n<\/ol>\n\n<p class=\"notice--success\"><strong>\ub9cc\uc57d \ub178\ub4dc\uac00 \ubcf5\uc218\uac1c\uc600\ub2e4\uba74?<\/strong> <br \/> \uc608\ub97c \ub4e4\uc5b4, \ub178\ub4dc(\uc11c\ubc84)\uac00 3\uac1c\uc600\ub2e4\uba74, 3\uac1c\uc758 \uc11c\ubc84\uc5d0 \uac01\uac01 \ud558\ub098\uc758 \ucee8\ud14c\uc774\ub108\uac00 \uc804\uac1c\ub41c\ub2e4. \uaf2d \ud558\ub098\uc758 \ub178\ub4dc\uc5d0 \ud55c \uac1c\uc758 \ucee8\ud14c\uc774\ub108\uc77c \ud544\uc694\ub294 \uc5c6\ub2e4.<\/p>\n\n<hr \/>\n<h3 id=\"\ub3c4\ucee4-\uc11c\ube44\uc2a4-\uc0dd\uc131\uc2dc-\ucef4\ud3ec\uc800-\ud30c\uc77c\uc744-\uc774\uc6a9\ud558\uace0-\uc2f6\ub2e4\uba74\">\ub3c4\ucee4 \uc11c\ube44\uc2a4 \uc0dd\uc131\uc2dc, \ucef4\ud3ec\uc800 \ud30c\uc77c\uc744 \uc774\uc6a9\ud558\uace0 \uc2f6\ub2e4\uba74?<\/h3>\n<ol>\n  <li>stack\uc744 \uc774\uc6a9\ud55c\ub2e4.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>  <span class=\"nv\">$ <\/span>docker stack deploy <span class=\"nt\">-c<\/span> .\/docker-compose.yml <span class=\"nt\">--with-registry-auth<\/span> swarm\n  <span class=\"nv\">$ <\/span>docker stack deploy <span class=\"nt\">-c<\/span> &lt;docker-compose.yml path&gt; <span class=\"nt\">--with-registry-auth<\/span> &lt;service_name&gt;\n<\/code><\/pre><\/div>    <\/div>\n    <ul>\n      <li>\n        <dl>\n          <dt>\u2013with-registry-auth<\/dt>\n          <dd>\uc774 \ud30c\ub77c\ubbf8\ud130\ub294 \ub9e4\uc6b0\uc911\uc694\ud558\ub2e4. \ubcf5\uc218 \ub178\ub4dc\uac00 \uc788\uc744\uacbd\uc6b0, worker node\uc5d0\uc11c \uc774\ubbf8\uc9c0 \uc815\ubcf4\ub97c pull \ud560 \ub54c, image\uac00 private\ub77c\uba74 worker node\uc5d0\uc11c\ub3c4 docker login\uc744 \uc9c4\ud589\ud574\uc57c\ud558\ub294\ub370 \uadf8\ub7ec\ud55c \ubd80\ubd84\uc744 \ub9e4\ub2c8\uc800\ub178\ub4dc\uc5d0\uc11c \uc804\ub2ec\ud574\uc8fc\ub294 \uac83(\ub300\uc2e0 \ud574\uc8fc\ub294\uac83)\uc774\ub77c\uace0 \uc0dd\uac01\ud558\uba74 \ub41c\ub2e4.<\/dd>\n        <\/dl>\n      <\/li>\n    <\/ul>\n  <\/li>\n  <li>stack update\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>  <span class=\"nv\">$ <\/span>docker stack deploy\/up <span class=\"nt\">-c<\/span> .\/docker-compose.yml <span class=\"nt\">--with-registry-auth<\/span> swarm\n  <span class=\"nv\">$ <\/span>docker stack deploy\/up <span class=\"nt\">-c<\/span> &lt;docker-compose.yml path&gt; <span class=\"nt\">--with-registry-auth<\/span> &lt;service_name&gt;\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>docker-compose.yml \uc608\uc2dc\n    <div class=\"language-yml highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"na\">version<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">3.7'<\/span>\n<span class=\"na\">services<\/span><span class=\"pi\">:<\/span>\n <span class=\"na\">api<\/span><span class=\"pi\">:<\/span>\n   <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">api<\/span>\n   <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">api:latest<\/span>\n   <span class=\"na\">sysctls<\/span><span class=\"pi\">:<\/span>\n     <span class=\"pi\">-<\/span> <span class=\"s\">net.core.somaxconn=4096<\/span>\n   <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\n     <span class=\"pi\">-<\/span> <span class=\"s1\">'<\/span><span class=\"s\">80:80'<\/span>\n     <span class=\"pi\">-<\/span> <span class=\"s1\">'<\/span><span class=\"s\">443:443'<\/span>\n   <span class=\"na\">command<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.\/entrypoint.sh<\/span>\n   <span class=\"na\">deploy<\/span><span class=\"pi\">:<\/span>\n     <span class=\"na\">mode<\/span><span class=\"pi\">:<\/span> <span class=\"s\">replicated<\/span>\n     <span class=\"na\">replicas<\/span><span class=\"pi\">:<\/span> <span class=\"m\">10<\/span>\n   <span class=\"na\">healthcheck<\/span><span class=\"pi\">:<\/span>\n     <span class=\"na\">test<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">[<\/span><span class=\"s2\">\"<\/span><span class=\"s\">CMD\"<\/span><span class=\"pi\">,<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">curl\"<\/span><span class=\"pi\">,<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">-f\"<\/span><span class=\"pi\">,<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">http:\/\/localhost\"<\/span><span class=\"pi\">]<\/span>\n     <span class=\"na\">interval<\/span><span class=\"pi\">:<\/span> <span class=\"s\">1m30s<\/span>\n     <span class=\"na\">timeout<\/span><span class=\"pi\">:<\/span> <span class=\"s\">10s<\/span>\n     <span class=\"na\">retries<\/span><span class=\"pi\">:<\/span> <span class=\"m\">3<\/span>\n     <span class=\"na\">start_period<\/span><span class=\"pi\">:<\/span> <span class=\"s\">40s<\/span>\n<\/code><\/pre><\/div>    <\/div>\n    <p>\uc5ec\uae30\uc11c \uc911\uc694\ud55c \uac83\uc740, docker-compose \uc5d0\uc11c\ub294 \uc801\uc6a9\ub418\ub358 container_name\uacfc sysctls \uc778\uc790\ub294 swarm\uc5d0\uc11c \uc774\uc6a9\ud560 \uc218 \uc5c6\ub2e4. \ub530\ub77c\uc11c, <strong><u>connection\uc218\ub97c \ub298\ub9ac\ub824\uace0 \ud558\uba74 container\ub97c \ubcf5\uc218\uac1c \ub744\uc6cc\uc8fc\uba74 \ub41c\ub2e4.<\/u><\/strong><\/p>\n    <ul>\n      <li><code class=\"language-plaintext highlighter-rouge\">stack<\/code>\uc744 \uc774\uc6a9\ud55c \uc11c\ube44\uc2a4\ub97c \uc0dd\uc131\ud560 \uacbd\uc6b0, \uc11c\ube44\uc2a4 \uba85\uc740 \ub098\uc758 \uacbd\uc6b0 swam_api\ub85c \uc0dd\uc131\ub41c\ub2e4.(1\ubc88 <code class=\"language-plaintext highlighter-rouge\">&lt;service_name&gt;<\/code>\uc774 \ud504\ub9ac\ud53d\uc2a4\ub41c\ub2e4.)<\/li>\n      <li><code class=\"language-plaintext highlighter-rouge\">healthcheck<\/code>\ub97c \ud1b5\ud574, \uac01 \ucee8\ud14c\uc774\ub108\uc758 \uc0c1\ud0dc\ub97c \uccb4\ud06c\ud574\uc918\uc57c \ub2e4\uc74c\uc5d0 \ub9d0\ud558\ub294 Rolling Update\uac00 \ubb38\uc81c\uc5c6\uc774 \uc801\uc6a9\ub41c\ub2e4.<\/li>\n      <li><code class=\"language-plaintext highlighter-rouge\">replicas: 10<\/code>\uc744 \ud1b5\ud574 container\ub97c 10\uac1c \ubcf5\uc81c\ud558\uc600\ub2e4.<\/li>\n      <li>\uc11c\ube44\uc2a4\ub97c \uc0c8\ub86d\uac8c \uc5c5\ub370\uc774\ud2b8 \ud560 \ub54c, \uc790\ub3d9\uc73c\ub85c \ucee8\ud14c\uc774\ub108\ubcc4\ub85c \uc21c\ucc28\uc801\uc5c5\ub370\uc774\ud2b8\ub97c \uc9c4\ud589\ud55c\ub2e4.(\ub3c4\ucee4 \ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c \ucee8\ud14c\uc774\ub108\uc5d0 \ud3ec\uc6cc\ub529\uc744 \ud574\uc904 \ub54c, healthy\ud55c \ucee8\ud14c\uc774\ub108\uc5d0\ub9cc \ud3ec\uc6cc\ub529\uc744 \ud574\uc900\ub2e4.)<\/li>\n      <li>\uc989 \ubc30\ud3ec\ub97c \ub2e4\uc6b4\ud0c0\uc784\uc774 \uc5c6\uc774 \uc9c4\ud589\ud560 \uc218 \uc788\ub2e4. \ud558\uc9c0\ub9cc \ubaa8\ub4e0 \ucee8\ud14c\uc774\ub108\uc5d0 \ubc30\ud3ec\ub418\uae30\uae4c\uc9c0, \ubc30\ud3ec \uc804\/\ud6c4 \ubc84\uc804\uc774 \uacf5\uc874\ud558\ub294 \uc0c1\ud0dc\uac00 \ub41c\ub2e4.<\/li>\n    <\/ul>\n  <\/li>\n<\/ol>\n\n<p class=\"notice--success\"><strong>\ud14c\uc2a4\ud2b8\uacb0\uacfc<\/strong><br \/>worker node\uc5d0\uc11c\ub294 sysctls\uc778\uc790\uac00 \uba39\ub294\ub370, \ucee4\ub9e8\ub4dc\ub77c\uc778\uc744 \uc785\ub825\ud55c manager node\uc5d0\uc11c\ub9cc \uc548\uba39\ub294\ub2e4. \ub3c4\ucee4\uc5d0\uc11c \uc544\uc9c1 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\ub294\ub2e4\uace0\u2026<\/p>\n\n<hr \/>\n<h3 id=\"\uacb0\uacfc\uc801\uc73c\ub85c-\ub098\uc758-api\uc11c\ubc84\ub294-\uc5b4\ub5bb\uac8c-\ub418\uc5c8\ub098\">\uacb0\uacfc\uc801\uc73c\ub85c \ub098\uc758 API\uc11c\ubc84\ub294 \uc5b4\ub5bb\uac8c \ub418\uc5c8\ub098?<\/h3>\n\n<h4 id=\"as-is\">AS-IS<\/h4>\n<p><img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/api-before.png\" alt=\"image-center\" class=\"align-center\" \/><\/p>\n\n<p>\ucd5c\uadfc 3\uc77c \uc911\uc5d0\uc11c \uac00\uc7a5 \ub9ce\uc774 \ucce4\ub358 \uac83\uc740 5\ubd84\uc5d0 12,000 \uc815\ub3c4\uc600\ub2e4. \uc624\ud1a0 \uc2a4\ucf00\uc77c\ub9c1\uc774 \uc804\uac1c\ub418\uba74 \ub9ce\uc774 \ub730 \ub54c\ub294 \uc57d 6\ub300\uae4c\uc9c0 \ub728\ub2c8, \uc57d 5\ubd84\uc5d0 72,000\uc815\ub3c4 \ud2b8\ub798\ud53d\uc774 \ubc1c\uc0dd\ud55c\ub2e4\uace0 \uac00\uc815\ud558\uc790.<\/p>\n\n<h4 id=\"to-be\">TO-BE<\/h4>\n<p><img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/jmeter-api-test.png\" alt=\"image-center\" class=\"align-center\" \/><\/p>\n\n<p>Jmeter\ub97c \uc774\uc6a9\ud574\uc11c \uc2a4\ud2b8\ub808\uc2a4 \ud14c\uc2a4\ud2b8\ub97c \uc9c4\ud589\ud574\ubcf4\uc558\ub2e4.<\/p>\n<ul>\n  <li>\n    <dl>\n      <dt>\ud14c\uc2a4\ud2b8\ud658\uacbd<\/dt>\n      <dd>500\uba85\uc758 \uc720\uc800(500 Threads)\uac00 0.1 \ucd08\ub2f9 \ud55c\ubc88\uc529 \ub871 \ucee4\ub125\uc158\uc744 \ubb34\ub294 API\ub97c 1\uc2dc\uac04\ub3d9\uc548 \uc811\uc18d\ud55c\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n<\/ul>\n\n<p><img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/jmeter-api-test2.png\" alt=\"image-center\" class=\"align-center\" \/><\/p>\n\n<p>\uacc4\uc0b0\ud574\ubcf4\uba74 5\ubd84\uc5d0 \uc57d 300,000\ud68c \ud638\ucd9c\ud558\ub294 \uc148\uc778\ub370, CPU 80%\uc5d0\uc11c \uc798 \ubc84\ud168\uc8fc\uace0\uc788\ub2e4.<\/p>\n\n<p><img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/api-vmstat.png\" alt=\"image-center\" class=\"align-center\" \/><\/p>\n\n<p>\uc11c\ubc84\uc5d0 \uc811\uc18d\ud574\uc11c \uc2e4\uc2dc\uac04\uc73c\ub85c \ucc0d\uc5b4\ubcf4\ub2c8, \uaf64 \uc5f4\uc2ec\ud788 \uc77c\ud558\ub294 \ubaa8\uc2b5\uc744 \ubcf4\uc5ec\uc8fc\uc5c8\ub2e4.<\/p>\n\n<p class=\"notice--success\"><strong>\uacb0\uacfc\uc801\uc73c\ub85c<\/strong> <br \/> \ub3d9\uc77c \uc2a4\ud399 \uc11c\ubc84 1\ub300\ub97c \ud639\uc0ac\uc2dc\ucf30\uc9c0\ub9cc, \ucda9\ubd84\ud788 \ud604\uc7ac \ud2b8\ub798\ud53d\uc758 \uc57d 4\ubc30\uc758 \ub2ec\ud558\ub294 \ud2b8\ub798\ud53d\uc744 \uc798 \ubc84\ud168\uc8fc\uc5c8\uace0, \uc11c\ubc84\uac00 \ub354 \ud798\ub4e4\uc5b4\ud558\uba74, worker node\ub97c \ubd99\uc5ec\uc918 \uc190\uc27d\uac8c scale out\ud560 \uc218 \uc788\ub2e4.<\/p>\n","pubDate":"Fri, 28 Dec 2018 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/docker\/swarm\/docker-swarm\/","guid":"https:\/\/hidekuma.github.io\/docker\/swarm\/docker-swarm\/","category":["docker","server orchestration","Docker","Swarm"]},{"title":"Linux: Ubuntu16.04: EC2: \uc5b4\ub290\ub0a0 \uac11\uc790\uae30 Read-only file system \uc73c\ub85c \ubcc0\ud574\ubc84\ub838\uc744\ub54c","description":"<h3 id=\"read-only-file-system-error\">Read-only file system ERROR?<\/h3>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">mkdir test\nmkdir<\/span>: cannot create directory <span class=\"s1\">'test'<\/span>: Read-only file system\n<\/code><\/pre><\/div><\/div>\n<p>\uc798 \uc4f0\ub358 EC2 \uc778\uc2a4\ud134\uc2a4\uc5d0\uc11c \uc774\ub7ec\ud55c \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud588\ub2e4. \ubcf4\uc790\ub9c8\uc790 \ud558\uae30 \uc774\uc720\ub4e4\uc774\ub77c\uace0 \uc608\uc0c1\ud588\ub2e4.<\/p>\n<ol>\n  <li>\ub514\uc2a4\ud06c\uc6a9\ub7c9<\/li>\n  <li>\uc544\uc774\ub178\ub4dc \uc6a9\ub7c9<\/li>\n  <li>\uadf8 \uc678<\/li>\n<\/ol>\n\n<p><strong>BUT\u2026<\/strong><\/p>\n<ol>\n  <li>\ub514\uc2a4\ud06c\/\uc544\uc774\ub178\ub4dc \uc6a9\ub7c9\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">df<\/span> <span class=\"nt\">-h<\/span>\nFilesystem      Size  Used Avail Use% Mounted on\n\/dev\/nvme0n1p1  30G   7.7G 22G   27%  \/\n<span class=\"nv\">$ <\/span><span class=\"nb\">df<\/span> <span class=\"nt\">-i<\/span>\nFilesystem      Inodes  IUsed   IFree IUse% Mounted on\n\/dev\/nvme0n1p1 3840000 252936 3587064    7% \/\n<\/code><\/pre><\/div>    <\/div>\n    <p>\uc5b4\ub77c, \uc815\uc0c1\uc774\ub2e4.\n3\ubc88\uc9f8 \uac00\ub2a5\uc131\uc740 \uc800 <code class=\"language-plaintext highlighter-rouge\">Read-only file system<\/code>\ubd80\ubd84\uc774\ub2e4.\n<!--more--><\/p>\n  <\/li>\n  <li>\ud30c\uc77c\uc2dc\uc2a4\ud15c\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">cat<\/span> \/proc\/mounts\n\/dev\/nvme0n1p1 \/ ext4 ro,relatime,discard,data<span class=\"o\">=<\/span>ordered 0 0\n<\/code><\/pre><\/div>    <\/div>\n    <p><code class=\"language-plaintext highlighter-rouge\">ro<\/code>\ub85c \ub418\uc5b4\uc788\ub2e4. \ub9c8\uc6b4\ud305 \uad8c\ud55c\uc774 \uc774\ub807\uac8c \ub418\uc5b4\ubc84\ub9b0 \uc815\ud655\ud55c \uc774\uc720\ub294 \ubabb\ucc3e\uc558\uc73c\ub098, \ud574\ub2f9 \ubd80\ubd84\uc774 \uc0c1\uae30 \uc5d0\ub7ec\ub97c \ubc1c\uc0dd\ud558\ub294\uac83\uc784\uc774 \ud2c0\ub9bc\uc5c6\uc5c8\ub2e4.\n\ub530\ub77c\uc11c, \uad8c\ud55c\uc744 <code class=\"language-plaintext highlighter-rouge\">rw<\/code>\ub85c \ubcc0\uacbd\ud558\uae30\ub85c \ud558\uc600\ub2e4.<\/p>\n  <\/li>\n  <li>\ub9ac\ub9c8\uc6b4\ud305\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">sudo <\/span>umount \/dev\/nvme0n1p1\n<span class=\"nv\">$ <\/span><span class=\"nb\">sudo <\/span>e2fsck \/dev\/nvme0n1p1\n<span class=\"nv\">$ <\/span><span class=\"nb\">sudo <\/span>mount <span class=\"nt\">-o<\/span> remount, rw \/\n<span class=\"nv\">$ <\/span><span class=\"nb\">cat<\/span> \/proc\/mounts\n\/dev\/nvme0n1p1 \/ ext4 rw,relatime,discard,data<span class=\"o\">=<\/span>ordered 0 0\n<\/code><\/pre><\/div>    <\/div>\n    <p><code class=\"language-plaintext highlighter-rouge\">rw<\/code>\ub85c \ubcc0\uacbd\ub418\uc5c8\ub2e4. \uc815\uc0c1\uc801\uc73c\ub85c \ub514\ub809\ud1a0\ub9ac\ub3c4 \uc0dd\uc131\ub41c\ub2e4. \uad6c\uae00\ub9c1\uc5d0 \uc758\ud558\uba74, \uac00\ub054 \ub514\uc2a4\ud06c\uc720\ud2f8\uc774 \ud280\uac70\ub098 \uc624\ub958\ub97c \ubc1c\uc0dd\ud560 \ub54c \uad8c\ud55c\uc774 <code class=\"language-plaintext highlighter-rouge\">ro<\/code>\ub85c \ubc14\ub010\ub2e4\uace0 \ud55c\ub2e4.<\/p>\n    <ul>\n      <li>\n        <dl>\n          <dt>umount<\/dt>\n          <dd>\uccb4\ud06c \ud560 \ud30c\ud2f0\uc158\uc744 umount\ud55c\ub2e4(\ud544\uc218). \ud30c\ud2f0\uc158 \uc190\uc2e4 \uac00\ub2a5\uc131\uc744 \ucd5c\uc18c\ud654\ud558\uae30\uc704\ud568.<\/dd>\n        <\/dl>\n      <\/li>\n      <li>\n        <dl>\n          <dt>e2fsck<\/dt>\n          <dd>\ub9ac\ub205\uc2a4 \ud30c\uc77c\uc2dc\uc2a4\ud15c \uccb4\ud06c\/\ubcf5\uad6c \ud234(inodes, blocks, sizes, directories, links, file counts)<\/dd>\n        <\/dl>\n      <\/li>\n    <\/ul>\n  <\/li>\n  <li>\uc815\uc0c1\ud654\n<img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/remount-error-solved.png\" alt=\"image-center\" class=\"align-center\" \/><\/li>\n<\/ol>\n\n<p>\ub3c4\ub300\uccb4 12\/09 \ubb34\uc2a8\uc77c\uc774 \uc788\uc5c8\ub358\uac70\uc9c0\u2026\n\uadf8\ub9ac\uace0 \ub610 \ud55c\uac00\uc9c0, SSH\uc811\uc18d\uc744 \ub04a\uace0 \uc7ac\uc811\uc18d\uc744 \ud558\ub824\uace0\ud558\ub2c8, \uc811\uc18d\uc774 \uc548\ub418\uc5c8\ub2e4. AWS \ucf58\uc194\uc5d0\uc11c \ud574\ub2f9 EC2\ub97c \ub9ac\ubd80\ud305\ud574\uc8fc\uace0\ub098\uc11c\uc57c SSH\uc811\uc18d\uc774\ub418\uace0 \uc815\uc0c1\ud654\ub418\uc5c8\ub2e4.<\/p>\n","pubDate":"Mon, 10 Dec 2018 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/ec2\/ubuntu\/linux\/remount-ebs\/","guid":"https:\/\/hidekuma.github.io\/ec2\/ubuntu\/linux\/remount-ebs\/","category":["file system","EC2","Ubuntu","Linux"]},{"title":"AWS: \uc11c\uc6b8\ub9ac\uc804 \uc7a5\uc560:\ubbff\ub294 \ub3c4\ub07c\uc5d0 \ubc1c\ub4f1","description":"<h3 id=\"\ubc1c\ub4f1\uc774-\uc544\ud504\ub2e4\">\ubc1c\ub4f1\uc774 \uc544\ud504\ub2e4<\/h3>\n<p>\uc544\uce68\ubd80\ud130 \uc694\ub780\ud558\uac8c \uc804\ud654\uac00 \uc6b8\ub9b0\ub2e4 \ud588\ub354\ub2c8, \uc544\ub2c8\ub098\ub2e4\ub97c\uae4c \uc11c\ubc84\uc7a5\uc560\uac00 \ubc1c\uc0dd\ud588\ub2e4.\n\ud68c\uc0ac\uc5d0 \uc640 \ubcf4\ub2c8 \uc606 \uc790\ub9ac \ub3d9\ub8cc\ub294 \uc774\ubbf8 \uc640\uc11c \uc528\ub984\uc911..\n\ud68c\uc0ac\ub0b4 \uc11c\ube44\uc2a4\uac00 \ubaa8\ub450 AWS\uae30\ubc18\uc774\ub2e4 \ubcf4\ub2c8, \uc628\uac16 \uc7a5\uc560\ub97c \ub2e4 \ubfdc\ubfdc\ud558\uace0\uc788\uc5c8\ub2e4.<\/p>\n\n<h3 id=\"\ub3c4\uba54\uc778\uc11c\ubc84-\uc5d0\ub7ec\">\ub3c4\uba54\uc778\uc11c\ubc84 \uc5d0\ub7ec<\/h3>\n<p>\uc544\uc9c1 \uc815\ud655\ud55c \uc5d0\ub7ec\ub0b4\uc6a9\uc744 AWS\uce21\uc5d0\uc11c \uc624\ud508\ud55c\uac74 \uc544\ub2c8\ub098, DNS \uc7a5\uc560\ub85c \ud310\ub2e8\uc774 \ub418\uc5c8\ub2e4.\nAWS route53\uc5d0\uc11c \uc11c\ube0c\ub3c4\uba54\uc778\uc744 \uc774\uc6a9\ud558\uc5ec \ucee4\ub125\uc158\uc744 \uc7a1\ub294 \uacbd\uc6b0 2\ucc28 \uc7a5\uc560\uac00 \uc788\ub2e4\uace0\ud558\ub2c8, AWS \ub178\uc608\ub4e4\uc740 \uc870\uc2ec\ud558\ub3c4\ub85d\u2026\n3\uc2dc\uac04 \uc774\uc0c1 \uc7a5\uc560\uac00 \uc9c0\uc5f0\ub418\uba74, \ubcf4\uc0c1\ud574\uc900\ub2e4\uace0 \uc5b4\ub514\uc11c \ub4e4\uc5c8\ub294\ub370 \ub9de\ub098?\n<!--more--><\/p>\n\n<h3 id=\"aws-\ub9ac\uc804\ubcc4-health-check\">AWS \ub9ac\uc804\ubcc4 health check<\/h3>\n<p><a href=\"https:\/\/status.aws.amazon.com\/#AP_block\">AWS service health dashboard<\/a>\n8:30 \ubd80\ud130 \uc7a5\uc560\ubc1c\uc0dd\ud574\uc11c, \ud604\uc2dc\uac04 11:00 \uae30\uc900 \uac70\uc758 \ucf00\uc774\uc2a4 \ud074\ub85c\uc988 \ub418\uc5c8\uc9c0\ub9cc, \uc544\uc9c1 Lambda\ub294 \uc815\uc2e0 \ubabb\ucc28\ub9ac\ub294 \uc0c1\ud0dc\uc778\ub4ef.\n\uadf8\ub798\uc11c \ud68c\uc0ac\ub0b4 \ud55c \uc11c\ube44\uc2a4\uac00 \uc81c\ub300\ub85c \ubcf5\uad6c\uac00 \ub418\uc9c0 \ubabb\ud588\ub2e4.<\/p>\n\n<h3 id=\"\uac10\uc0c1\ubb38\">\uac10\uc0c1\ubb38<\/h3>\n<p>\ud074\ub77c\uc6b0\ub4dc\ub97c \uae30\ubc18\uc73c\ub85c \ud55c SaaS\ub294 \uc774\ub807\uac8c \ud55c \ud68c\uc0ac\uc758 \uc7a5\uc560\ub85c \ud070 \ud0c0\uaca9\uc744 \ubc1b\uc744 \uc218 \uc788\uad6c\ub098 \uc0dd\uac01\ud588\ub2e4. \uc6b0\ub9ac\ud68c\uc0ac\ubfd0\ub9cc\uc544\ub2c8\ub77c \ucfe0\ud321, KBS, \ubc30\ubbfc\u2026\n\ub2e4 \ub0a0\uace0 \uae34\ub2e4\ub294 \uae30\uc5c5\ub4e4\uc778\ub370\ub3c4 \uc678\uad6d\uc758 \ud55c \ud68c\uc0ac\uc5d0 \uc758\uc874\uc131\uc774 \uc774\ub807\uac8c \ud06c\ub2e4\ub2c8. \ubd80\ubaa8 \ud074\ub798\uc2a4\uac00 \ub9db\uc774 \uac00\ub294\uac70\ub2c8, \ub300\uccb4\ud560 \ubd80\ubaa8\ud074\ub798\uc2a4\ub97c \ub530\ub85c \ub9cc\ub4e4\uc5b4 \ub193\ub294\ud3b8\uc774 \uc88b\uc740\uac00?\n\uc606 \ub3d9\ub8cc\uac00 \ud074\ub77c\uc6b0\ub4dc \uc774\uc911\ud654?\uc5d0\ub300\ud574 \uac70\ub860 \ud558\uc600\ub294\ub370, \ud55c\ubc88 \uc0b4\ud3b4\ubd10\uc57c\uaca0\ub2e4.\n\uc624\ub298 \uc544\uce68\ubd80\ud130 \uace0\uc0dd\ud55c \uac1c\ubc1c\uc790\ubd84\ub4e4 \ud654\uc774\ud305.<\/p>\n\n","pubDate":"Thu, 22 Nov 2018 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/aws-seoul-region-error\/","guid":"https:\/\/hidekuma.github.io\/aws-seoul-region-error\/"},{"title":"MacOS: \ub9e5\uc5d0\uc11c Mojave(\ubaa8\ud558\ube44) \uc5c5\ub370\uc774\ud2b8 \ud6c4 vim \uc5d0\ub7ec","description":"<h3 id=\"\ub9e5-\ubaa8\ud558\ube44-\uc5c5\ub370\uc774\ud2b8\ub97c-\ud588\ub290\ub370-\uc774\uac8c-\uc660\uac78-vim\uc774-\uc5d0\ub7ec\ub728\uba74\uc11c-\uaebc\uc9c4\ub2e4\">\ub9e5 \ubaa8\ud558\ube44 \uc5c5\ub370\uc774\ud2b8\ub97c \ud588\ub290\ub370 \uc774\uac8c \uc660\uac78.. vim\uc774 \uc5d0\ub7ec\ub728\uba74\uc11c \uaebc\uc9c4\ub2e4.<\/h3>\n<p><strong>Exception MemoryError: MemoryError() in module threading from python<\/strong><\/p>\n\n<p>\ubaa8\ud558\ube44 \uc5c5\ub370\uc774\ud2b8\uc2dc, \uc560\ud50c\uc5d0\uc11c <code class=\"language-plaintext highlighter-rouge\">vim<\/code>\uc744 \uac15\uc81c \ucef4\ud30c\uc77c \ud558\ub294\uac78\ub85c \uc54c\uace0\uc788\ub294\ub370, \ubcf5\ubd88\ubcf5\uc778\uac00. \uc8fc\ubcc0 \ub3d9\ub8cc\ub294 \ubb38\uc81c\uc5c6\uc774 \uc5c5\ub370\uc774\ud2b8 \ub418\uc5c8\ub294\ub370, \ub098\ub9cc \ud574\ub2f9\uc5d0\ub7ec\uac00 \ubfdc\ubfdc\ud558\uba74\uc11c \uaebc\uc84c\ub2e4.\n<code class=\"language-plaintext highlighter-rouge\">brew<\/code>\ub85c <code class=\"language-plaintext highlighter-rouge\">vim<\/code>\uc744 \uc0c8\ub85c \uc124\uce58\ud558\uace0, <code class=\"language-plaintext highlighter-rouge\">alias vi=vim<\/code>\uc73c\ub85c \ud574\uc918\ub3c4 \ud574\uacb0\ud560 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n<p>\uadf8\ub7ec\ub098, <code class=\"language-plaintext highlighter-rouge\">git<\/code>\uc5d0\uc11c <code class=\"language-plaintext highlighter-rouge\">system vim<\/code>\uc744 \ubcf4\uace0\uc788\uae30\ub54c\ubb38\uc5d0, \uc18c\uc2a4 \ubcd1\ud569\uc2dc \ucee4\ubc0b\uba54\uc138\uc9c0\ub97c \ubcf4\ub0bc \ub54c \uc5d0\ub7ec\uac00 \ub72c\ub2e4.\n\uad6c\uae00\ub9c1\ud558\ub2e4\ubcf4\ub2c8 \ub098\uc640 \uac19\uc740 \ud604\uc0c1\uc758 \uc0ac\ub78c\ub4e4\uc774 \uc885\uc885 \ubcf4\uc774\ub294\uac83 \uac19\ub2e4. \uadf8\ub798\uc11c \ud574\uacb0\ubc95\uc744 \uacf5\uc720\ud558\uace0\uc790\ud55c\ub2e4.<\/p>\n\n<!--more-->\n<h3 id=\"\ud574\uacb0\ubc95\">\ud574\uacb0\ubc95<\/h3>\n<ol>\n  <li>\ubc84\uc804\uc744 \ud55c\ubc88 \ud655\uc778\ud574\ubcf4\uc790.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>vi <span class=\"nt\">--version<\/span>\nVIM - Vi IMproved 8.0 <span class=\"o\">(<\/span>2018 May 18, compiled Nov  6 2018 11:52:26<span class=\"o\">)<\/span>\nmacOS version\nIncluded patches: 1-500\nCompiled by root@apple.com\n<\/code><\/pre><\/div>    <\/div>\n    <p><code class=\"language-plaintext highlighter-rouge\">root@apple.com<\/code>\uc5d0 \uc758\ud574 \ucef4\ud30c\uc77c \ub41c\uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n  <\/li>\n  <li>\uba3c\uc800 brew\ub85c \uc124\uce58\ud55c vim\uc774 \uc788\ub2e4\uba74 \uc9c0\uc6cc\uc8fc\uc790.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>brew uninstall vim\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>vim\uc744 \uc124\uce58\ud558\ub294\ub370 \uc2dc\uc2a4\ud15c vim\uc744 \ub36e\uc5b4\uc4f0\uae30\ud55c\ub2e4.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>brew <span class=\"nb\">install <\/span>vim <span class=\"nt\">--with-lua<\/span> <span class=\"nt\">--with-override-system-vi<\/span>\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>\ud130\ubbf8\ub110\uc774\ub098 \uc258\uc744 \ub2e4\uc2dc \uc2e4\ud589\uc2dc\ucf1c\ubcf4\uba74 \uc815\uc0c1\uc801\uc73c\ub85c \ub3d9\uc791\ud55c\ub2e4.\n\ub098\ucc98\ub7fc \uace0\uc0dd\ud558\ub294 \uc77c\uc774 \uc5c6\uc73c\uba74 \uc88b\uaca0\ub2e4.<\/li>\n<\/ol>\n","pubDate":"Tue, 06 Nov 2018 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/mac\/macos\/mojave\/vim\/update-mac-to-mojave-vim-error\/","guid":"https:\/\/hidekuma.github.io\/mac\/macos\/mojave\/vim\/update-mac-to-mojave-vim-error\/","category":["macOS","vim","Mac","MacOS","Mojave","Vim"]},{"title":"Python: \ud30c\uc774\uc36c\uc5d0\uc11c GraphQL + SQLAlchemy > Model(Enum) Error \ub300\ucc98","description":"<h3 id=\"graphql--sqlalchemy-\ub9ac\ud50c\ub809\uc158\uc2dc-enum\uc774-\uc788\ub294-\ubaa8\ub378-\uc5d0\ub7ec-\ubc1c\uc0dd\uc2dc-\ub300\ucc98\ubc95\">GraphQL + SQLAlchemy \ub9ac\ud50c\ub809\uc158\uc2dc, Enum\uc774 \uc788\ub294 \ubaa8\ub378 \uc5d0\ub7ec \ubc1c\uc0dd\uc2dc \ub300\ucc98\ubc95<\/h3>\n<p>\uadf8\ub798\ud504QL\uc5d0\uc11c <code class=\"language-plaintext highlighter-rouge\">schema.py<\/code>\ub97c \uc791\uc131\uc2dc, \ucc98\uc74c\ubd80\ud130 \uc120\uc5b8\ud558\ub294 \ubc29\uc2dd\uc774 \uc544\ub2cc <code class=\"language-plaintext highlighter-rouge\">SQLAlchemy<\/code> \ubaa8\ub378 \ub9ac\ud50c\ub809\uc158\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc2a4\ud0a4\ub9c8\ub97c \ube4c\ub4dc\ud558\uba74 \ub9e4\uc6b0 \ud3b8\ub9ac\ud558\ub2e4. \ud558\uc9c0\ub9cc, \ubaa8\ub378\uc5d0 Enum \uceec\ub7fc\uc774 \uc874\uc7ac\ud558\uba74, \ud574\ub2f9 \ubaa8\ub378\uc740 \ubb38\uc790\uc5f4\ub85c \ucc98\ub9ac\ub418\uc5b4, <code class=\"language-plaintext highlighter-rouge\">type.name<\/code>\uc774 <code class=\"language-plaintext highlighter-rouge\">None<\/code>\uc744 \ubc18\ud658, \uc5f4\uac70\ud615 \ubcc0\ud658\uc774 \uc2e4\ud328\ud55c\ub2e4. \uc5d0\ub7ec \uc608\uc2dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n<ul>\n  <li>Error\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>enum_class <span class=\"o\">=<\/span> super<span class=\"o\">()<\/span>.__new__<span class=\"o\">(<\/span>metacls, cls, bases, classdict<span class=\"o\">)<\/span>\nTypeError: type.__new__<span class=\"o\">()<\/span> argument 1 must be str, not None\n<\/code><\/pre><\/div>    <\/div>\n    <p>\ud574\ub2f9 \uc5d0\ub7ec\ub97c \ubfdc\uc73c\uba74\uc11c <code class=\"language-plaintext highlighter-rouge\">app.py<\/code>\uac00 \uc2e4\ud589\uc548\ub41c\ub2e4.<\/p>\n  <\/li>\n<\/ul>\n\n<!--more-->\n<ul>\n  <li>schema.py\n<br \/>\n    <div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kn\">import<\/span> <span class=\"nn\">graphene<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">graphene<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">relay<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">graphene_sqlalchemy<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">SQLAlchemyConnectionField<\/span><span class=\"p\">,<\/span> <span class=\"n\">SQLAlchemyObjectType<\/span><span class=\"p\">,<\/span> <span class=\"n\">utils<\/span><span class=\"p\">,<\/span> <span class=\"n\">converter<\/span>\n<span class=\"c1\"># Model\ub0b4\ubd80\uc5d0 Enum \uceec\ub7fc\uc774 \uc788\uc74c.\n<\/span><span class=\"kn\">from<\/span> <span class=\"nn\">model<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">ModelWithEnum<\/span> <span class=\"k\">as<\/span> <span class=\"n\">ModelWithEnumModel<\/span>\n<span class=\"c1\"># GraphQL\uc6a9 \ubaa8\ub378\uc120\uc5b8\n<\/span><span class=\"k\">class<\/span> <span class=\"nc\">ModelWithEnum<\/span><span class=\"p\">(<\/span><span class=\"n\">SQLAlchemyObjectType<\/span><span class=\"p\">):<\/span>\n  <span class=\"k\">class<\/span> <span class=\"nc\">Meta<\/span><span class=\"p\">:<\/span>\n      <span class=\"n\">model<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ModelWithEnumModel<\/span>\n      <span class=\"n\">interfaces<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">relay<\/span><span class=\"p\">.<\/span><span class=\"n\">Node<\/span><span class=\"p\">,<\/span> <span class=\"p\">)<\/span>\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n<\/ul>\n\n<hr \/>\n<h3 id=\"solution\">Solution<\/h3>\n<p>\ud574\ub2f9 \ubd80\ubd84\uc744 \ud574\uacb0\ud558\uae30 \uc704\ud574\uc120, <code class=\"language-plaintext highlighter-rouge\">graphene_sqlalchemy<\/code>\ub97c \uc218\uc815\ud574\uc918\uc57c\ud55c\ub2e4. \ud574\ub2f9 \ud328\ud0a4\uc9c0\ub97c \uc9c1\uc811 \uc218\uc815\ud574\uc918\ub3c4 \ub418\ub294\ub370, \ub098 \uac19\uc740 \uacbd\uc6b0 \uc18c\uc2a4\ub97c <code class=\"language-plaintext highlighter-rouge\">git<\/code>\uc73c\ub85c \uad00\ub9ac\ud558\uae30\ub54c\ubb38\uc5d0, \ud504\ub85c\uc81d\ud2b8 \ub514\ub809\ud1a0\ub9ac\uc5d0 <kbd>Copy<\/kbd> &amp; <kbd>Paste<\/kbd>\ud574\uc11c \ub530\ub85c \uad00\ub9ac\ud558\uae30\ub85c \ud588\ub2e4.<\/p>\n\n<h4 id=\"\uc8fc\uc694-\ud328\ud0a4\uc9c0-\ubc84\uc804\ub4e4\">\uc8fc\uc694 \ud328\ud0a4\uc9c0 \ubc84\uc804\ub4e4<\/h4>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>Flask               1.0.2\nFlask-GraphQL       2.0.0\ngraphene            2.1.3\ngraphene-sqlalchemy 2.1.0 <span class=\"o\">(<\/span>\ud504\ub85c\uc81d\ud2b8\uc5d0 \ubcf5\uc0ac \ud6c4 \uc5b8\uc778\uc2a4\ud1a8<span class=\"o\">)<\/span>\ngraphql-core        2.1\ngraphql-relay       0.4.5\ngraphql-server-core 1.1.1\nmysqlclient         1.3.13\nPyMySQL             0.9.2\nsqlacodegen         2.0.1\nSQLAlchemy          1.1.14\n<\/code><\/pre><\/div><\/div>\n\n<h4 id=\"\ud574\uacb0\uc21c\uc11c\">\ud574\uacb0\uc21c\uc11c<\/h4>\n<p>1) \ud504\ub85c\uc81d\ud2b8\ub85c \ud328\ud0a4\uc9c0 \ubcf5\uc0ac (\ud6c4\ubbf8\uc5d0 <code class=\"language-plaintext highlighter-rouge\">_customized<\/code>\ub77c\uace0 \ubd99\uc5ec\uc8fc\uc5c8\ub2e4)<\/p>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nb\">cp<\/span> <span class=\"nt\">-rf<\/span> ~\/.virtualenvs\/[\uac00\uc0c1\ud658\uacbd\uc774\ub984]\/lib\/python3.6\/site-packages\/graphene_sqlalchemy path\/to\/project\/graphene_sqlalchemy_customized\npip uninstall graphene-sqlalchemy <span class=\"nt\">-y<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>2) \ud574\ub2f9 \ud328\ud0a4\uc9c0\uc758 <code class=\"language-plaintext highlighter-rouge\">converter.py<\/code> \uc218\uc815<\/p>\n<ul>\n  <li>Before\n    <div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># converter.py\n<\/span><span class=\"o\">@<\/span><span class=\"n\">convert_sqlalchemy_type<\/span><span class=\"p\">.<\/span><span class=\"n\">register<\/span><span class=\"p\">(<\/span><span class=\"n\">types<\/span><span class=\"p\">.<\/span><span class=\"n\">Enum<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">def<\/span> <span class=\"nf\">convert_enum_to_enum<\/span><span class=\"p\">(<\/span><span class=\"nb\">type<\/span><span class=\"p\">,<\/span> <span class=\"n\">column<\/span><span class=\"p\">,<\/span> <span class=\"n\">registry<\/span><span class=\"o\">=<\/span><span class=\"bp\">None<\/span><span class=\"p\">):<\/span>\n  <span class=\"k\">try<\/span><span class=\"p\">:<\/span>\n      <span class=\"n\">items<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">type<\/span><span class=\"p\">.<\/span><span class=\"n\">enum_class<\/span><span class=\"p\">.<\/span><span class=\"n\">__members__<\/span><span class=\"p\">.<\/span><span class=\"n\">items<\/span><span class=\"p\">()<\/span>\n  <span class=\"k\">except<\/span> <span class=\"nb\">AttributeError<\/span><span class=\"p\">:<\/span>\n      <span class=\"n\">items<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">zip<\/span><span class=\"p\">(<\/span><span class=\"nb\">type<\/span><span class=\"p\">.<\/span><span class=\"n\">enums<\/span><span class=\"p\">,<\/span> <span class=\"nb\">type<\/span><span class=\"p\">.<\/span><span class=\"n\">enums<\/span><span class=\"p\">)<\/span>\n  <span class=\"k\">return<\/span> <span class=\"n\">Field<\/span><span class=\"p\">(<\/span>\n      <span class=\"n\">Enum<\/span><span class=\"p\">(<\/span><span class=\"nb\">type<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"n\">items<\/span><span class=\"p\">),<\/span>\n      <span class=\"n\">description<\/span><span class=\"o\">=<\/span><span class=\"n\">get_column_doc<\/span><span class=\"p\">(<\/span><span class=\"n\">column<\/span><span class=\"p\">),<\/span>\n      <span class=\"n\">required<\/span><span class=\"o\">=<\/span><span class=\"ow\">not<\/span> <span class=\"p\">(<\/span><span class=\"n\">is_column_nullable<\/span><span class=\"p\">(<\/span><span class=\"n\">column<\/span><span class=\"p\">)),<\/span>\n  <span class=\"p\">)<\/span> \n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>After\n    <div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># converter.py\n<\/span><span class=\"o\">@<\/span><span class=\"n\">convert_sqlalchemy_type<\/span><span class=\"p\">.<\/span><span class=\"n\">register<\/span><span class=\"p\">(<\/span><span class=\"n\">types<\/span><span class=\"p\">.<\/span><span class=\"n\">Enum<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">def<\/span> <span class=\"nf\">convert_enum_to_enum<\/span><span class=\"p\">(<\/span><span class=\"nb\">type<\/span><span class=\"p\">,<\/span> <span class=\"n\">column<\/span><span class=\"p\">,<\/span> <span class=\"n\">registry<\/span><span class=\"o\">=<\/span><span class=\"bp\">None<\/span><span class=\"p\">):<\/span>\n  <span class=\"k\">try<\/span><span class=\"p\">:<\/span>\n      <span class=\"n\">items<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">type<\/span><span class=\"p\">.<\/span><span class=\"n\">enum_class<\/span><span class=\"p\">.<\/span><span class=\"n\">__members__<\/span><span class=\"p\">.<\/span><span class=\"n\">items<\/span><span class=\"p\">()<\/span>\n  <span class=\"k\">except<\/span> <span class=\"nb\">AttributeError<\/span><span class=\"p\">:<\/span>\n      <span class=\"n\">items<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">zip<\/span><span class=\"p\">(<\/span><span class=\"nb\">type<\/span><span class=\"p\">.<\/span><span class=\"n\">enums<\/span><span class=\"p\">,<\/span> <span class=\"nb\">type<\/span><span class=\"p\">.<\/span><span class=\"n\">enums<\/span><span class=\"p\">)<\/span>\n  <span class=\"c1\"># \ubcc0\uacbd\ub2e8\n<\/span>  <span class=\"n\">enum_name<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">type<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span> <span class=\"ow\">or<\/span> <span class=\"s\">\"{}_{}\"<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">column<\/span><span class=\"p\">.<\/span><span class=\"n\">table<\/span><span class=\"p\">,<\/span> <span class=\"n\">column<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">)<\/span>\n  <span class=\"k\">return<\/span> <span class=\"n\">Field<\/span><span class=\"p\">(<\/span>\n      <span class=\"n\">Enum<\/span><span class=\"p\">(<\/span><span class=\"n\">enum_name<\/span><span class=\"p\">,<\/span> <span class=\"n\">items<\/span><span class=\"p\">),<\/span>\n      <span class=\"n\">description<\/span><span class=\"o\">=<\/span><span class=\"n\">get_column_doc<\/span><span class=\"p\">(<\/span><span class=\"n\">column<\/span><span class=\"p\">),<\/span>\n      <span class=\"n\">required<\/span><span class=\"o\">=<\/span><span class=\"ow\">not<\/span> <span class=\"p\">(<\/span><span class=\"n\">is_column_nullable<\/span><span class=\"p\">(<\/span><span class=\"n\">column<\/span><span class=\"p\">)),<\/span>\n  <span class=\"p\">)<\/span>\n<\/code><\/pre><\/div>    <\/div>\n    <p>\ud574\ub2f9 \ud568\uc218\uc758 <code class=\"language-plaintext highlighter-rouge\">type.name<\/code>\uc744 \uc774\uc640\uac19\uc774 \uc218\uc815\ud558\uba74 \uc815\uc0c1\ud654\ub41c\ub2e4.<\/p>\n  <\/li>\n<\/ul>\n\n","pubDate":"Wed, 17 Oct 2018 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/python\/graphql\/sqlalchemy\/graphql%20enum\/graphql-with-python-enum-error\/","guid":"https:\/\/hidekuma.github.io\/python\/graphql\/sqlalchemy\/graphql%20enum\/graphql-with-python-enum-error\/","category":["python","graphql","sqlalchemy","flask","enum","error","Python","GraphQL","SQLAlchemy","GraphQL Enum"]},{"title":"Python: \ud30c\uc774\uc36c\uc5d0\uc11c \uadf8\ub798\ud504QL\uc0ac\uc6a9\ud574\ubcf4\uae30. (GraphQL with Flask)","description":"<h3 id=\"graphql\">GraphQL<\/h3>\n<p><code class=\"language-plaintext highlighter-rouge\">GraphQL<\/code>\uc740 \ud398\uc774\uc2a4\ubd81\uc774 \uac1c\ubc1c\ud55c \ub370\uc774\ud130 \uc9c8\uc758\uc5b4\ub2e4. Facebook\uc758 <code class=\"language-plaintext highlighter-rouge\">graph API<\/code>\ub97c \uc0ac\uc6a9\ud574 \ubcf8 \uc0ac\ub78c\uc774\ub77c\uba74 \uad6c\uc870\uac00 \uaf64\ub098 \uce5c\uc219\ud560 \uc218 \uc788\ub2e4. \ud68c\uc0ac \ud2b9\uc131\uc0c1, <code class=\"language-plaintext highlighter-rouge\">Facebook<\/code>\uacfc\uc758 \uc811\uc810\uc774 \ub9ce\uc740 \ub098\uc5d0\uac90 \ub2f9\uc7a5 \uc0ac\uc6a9\ud574\ubcf4\uace0 \uc2f6\uc5c8\ub2e4. \uadf8\ub798\ud504QL\uc740 \ub530\ub85c API\ub97c \uc81c\uc791\ud558\uc9c0 \uc54a\uc544\ub3c4, \uc0ac\uc6a9\uc790\uac00 \uc5b4\ub5a4 \ub370\uc774\ud130\uac00 \ud544\uc694\ud55c\uc9c0 \uba85\uc2dc\ud558\ub294 \uac83\ub9cc\uc73c\ub85c \uc6d0\ud558\ub294 \ub370\uc774\ud130\ub97c \uc5bb\uac70\ub098 \ucee8\ud2b8\ub864 \ud560 \uc218 \uc788\ub2e4.<\/p>\n\n<ul>\n  <li>\uc18c\uc2a4\ub294 <a href=\"https:\/\/github.com\/graphql-python\/graphene-sqlalchemy\">graphql-python<\/a>\uc744 \ucc38\uace0\ud558\uba74 \ub41c\ub2e4. \ud574\ub2f9 \uc18c\uc2a4\ub97c <code class=\"language-plaintext highlighter-rouge\">git clone<\/code> \ud6c4 <code class=\"language-plaintext highlighter-rouge\">examples\/flask_sqlalchemy<\/code>\ub97c \ucc38\uace0\ud558\uc600\ub2e4.<\/li>\n<\/ul>\n\n<!--more-->\n<hr \/>\n\n<h3 id=\"install--run\">Install &amp; Run<\/h3>\n<p>1) \uc124\uce58\ub97c \uc9c4\ud589\ud574\ubcf4\uc790. \uac00\uc0c1\ud658\uacbd\uc5d0\uc11c \ud574\ub2f9 \ud328\ud0a4\uc9c0\ub4e4\uc744 <code class=\"language-plaintext highlighter-rouge\">pip install -r requirements.txt<\/code> \ud558\uba74\ub41c\ub2e4.<\/p>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">cat <\/span>requirements.txt\ngraphene[sqlalchemy]\n<span class=\"nv\">SQLAlchemy<\/span><span class=\"o\">==<\/span>1.0.11\n<span class=\"nv\">Flask<\/span><span class=\"o\">==<\/span>0.10.1\nFlask-GraphQL<span class=\"o\">==<\/span>1.3.0\n<\/code><\/pre><\/div><\/div>\n\n<p>2) <code class=\"language-plaintext highlighter-rouge\">app.py<\/code><\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># app.py\n<\/span><span class=\"kn\">from<\/span> <span class=\"nn\">flask<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">Flask<\/span>\n\n<span class=\"kn\">from<\/span> <span class=\"nn\">database<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">db_session<\/span><span class=\"p\">,<\/span> <span class=\"n\">init_db<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">flask_graphql<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">GraphQLView<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">schema<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">schema<\/span>\n\n<span class=\"n\">app<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Flask<\/span><span class=\"p\">(<\/span><span class=\"n\">__name__<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"n\">debug<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">True<\/span>\n\n<span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"n\">add_url_rule<\/span><span class=\"p\">(<\/span><span class=\"s\">'\/graphql'<\/span><span class=\"p\">,<\/span> <span class=\"n\">view_func<\/span><span class=\"o\">=<\/span><span class=\"n\">GraphQLView<\/span><span class=\"p\">.<\/span><span class=\"n\">as_view<\/span><span class=\"p\">(<\/span><span class=\"s\">'graphql'<\/span><span class=\"p\">,<\/span> <span class=\"n\">schema<\/span><span class=\"o\">=<\/span><span class=\"n\">schema<\/span><span class=\"p\">,<\/span> <span class=\"n\">graphiql<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">))<\/span>\n\n<span class=\"o\">@<\/span><span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"n\">teardown_appcontext<\/span>\n<span class=\"k\">def<\/span> <span class=\"nf\">shutdown_session<\/span><span class=\"p\">(<\/span><span class=\"n\">exception<\/span><span class=\"o\">=<\/span><span class=\"bp\">None<\/span><span class=\"p\">):<\/span>\n    <span class=\"n\">db_session<\/span><span class=\"p\">.<\/span><span class=\"n\">remove<\/span><span class=\"p\">()<\/span>\n\n<span class=\"k\">if<\/span> <span class=\"n\">__name__<\/span> <span class=\"o\">==<\/span> <span class=\"s\">'__main__'<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">init_db<\/span><span class=\"p\">()<\/span>\n    <span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"n\">run<\/span><span class=\"p\">()<\/span>\n<\/code><\/pre><\/div><\/div>\n<ul>\n  <li>\n    <dl>\n      <dt>init_db()<\/dt>\n      <dd>\ud14c\uc2a4\ud2b8\ub97c \uc9c4\ud589\ud558\uae30 \uc704\ud55c \ubaa8\ub4c8\ub4e4\uc744 \ub9cc\ub4e4\uc5b4\uc900\ub2e4. \uc2e4\uc81c\ub85c \ud504\ub85c\uc81d\ud2b8\uc5d0 \uc801\uc6a9\uc2dc\ud0ac \uacbd\uc6b0\uc5d0\ub294 \ud544\uc694\uac00 \uc5c6\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt>app.add_url_rule(\u2018\/graphql\u2019, view_func=GraphQLView.as_view(\u2018graphql\u2019, schema=schema, graphiql=True))<\/dt>\n      <dd><code class=\"language-plaintext highlighter-rouge\">\/graphql<\/code>\uc774\ub77c\ub294 path\ub97c \ub9cc\ub4e4\uc5b4\uc8fc\uace0, <code class=\"language-plaintext highlighter-rouge\">schema=schema<\/code>\ub85c <code class=\"language-plaintext highlighter-rouge\">GraphQlSchema<\/code>\uac1d\uccb4\ub97c \ub123\uc5b4\uc8fc\uc5c8\ub2e4. \uadf8\ub9ac\uace0 <code class=\"language-plaintext highlighter-rouge\">graphiql=True<\/code>\ub85c \ube0c\ub77c\uc6b0\uc800 view\ub97c \uc774\uc6a9\ud558\ub294 \uac78 \uba85\uc2dc\ud574\uc8fc\ub294 \ubd80\ubd84\uc774\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n<\/ul>\n\n<p>2) <code class=\"language-plaintext highlighter-rouge\">database.py<\/code><\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kn\">from<\/span> <span class=\"nn\">sqlalchemy<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">create_engine<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">sqlalchemy.ext.declarative<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">declarative_base<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">sqlalchemy.orm<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">scoped_session<\/span><span class=\"p\">,<\/span> <span class=\"n\">sessionmaker<\/span>\n\n<span class=\"n\">engine<\/span> <span class=\"o\">=<\/span> <span class=\"n\">create_engine<\/span><span class=\"p\">(<\/span><span class=\"s\">'sqlite:\/\/\/database.sqlite3'<\/span><span class=\"p\">,<\/span> <span class=\"n\">convert_unicode<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">db_session<\/span> <span class=\"o\">=<\/span> <span class=\"n\">scoped_session<\/span><span class=\"p\">(<\/span><span class=\"n\">sessionmaker<\/span><span class=\"p\">(<\/span><span class=\"n\">autocommit<\/span><span class=\"o\">=<\/span><span class=\"bp\">False<\/span><span class=\"p\">,<\/span>\n                                         <span class=\"n\">autoflush<\/span><span class=\"o\">=<\/span><span class=\"bp\">False<\/span><span class=\"p\">,<\/span>\n                                         <span class=\"n\">bind<\/span><span class=\"o\">=<\/span><span class=\"n\">engine<\/span><span class=\"p\">))<\/span>\n<span class=\"n\">Base<\/span> <span class=\"o\">=<\/span> <span class=\"n\">declarative_base<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">Base<\/span><span class=\"p\">.<\/span><span class=\"n\">query<\/span> <span class=\"o\">=<\/span> <span class=\"n\">db_session<\/span><span class=\"p\">.<\/span><span class=\"n\">query_property<\/span><span class=\"p\">()<\/span>\n\n\n<span class=\"k\">def<\/span> <span class=\"nf\">init_db<\/span><span class=\"p\">():<\/span>\n    <span class=\"c1\"># import all modules here that might define models so that\n<\/span>    <span class=\"c1\"># they will be registered properly on the metadata.  Otherwise\n<\/span>    <span class=\"c1\"># you will have to import them first before calling init_db()\n<\/span>    <span class=\"kn\">from<\/span> <span class=\"nn\">models<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">Department<\/span><span class=\"p\">,<\/span> <span class=\"n\">Employee<\/span><span class=\"p\">,<\/span> <span class=\"n\">Role<\/span>\n    <span class=\"n\">Base<\/span><span class=\"p\">.<\/span><span class=\"n\">metadata<\/span><span class=\"p\">.<\/span><span class=\"n\">drop_all<\/span><span class=\"p\">(<\/span><span class=\"n\">bind<\/span><span class=\"o\">=<\/span><span class=\"n\">engine<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">Base<\/span><span class=\"p\">.<\/span><span class=\"n\">metadata<\/span><span class=\"p\">.<\/span><span class=\"n\">create_all<\/span><span class=\"p\">(<\/span><span class=\"n\">bind<\/span><span class=\"o\">=<\/span><span class=\"n\">engine<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"c1\"># Create the fixtures\n<\/span>    <span class=\"n\">engineering<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Department<\/span><span class=\"p\">(<\/span><span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"s\">'Engineering'<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">db_session<\/span><span class=\"p\">.<\/span><span class=\"n\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">engineering<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">hr<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Department<\/span><span class=\"p\">(<\/span><span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"s\">'Human Resources'<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">db_session<\/span><span class=\"p\">.<\/span><span class=\"n\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">hr<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">manager<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Role<\/span><span class=\"p\">(<\/span><span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"s\">'manager'<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">db_session<\/span><span class=\"p\">.<\/span><span class=\"n\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">manager<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">engineer<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Role<\/span><span class=\"p\">(<\/span><span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"s\">'engineer'<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">db_session<\/span><span class=\"p\">.<\/span><span class=\"n\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">engineer<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">peter<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Employee<\/span><span class=\"p\">(<\/span><span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"s\">'Peter'<\/span><span class=\"p\">,<\/span> <span class=\"n\">department<\/span><span class=\"o\">=<\/span><span class=\"n\">engineering<\/span><span class=\"p\">,<\/span> <span class=\"n\">role<\/span><span class=\"o\">=<\/span><span class=\"n\">engineer<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">db_session<\/span><span class=\"p\">.<\/span><span class=\"n\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">peter<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">roy<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Employee<\/span><span class=\"p\">(<\/span><span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"s\">'Roy'<\/span><span class=\"p\">,<\/span> <span class=\"n\">department<\/span><span class=\"o\">=<\/span><span class=\"n\">engineering<\/span><span class=\"p\">,<\/span> <span class=\"n\">role<\/span><span class=\"o\">=<\/span><span class=\"n\">engineer<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">db_session<\/span><span class=\"p\">.<\/span><span class=\"n\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">roy<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">tracy<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Employee<\/span><span class=\"p\">(<\/span><span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"s\">'Tracy'<\/span><span class=\"p\">,<\/span> <span class=\"n\">department<\/span><span class=\"o\">=<\/span><span class=\"n\">hr<\/span><span class=\"p\">,<\/span> <span class=\"n\">role<\/span><span class=\"o\">=<\/span><span class=\"n\">manager<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">db_session<\/span><span class=\"p\">.<\/span><span class=\"n\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">tracy<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">db_session<\/span><span class=\"p\">.<\/span><span class=\"n\">commit<\/span><span class=\"p\">()<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \uc815\uc758\ud558\uace0, \ud14c\uc2a4\ud2b8\ud560 \uc815\ubcf4\ub97c \ub123\uc5b4\uc8fc\ub294 \ucf54\ub4dc\uac00 \ub418\uaca0\ub2e4.<\/p>\n<ul>\n  <li>\n    <dl>\n      <dt>create_engine(\u2018sqlite:\/\/\/database.sqlite3\u2019, convert_unicode=True)<\/dt>\n      <dd>\uc774\uc6a9\ud560 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc815\ubcf4\ub97c \ub123\uc5b4\uc8fc\uba74 \ub418\uaca0\ub2e4. \ud14c\uc2a4\ud2b8 \ubaa9\uc801\uc774\uae30 \ub54c\ubb38\uc5d0, \uc218\uc815\uc5c6\uc774 \uc9c4\ud589\ud558\uc600\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n<\/ul>\n\n<p>3) <code class=\"language-plaintext highlighter-rouge\">models.py<\/code><\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kn\">from<\/span> <span class=\"nn\">sqlalchemy<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">Column<\/span><span class=\"p\">,<\/span> <span class=\"n\">DateTime<\/span><span class=\"p\">,<\/span> <span class=\"n\">ForeignKey<\/span><span class=\"p\">,<\/span> <span class=\"n\">Integer<\/span><span class=\"p\">,<\/span> <span class=\"n\">String<\/span><span class=\"p\">,<\/span> <span class=\"n\">func<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">sqlalchemy.orm<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">backref<\/span><span class=\"p\">,<\/span> <span class=\"n\">relationship<\/span>\n\n<span class=\"kn\">from<\/span> <span class=\"nn\">database<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">Base<\/span>\n\n\n<span class=\"k\">class<\/span> <span class=\"nc\">Department<\/span><span class=\"p\">(<\/span><span class=\"n\">Base<\/span><span class=\"p\">):<\/span>\n    <span class=\"n\">__tablename__<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'department'<\/span>\n    <span class=\"nb\">id<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Column<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">,<\/span> <span class=\"n\">primary_key<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">name<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Column<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"p\">)<\/span>\n\n\n<span class=\"k\">class<\/span> <span class=\"nc\">Role<\/span><span class=\"p\">(<\/span><span class=\"n\">Base<\/span><span class=\"p\">):<\/span>\n    <span class=\"n\">__tablename__<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'roles'<\/span>\n    <span class=\"n\">role_id<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Column<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">,<\/span> <span class=\"n\">primary_key<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">name<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Column<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"p\">)<\/span>\n\n\n<span class=\"k\">class<\/span> <span class=\"nc\">Employee<\/span><span class=\"p\">(<\/span><span class=\"n\">Base<\/span><span class=\"p\">):<\/span>\n    <span class=\"n\">__tablename__<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'employee'<\/span>\n    <span class=\"nb\">id<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Column<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">,<\/span> <span class=\"n\">primary_key<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">name<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Column<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"p\">)<\/span>\n    <span class=\"c1\"># Use default=func.now() to set the default hiring time\n<\/span>    <span class=\"c1\"># of an Employee to be the current time when an\n<\/span>    <span class=\"c1\"># Employee record was created\n<\/span>    <span class=\"n\">hired_on<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Column<\/span><span class=\"p\">(<\/span><span class=\"n\">DateTime<\/span><span class=\"p\">,<\/span> <span class=\"n\">default<\/span><span class=\"o\">=<\/span><span class=\"n\">func<\/span><span class=\"p\">.<\/span><span class=\"n\">now<\/span><span class=\"p\">())<\/span>\n    <span class=\"n\">department_id<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Column<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">,<\/span> <span class=\"n\">ForeignKey<\/span><span class=\"p\">(<\/span><span class=\"s\">'department.id'<\/span><span class=\"p\">))<\/span>\n    <span class=\"n\">role_id<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Column<\/span><span class=\"p\">(<\/span><span class=\"n\">Integer<\/span><span class=\"p\">,<\/span> <span class=\"n\">ForeignKey<\/span><span class=\"p\">(<\/span><span class=\"s\">'roles.role_id'<\/span><span class=\"p\">))<\/span>\n    <span class=\"c1\"># Use cascade='delete,all' to propagate the deletion of a Department onto its Employees\n<\/span>    <span class=\"n\">department<\/span> <span class=\"o\">=<\/span> <span class=\"n\">relationship<\/span><span class=\"p\">(<\/span>\n        <span class=\"n\">Department<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">backref<\/span><span class=\"o\">=<\/span><span class=\"n\">backref<\/span><span class=\"p\">(<\/span><span class=\"s\">'employees'<\/span><span class=\"p\">,<\/span>\n                        <span class=\"n\">uselist<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">,<\/span>\n                        <span class=\"n\">cascade<\/span><span class=\"o\">=<\/span><span class=\"s\">'delete,all'<\/span><span class=\"p\">))<\/span>\n    <span class=\"n\">role<\/span> <span class=\"o\">=<\/span> <span class=\"n\">relationship<\/span><span class=\"p\">(<\/span>\n        <span class=\"n\">Role<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">backref<\/span><span class=\"o\">=<\/span><span class=\"n\">backref<\/span><span class=\"p\">(<\/span><span class=\"s\">'roles'<\/span><span class=\"p\">,<\/span>\n                        <span class=\"n\">uselist<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">,<\/span>\n                        <span class=\"n\">cascade<\/span><span class=\"o\">=<\/span><span class=\"s\">'delete,all'<\/span><span class=\"p\">))<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>sqlalchemy\uc758 \ubaa8\ub378\uc774\ub2e4.<\/p>\n\n<p>4) <code class=\"language-plaintext highlighter-rouge\">schema.py<\/code> &lt;- \uc81c\uc77c \uc911\uc694\ud558\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kn\">import<\/span> <span class=\"nn\">graphene<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">graphene<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">relay<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">graphene_sqlalchemy<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">SQLAlchemyConnectionField<\/span><span class=\"p\">,<\/span> <span class=\"n\">SQLAlchemyObjectType<\/span><span class=\"p\">,<\/span> <span class=\"n\">utils<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">models<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">Department<\/span> <span class=\"k\">as<\/span> <span class=\"n\">DepartmentModel<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">models<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">Employee<\/span> <span class=\"k\">as<\/span> <span class=\"n\">EmployeeModel<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">models<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">Role<\/span> <span class=\"k\">as<\/span> <span class=\"n\">RoleModel<\/span>\n\n<span class=\"k\">class<\/span> <span class=\"nc\">Department<\/span><span class=\"p\">(<\/span><span class=\"n\">SQLAlchemyObjectType<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">class<\/span> <span class=\"nc\">Meta<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">model<\/span> <span class=\"o\">=<\/span> <span class=\"n\">DepartmentModel<\/span>\n        <span class=\"n\">interfaces<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">relay<\/span><span class=\"p\">.<\/span><span class=\"n\">Node<\/span><span class=\"p\">,<\/span> <span class=\"p\">)<\/span>\n\n<span class=\"k\">class<\/span> <span class=\"nc\">DepartmentCon<\/span><span class=\"p\">(<\/span><span class=\"n\">relay<\/span><span class=\"p\">.<\/span><span class=\"n\">Connection<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">class<\/span> <span class=\"nc\">Meta<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">node<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Department<\/span>\n\n<span class=\"k\">class<\/span> <span class=\"nc\">Role<\/span><span class=\"p\">(<\/span><span class=\"n\">SQLAlchemyObjectType<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">class<\/span> <span class=\"nc\">Meta<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">model<\/span> <span class=\"o\">=<\/span> <span class=\"n\">RoleModel<\/span>\n        <span class=\"n\">interfaces<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">relay<\/span><span class=\"p\">.<\/span><span class=\"n\">Node<\/span><span class=\"p\">,<\/span> <span class=\"p\">)<\/span>\n\n<span class=\"k\">class<\/span> <span class=\"nc\">RoleCon<\/span><span class=\"p\">(<\/span><span class=\"n\">relay<\/span><span class=\"p\">.<\/span><span class=\"n\">Connection<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">class<\/span> <span class=\"nc\">Meta<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">node<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Role<\/span>\n\n<span class=\"k\">class<\/span> <span class=\"nc\">Query<\/span><span class=\"p\">(<\/span><span class=\"n\">graphene<\/span><span class=\"p\">.<\/span><span class=\"n\">ObjectType<\/span><span class=\"p\">):<\/span>\n    <span class=\"n\">node<\/span> <span class=\"o\">=<\/span> <span class=\"n\">relay<\/span><span class=\"p\">.<\/span><span class=\"n\">Node<\/span><span class=\"p\">.<\/span><span class=\"n\">Field<\/span><span class=\"p\">()<\/span>\n\n    <span class=\"n\">role<\/span> <span class=\"o\">=<\/span> <span class=\"n\">graphene<\/span><span class=\"p\">.<\/span><span class=\"n\">List<\/span><span class=\"p\">(<\/span><span class=\"n\">Role<\/span><span class=\"p\">,<\/span> <span class=\"n\">role_id<\/span><span class=\"o\">=<\/span><span class=\"n\">graphene<\/span><span class=\"p\">.<\/span><span class=\"n\">Int<\/span><span class=\"p\">(<\/span><span class=\"n\">required<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">))<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">resolve_role<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">info<\/span><span class=\"p\">,<\/span> <span class=\"o\">**<\/span><span class=\"n\">kwargs<\/span><span class=\"p\">):<\/span>\n        <span class=\"n\">role_query<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Role<\/span><span class=\"p\">.<\/span><span class=\"n\">get_query<\/span><span class=\"p\">(<\/span><span class=\"n\">info<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">role_query<\/span><span class=\"p\">.<\/span><span class=\"nb\">filter<\/span><span class=\"p\">(<\/span><span class=\"n\">RoleModel<\/span><span class=\"p\">.<\/span><span class=\"n\">role_id<\/span><span class=\"p\">.<\/span><span class=\"n\">contains<\/span><span class=\"p\">(<\/span><span class=\"n\">kwargs<\/span><span class=\"p\">.<\/span><span class=\"n\">get<\/span><span class=\"p\">(<\/span><span class=\"s\">'role_id'<\/span><span class=\"p\">)))<\/span>\n\n    <span class=\"c1\"># Allows sorting over multiple columns, by default over the primary key\n<\/span>    <span class=\"n\">all_roles<\/span> <span class=\"o\">=<\/span> <span class=\"n\">SQLAlchemyConnectionField<\/span><span class=\"p\">(<\/span><span class=\"n\">RoleCon<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"c1\"># Disable sorting over this field\n<\/span>    <span class=\"n\">all_departments<\/span> <span class=\"o\">=<\/span> <span class=\"n\">SQLAlchemyConnectionField<\/span><span class=\"p\">(<\/span><span class=\"n\">DepartmentCon<\/span><span class=\"p\">,<\/span> <span class=\"n\">sort<\/span><span class=\"o\">=<\/span><span class=\"bp\">None<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">schema<\/span> <span class=\"o\">=<\/span> <span class=\"n\">graphene<\/span><span class=\"p\">.<\/span><span class=\"n\">Schema<\/span><span class=\"p\">(<\/span><span class=\"n\">query<\/span><span class=\"o\">=<\/span><span class=\"n\">Query<\/span><span class=\"p\">,<\/span> <span class=\"n\">types<\/span><span class=\"o\">=<\/span><span class=\"p\">[<\/span><span class=\"n\">Department<\/span><span class=\"p\">,<\/span> <span class=\"n\">Role<\/span><span class=\"p\">])<\/span>\n<\/code><\/pre><\/div><\/div>\n<p><code class=\"language-plaintext highlighter-rouge\">graphQL<\/code>\uc758 \ud575\uc2ec\uacfc \uac19\uc740 \ubd80\ubd84\uc774\ub2e4. \ud074\ub860\ud55c \uc18c\uc2a4\ub85c <code class=\"language-plaintext highlighter-rouge\">python app.py<\/code>\ud558\uba74, \uc544\ub9c8 \uc624\ub958\ub97c \ubfdc\ubfdc\ud560 \uac83\uc774\ub2e4. \uc0c1\uae30 \ucf54\ub4dc\ub97c \ucc38\uace0\ud558\uba74 \ub41c\ub2e4.<\/p>\n\n<p class=\"notice--danger\"><strong>AssertionError: Found different types with the same name in the schema<\/strong><br \/>\n\uc774 \uc5d0\ub7ec\ub294 <code class=\"language-plaintext highlighter-rouge\">backref<\/code>\ub85c \uc758\uc874\uc131\uad00\uacc4\ub97c \uba85\uc2dc\ud574\ub454 \ubaa8\ub378\uc774 \uc788\uc744\uacbd\uc6b0 \ubc1c\uc0dd\ud55c\ub2e4. \ub530\ub77c\uc11c <code class=\"language-plaintext highlighter-rouge\">Connection<\/code>\uc774\ub77c\ub294 \ub124\uc774\ubc0d\uc744 <code class=\"language-plaintext highlighter-rouge\">Con<\/code>\uc774\ub77c\ub358\uc9c0 \ub2e4\ub978 \uac12\uc73c\ub85c \ubc14\uafb8\uba74 \uac04\ub2e8\ud788 \ud574\uacb0\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n<p>5) \uc138\ud305\uc740 \uc644\ub8cc\ub418\uc5c8\ub2e4. \ud55c\ubc88 \uc2e4\ud589\uc2dc\ucf1c\ubcf4\uc790.<\/p>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>python app.py\n <span class=\"k\">*<\/span> Running on http:\/\/127.0.0.1:5000\/ <span class=\"o\">(<\/span>Press CTRL+C to quit<span class=\"o\">)<\/span>\n <span class=\"k\">*<\/span> Restarting with <span class=\"nb\">stat<\/span>\n <span class=\"k\">*<\/span> Debugger is active!\n <span class=\"k\">*<\/span> Debugger PIN: 227-441-302\n<\/code><\/pre><\/div><\/div>\n<p>\uc815\uc0c1 \ub3d9\uc791\uc744 \ud655\uc778\ud558\uc600\ub2e4.<\/p>\n\n<p>6)  \uc774\uc81c \uadf8\ub798\ud504QL\uc744 \uc0ac\uc6a9\ud574\ubcf4\uc790. <code class=\"language-plaintext highlighter-rouge\">http:\/\/localhost:5000\/graphql<\/code>\ub85c \uc774\ub3d9\ud574\ubcf4\uc790.\n<img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/graphql-flask-web-view.png\" alt=\"image-center\" class=\"align-center\" \/>\n<br \/>\n\ud638\uc624.. \ucffc\ub9ac\ub97c \ud14c\uc2a4\ud2b8 \ud560 \uc218\uc788\ub294 \ud658\uacbd\uc774 \ub098\ud0c0\ub0ac\ub2e4. \uc544\uae4c <code class=\"language-plaintext highlighter-rouge\">app.py<\/code>\uc5d0\uc11c <code class=\"language-plaintext highlighter-rouge\">graphiql=True<\/code>\ub85c \uba85\uc2dc\ud558\uc600\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n\n<p><img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/graphql-flask-web-view-query-uri.png\" alt=\"image-center\" class=\"align-center\" \/>\n<br \/>\n\ub610\ud55c, \uc800 <code class=\"language-plaintext highlighter-rouge\">textarea<\/code>\uc5d0 \ud0a4\ubcf4\ub4dc\ub97c \uc0ac\uc6a9\ud560 \ub54c\ub9c8\ub2e4, \uc11c\ubc84\uc5d0 <code class=\"language-plaintext highlighter-rouge\">GET<\/code>\ud574\uc624\uae30 \ub54c\ubb38\uc5d0, \uc790\ub3d9\uc644\uc131\ub3c4 \uad6c\ud604\ub418\uc5b4\uc788\uace0, URI\ub3c4 \uc2dc\uc2dc\uac01\uac01 \ubcc0\ud558\ub294\uac78 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \uc798\ub9cc\ub4e4\uc5c8\ub2e4..(\uac10\ud0c4)<\/p>\n\n<p>7) \ucffc\ub9ac\ub97c \uc0ac\uc6a9\ud574\ubcf4\uc790.<\/p>\n<ul>\n  <li>Input\n    <div class=\"language-json highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"p\">{<\/span><span class=\"err\">allRoles<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><span class=\"err\">edges<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"err\">node<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n    <\/span><span class=\"err\">id<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"err\">roleId<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"err\">name<\/span><span class=\"w\">\n  <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><span class=\"p\">}}<\/span><span class=\"w\">\n<\/span><\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>Output\n    <div class=\"language-json highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><span class=\"nl\">\"data\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"allRoles\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"edges\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"w\">\n      <\/span><span class=\"p\">{<\/span><span class=\"w\">\n        <\/span><span class=\"nl\">\"node\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n          <\/span><span class=\"nl\">\"id\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"Um9sZTox\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n          <\/span><span class=\"nl\">\"roleId\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"1\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n          <\/span><span class=\"nl\">\"name\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"manager\"<\/span><span class=\"w\">\n        <\/span><span class=\"p\">}<\/span><span class=\"w\">\n      <\/span><span class=\"p\">},<\/span><span class=\"w\">\n      <\/span><span class=\"p\">{<\/span><span class=\"w\">\n        <\/span><span class=\"nl\">\"node\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n          <\/span><span class=\"nl\">\"id\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"Um9sZToy\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n          <\/span><span class=\"nl\">\"roleId\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"2\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n          <\/span><span class=\"nl\">\"name\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"engineer\"<\/span><span class=\"w\">\n        <\/span><span class=\"p\">}<\/span><span class=\"w\">\n      <\/span><span class=\"p\">}<\/span><span class=\"w\">\n    <\/span><span class=\"p\">]<\/span><span class=\"w\">\n  <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre><\/div>    <\/div>\n    <p>\uae30\uac00 \ub9c9\ud78c\ub2e4. \ud655\uc778\uacb0\uacfc \uc678\ub798\ud0a4\uac00 \uac78\ub824\uc788\uc73c\uba74, \ud574\ub2f9 \ubd80\ubd84\ub3c4 <code class=\"language-plaintext highlighter-rouge\">node<\/code>\uc5d0 \uba85\uc2dc\ud568\uc73c\ub85c\uc368, \ub9f5\ud551\ub41c \ub370\uc774\ud130\ub97c GET\ud574 \uc62c\uc218 \uc788\ub2e4. \uc5ec\uae30\uc11c <code class=\"language-plaintext highlighter-rouge\">find one<\/code>\uc744 \uad6c\ud604\ud574\ubcfc\uae4c\ud55c\ub2e4.<\/p>\n  <\/li>\n<\/ul>\n\n<p>8) <code class=\"language-plaintext highlighter-rouge\">find one<\/code><\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># schema.py &gt; query()\n<\/span><span class=\"n\">role<\/span> <span class=\"o\">=<\/span> <span class=\"n\">graphene<\/span><span class=\"p\">.<\/span><span class=\"n\">List<\/span><span class=\"p\">(<\/span><span class=\"n\">Role<\/span><span class=\"p\">,<\/span> <span class=\"n\">role_id<\/span><span class=\"o\">=<\/span><span class=\"n\">graphene<\/span><span class=\"p\">.<\/span><span class=\"n\">Int<\/span><span class=\"p\">(<\/span><span class=\"n\">required<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">))<\/span>\n<span class=\"k\">def<\/span> <span class=\"nf\">resolve_role<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">info<\/span><span class=\"p\">,<\/span> <span class=\"o\">**<\/span><span class=\"n\">kwargs<\/span><span class=\"p\">):<\/span>\n\t<span class=\"n\">role_query<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Role<\/span><span class=\"p\">.<\/span><span class=\"n\">get_query<\/span><span class=\"p\">(<\/span><span class=\"n\">info<\/span><span class=\"p\">)<\/span>\n\t<span class=\"k\">return<\/span> <span class=\"n\">role_query<\/span><span class=\"p\">.<\/span><span class=\"nb\">filter<\/span><span class=\"p\">(<\/span><span class=\"n\">RoleModel<\/span><span class=\"p\">.<\/span><span class=\"n\">role_id<\/span><span class=\"p\">.<\/span><span class=\"n\">contains<\/span><span class=\"p\">(<\/span><span class=\"n\">kwargs<\/span><span class=\"p\">.<\/span><span class=\"n\">get<\/span><span class=\"p\">(<\/span><span class=\"s\">'role_id'<\/span><span class=\"p\">)))<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\ub098\uc758 <code class=\"language-plaintext highlighter-rouge\">schema.py<\/code>\ub97c \ucc38\uace0\ud574\ubcf4\uba74, \uc0c1\uae30 \ub0b4\uc6a9\uc774 \uc788\ub2e4.(git\uc5d0\ub294 \uc5c6\uc74c) <code class=\"language-plaintext highlighter-rouge\">role<\/code> \uc774\ub77c\ub294 \ubcc0\uc218\ub85c <code class=\"language-plaintext highlighter-rouge\">graphene.List<\/code>\ub97c \uad6c\ud604\ud55c \ub4a4, role_id\ub97c arg\ub85c \ubc1b\uc558\ub2e4.  <code class=\"language-plaintext highlighter-rouge\">def resole_role()<\/code>\uacfc \uac19\uc774 \ud574\ub2f9 \ubcc0\uc218\ub97c \ub9f5\ud551\ud574\uc8fc\uba74, graphql\uc5d0\uc11c \ud574\ub2f9 \ubd80\ubd84\uc744 \ud638\ucd9c\ud560 \uc218 \uc788\uace0, \ub9ac\ud134\ud560 \ub0b4\uc6a9\uc744 \ucee4\uc2a4\ud140\ud574\uc904 \uc218 \uc788\ub2e4. \ub9cc\uc57d \ubcc0\uc218\uba85\uc774 <code class=\"language-plaintext highlighter-rouge\">test<\/code>\ub77c\uba74, <code class=\"language-plaintext highlighter-rouge\">def resolve_test()<\/code>\uc640 \uac19\uc774 \ud568\uc218\ub97c \uad6c\ud604\ud574\uc8fc\uba74 \ub41c\ub2e4. \ub098\ub294 \ud568\uc218 \ub0b4\uc6a9\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. <strong><code class=\"language-plaintext highlighter-rouge\">SELECT * FROM role WHERE role_id = args{role_id}<\/code><\/strong>. Web\uc5d0\uc11c \uc791\uc131\ud55c <code class=\"language-plaintext highlighter-rouge\">role<\/code>\uc744 \uc2e4\ud589\uc2dc\ucf1c\ubcf4\uc790.<\/p>\n<ul>\n  <li>Input\n    <div class=\"language-json highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"p\">{<\/span><span class=\"err\">role(roleId:<\/span><span class=\"mi\">1<\/span><span class=\"err\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><span class=\"err\">id<\/span><span class=\"p\">,<\/span><span class=\"w\">\n<\/span><span class=\"err\">name<\/span><span class=\"p\">,<\/span><span class=\"w\">\n<\/span><span class=\"err\">roleId<\/span><span class=\"w\">\n<\/span><span class=\"p\">}}<\/span><span class=\"w\">\n<\/span><\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>Output\n    <div class=\"language-json highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><span class=\"nl\">\"data\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"role\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"w\">\n    <\/span><span class=\"p\">{<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"id\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"Um9sZTox\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"name\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"manager\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"roleId\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"1\"<\/span><span class=\"w\">\n    <\/span><span class=\"p\">}<\/span><span class=\"w\">\n  <\/span><span class=\"p\">]<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre><\/div>    <\/div>\n  <\/li>\n<\/ul>\n\n<p>\uc815\uc0c1\uc801\uc73c\ub85c \ub3d9\uc791\ud55c\ub2e4. \ucd94\ud6c4\uc5d0\ub294 \uc880\ub354 <code class=\"language-plaintext highlighter-rouge\">schema.py<\/code>\ub97c \ucee4\uc2a4\ud140\ud574\ubcf4\ub824\uace0 \ud55c\ub2e4. \uc77c\ub2e8 \uc624\ub298\uc740 \uc774\uac78\ub85c \ub9c8\ubb34\ub9ac\ud558\uaca0\ub2e4.<\/p>\n","pubDate":"Thu, 11 Oct 2018 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/python\/graphql\/flask\/facebook\/graphql-with-python-flask\/","guid":"https:\/\/hidekuma.github.io\/python\/graphql\/flask\/facebook\/graphql-with-python-flask\/","category":["python","graphql","flask","facebook","Python","GraphQL","Flask","Facebook"]},{"title":"Kali linux: Mac\uc5d0\uc11c booting USB\ub9cc\ub4e4\uae30","description":"<p>\uc0ac\uc6a9 \uc911\uc774\ub358 <code class=\"language-plaintext highlighter-rouge\">kali linux<\/code>\uc758 \uc758\uc874\uc131 \ud328\ud0a4\uc9c0\ub97c \uc124\uce58\ud558\ub2e4\uac00, \ud328\ud0a4\uc9c0\ub97c \uc798\ubabb \uac74\ub4dc\ub824\uc11c <code class=\"language-plaintext highlighter-rouge\">GUI booting<\/code>\uc774 \uc548\ub418\ub294 \ub300\ucc38\uc0ac\uac00 \uc77c\uc5b4\ub0ac\ub2e4. \uc8fc\ub9d0\uc744 \uaf2c\ubc15 \uc368\uc11c \ud574\uacb0\ud574\ubcf4\ub824 \ud588\uc73c\ub098.. \ud3ec\uae30\ud558\uace0 \ub2e4\uc2dc \uae54\uae30\ub85c \ud558\uc600\ub2e4.  \uce7c\ub9ac \uc138\ud305\uc5d0 \ud22c\uc790\ud55c \uc2dc\uac04\uc774 \ub108\ubb34 \uc544\uae5d\ub2e4\ub9cc \ubcc4 \uc218 \uc5c6\uc5c8\ub2e4.<\/p>\n\n<p>\ubd80\ud305 USB\ub97c \ub9cc\ub4e4\uc5b4\uc57c\ud558\ub294\ub370,  \uc0ac\uc2e4 Window\uc5d0\uc11c\ub9cc \ud574\ubcf4\uace0 Mac\uc5d0\uc11c \ucc98\uc74c\uc774\ub2e4. \ud55c\ubc88 \ud574\ubcf4\uc790.\n<!--more--><\/p>\n<ol>\n  <li>\n    <p>\uba3c\uc800 <code class=\"language-plaintext highlighter-rouge\">ISO<\/code>\uc774\ubbf8\uc9c0\ub97c \ub2e4\uc6b4\ubc1b\ub294\ub2e4. \uac01\uc790 \ud544\uc694\ud55c \uc774\ubbf8\uc9c0\ub97c \ubc1b\uc73c\uba74 \ub418\uaca0\ub2e4. \ub098 \uac19\uc740 \uacbd\uc6b0\ub294 <a href=\"https:\/\/www.kali.org\/downloads\/\">\uce7c\ub9ac\ub9ac\ub205\uc2a4<\/a> 64bit \uc774\ubbf8\uc9c0\ub97c \ubc1b\uc558\ub2e4.<\/p>\n  <\/li>\n  <li><code class=\"language-plaintext highlighter-rouge\">Terminal<\/code>\uc5d0\uc11c <code class=\"language-plaintext highlighter-rouge\">hdiutil Convert<\/code>\ud55c\ub2e4.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>hdiutil convert <span class=\"nt\">-format<\/span> UDRW <span class=\"nt\">-o<\/span> ~\/path\/to\/kali-linux.img  ~\/path\/to\/kali-linux-2018.3a-amd64.iso\nMaster Boot Record<span class=\"o\">(<\/span>MBR : 0<span class=\"o\">)<\/span> \uc77d\ub294 \uc911...\nKali Live                       <span class=\"o\">(<\/span>Apple_ISO : 1<span class=\"o\">)<\/span> \uc77d\ub294 \uc911...\n<span class=\"o\">(<\/span>Windows_NTFS_Hidden : 2<span class=\"o\">)<\/span> \uc77d\ub294 \uc911...\n......................................................................................................................................................\n<span class=\"o\">(<\/span>DOS_FAT_12 : 3<span class=\"o\">)<\/span> \uc77d\ub294 \uc911...\n......................................................................................................................................................\n\uacbd\uacfc \uc2dc\uac04: 13.743s\n\uc18d\ub3c4: 221.5Mbytes\/\ucd08\n\uc800\uc7a5: 0.0%\ncreated: ~\/path\/to\/kali-linux.img.dmg\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>USB\uac00 \uba87 \ubc88\uc5d0 \ub9c8\uc6b4\ud305\ub418\uc5b4 \uc788\ub294 \ud655\uc778\ud55c\ub2e4. HIDEKUMA USB\uac00 <code class=\"language-plaintext highlighter-rouge\">\/dev\/disk2<\/code>\uc5d0 \ub9f5\ud551\ub418\uc5b4\uc788\ub294 \uac78 \ud655\uc778\ud588\ub2e4. (\ub098\uc911\uc5d0 \uc5c9\ub6b1\ud55c\ub370\uc5d0 \uc4f0\uba74 \ub2f5\uc774 \uc5c6\ub2e4. \uc798 \ud655\uc778\ud55c\ub2e4.)\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>diskutil list\n\/dev\/disk2 <span class=\"o\">(<\/span>external, physical<span class=\"o\">)<\/span>:\n<span class=\"c\">#:                       TYPE NAME                    SIZE       IDENTIFIER<\/span>\n0:     FDisk_partition_scheme                        <span class=\"k\">*<\/span>8.0 GB     disk2\n1:                 DOS_FAT_32 HIDEKUMA                720.9 KB   disk2s1\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li><code class=\"language-plaintext highlighter-rouge\">unmount<\/code>\uc2dc\ud0a8\ub2e4.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>diskutil unmountDisk \/dev\/disk2\nUnmount of all volumes on disk2 was successful\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>\uc774\ubbf8\uc9c0\ub97c \ubcf5\uc0ac\ud55c\ub2e4. USB 2.0 \uae30\uc900\uc57d 20\ubd84(8GB) \uc815\ub3c4 \uc18c\uc694\ub418\uc5c8\ub2e4.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">sudo dd <\/span><span class=\"k\">if<\/span><span class=\"o\">=<\/span>~\/path\/to\/kali-linux.img.dmg <span class=\"nv\">of<\/span><span class=\"o\">=<\/span>\/dev\/disk2 <span class=\"nv\">bs<\/span><span class=\"o\">=<\/span>1m\nPassword:\n3044+1 records <span class=\"k\">in\n<\/span>3044+1 records out\n3192651776 bytes transferred <span class=\"k\">in <\/span>1252.474807 secs <span class=\"o\">(<\/span>2549075 bytes\/sec<span class=\"o\">)<\/span>\n~ 20m 56s\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>\ub4dc\ub77c\uc774\ube0c\ub97c \uaebc\ub0b8\ub2e4. \uc644\uc131.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>diskutil eject \/dev\/disk2\nDisk \/dev\/disk2 ejected\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>USB \ucd08\uae30\ud654 \ud560 \uacbd\uc6b0.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">sudo dd <\/span><span class=\"k\">if<\/span><span class=\"o\">=<\/span>\/dev\/zero <span class=\"nv\">of<\/span><span class=\"o\">=<\/span>\/dev\/disk2 <span class=\"nv\">bs<\/span><span class=\"o\">=<\/span>1m\n<\/code><\/pre><\/div>    <\/div>\n    <p>\ucd08\uae30\ud654 \uc2dc\uc5d0\ub294, \uc0c1\uae30 \ucee4\ub9e8\ub4dc\ub85c \ucd08\uae30\ud654 \ud6c4 \ub514\uc2a4\ud06c \uc720\ud2f8\ub9ac\ud2f0\uc5d0\uc11c \uc9c0\uc6b0\uae30\ub97c \uc9c4\ud589\ud558\uba74 \ub41c\ub2e4.<\/p>\n  <\/li>\n<\/ol>\n","pubDate":"Mon, 08 Oct 2018 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/mac\/kali\/linux\/kali-linux-boot-usb-on-mac\/","guid":"https:\/\/hidekuma.github.io\/mac\/kali\/linux\/kali-linux-boot-usb-on-mac\/","category":["mac","kali","linux","Mac","Kali","linux"]},{"title":"Python: \ud30c\uc774\uc36c Chalice\ub97c \uc774\uc6a9\ud55c \uc11c\ubc84\ub9ac\uc2a4 \uc774\ubbf8\uc9c0 \ud638\uc2a4\ud305 \uc81c\uc791\uae30","description":"<h3 id=\"chalice\ub97c\uc774\uc6a9\ud55c-\uc11c\ubc84\ub9ac\uc2a4-\uc774\ubbf8\uc9c0-\ud638\uc2a4\ud305-\uc81c\uc791\uae30\">Chalice\ub97c\uc774\uc6a9\ud55c \uc11c\ubc84\ub9ac\uc2a4 \uc774\ubbf8\uc9c0 \ud638\uc2a4\ud305 \uc81c\uc791\uae30<\/h3>\n<p>\uc774\ubc88\uc5d0 \uc774\ubbf8\uc9c0\ub97c \uc801\uc7ac\ud558\ub294 \uc2dc\uc2a4\ud15c\uc744 \ub9cc\ub4e4\uac8c\ub418\uc5c8\ub294\ub370, \uc548\ud0c0\uae5d\uac8c\ub3c4 \uc6b0\ub9ac \ud68c\uc0ac\uc5d0\ub294 \uc11c\ubc84\uad00\ub9ac\uc790\uac00 \ub530\ub85c \uc5c6\uae30 \ub54c\ubb38\uc5d0 \uc11c\ubc84\ub9ac\uc2a4\ub85c \uad6c\ud604\ud558\uae30\ub85c \ud558\uc600\ub2e4.\n\ub9ac\uc11c\uce58 \ud558\ub2e4\uac00 \uacb0\uad6d\uc5d4 Chalice\ub77c\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0 \ub3c4\ub2ec\ud558\uc600\uace0, \ub73b\uc744 \ucc3e\uc544\ubcf4\ub2c8 \uc131\ubc30\ub77c\uace0\ud55c\ub2e4. \uc774\uc720\ub294 \ubaa8\ub974\uaca0\ub124?<\/p>\n<ul>\n  <li><a href=\"https:\/\/github.com\/aws\/chalice\">Chalice github<\/a><\/li>\n  <li><a href=\"https:\/\/chalice.readthedocs.io\/en\/latest\/\">Chalice docs<\/a><\/li>\n<\/ul>\n\n<p>\uc124\uacc4\ub294 \uc774\ub7ec\ud558\ub2e4.\n<img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/imager-case-with-sqs.jpg\" alt=\"image-center\" class=\"align-center\" \/><\/p>\n\n<p>\uc2dc\uc2a4\ud15c \uc544\ud0a4\ud14d\ucc98\uc5d0\uc11c \ubcf4\uc774\ub294<code class=\"language-plaintext highlighter-rouge\">SQS -&gt; Lambda -&gt; S3<\/code> \ubd80\ubd84\uc744Chalice\ub85c \uad6c\ud604\ud574\ubcf4\ub824\uace0 \ud55c\ub2e4. \uc0ac\uc2e4 <code class=\"language-plaintext highlighter-rouge\">S3 -&gt; Lambda -&gt; S3<\/code> \uac19\uc740 \uc124\uacc4\ub3c4 \uac00\ub2a5\ud55c\ub370, \uc774\ubc88\uc5d0\ub294 SQS\uc5d0\uc11c JSON\ud615\uc2dd\uc73c\ub85c Message\ub97c \ubc1b\uc544 \ucc98\ub9ac\ud558\uace0 \uc2f6\uc5b4 \uc774\ub7ec\ud55c \uc124\uacc4\ub97c \uc9c4\ud589\ud558\uc600\ub2e4. \ucc38\uace0\ub85c <code class=\"language-plaintext highlighter-rouge\">SQS -&gt; Lambda<\/code> \uc694\uae08\uc740 \uacf5\uc9dc\ub77c\ub294 \uc0ac\uc2e4!<\/p>\n\n<p>AWS Lambda\ub97c \uc774\uc6a9\ud55c \uc11c\ubc84\ub9ac\uc2a4 \uc6f9 \/ \ud504\ub85c\uadf8\ub7a8\uc744 \uad6c\ud604\ud558\ub294\ub370 \ud070 \ub3c4\uc6c0\uc744 \uc8fc\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \uc874\uc7ac\ud558\ub294\ub370, Node.js\uc5d0\uc11c\ub294 Serverless, Python\uc5d0\ub294 Zappa\ub098 Chalice\ub97c \uc608\ub85c \ub4e4\uc218 \uc788\ub2e4.\n\ub098\ub294 \uc8fc\ub85c Flask Web\uc744 Zappa\ub97c \ud1b5\ud574 \uc11c\ubc84\ub9ac\uc2a4 \uc6f9\uc73c\ub85c \ub744\uc6b0\uace4 \ud558\ub294\ub370, \uc774\ubc88\uc5d0\ub294 <code class=\"language-plaintext highlighter-rouge\">SQS -&gt; Lambda<\/code>\ubd80\ubd84\uc774 \ud604\uc7ac Zappa\uc5d0\uc120 \uc9c0\uc6d0\uc774 \ub418\uc9c0\uc54a\uc544, Chalice\ub97c \uc774\uc6a9\ud574\ubcf4\uae30\ub85c \ud558\uc600\ub2e4.<\/p>\n\n<ol>\n  <li>\uc0c1\uae30\uc5d0\uc11c \ub17c\ud55c \uac83 \ucc98\ub7fc Chalice\ub294 \uac04\ud3b8\ud558\uac8c SQS\uc774\ubca4\ud2b8\ub97c \uce90\uce58\ud558\uc5ec Lambda\ud568\uc218\ub97c \uc2e4\ud589\uc2dc\ud0a4\ub294 \uac83\uc774 \uac00\ub2a5\ud558\ub2e4.\nChalice\ub97c \uc774\uc6a9\ud558\uae30 \uc55e\uc11c, AWS Credentials\uc744 \ub4f1\ub85d\ud574\uc57c\ud55c\ub2e4.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">mkdir<\/span> ~\/.aws\n<span class=\"nv\">$ <\/span><span class=\"nb\">cat<\/span> <span class=\"o\">&gt;&gt;<\/span> ~\/.aws\/config\n<span class=\"o\">[<\/span>default]\n<span class=\"nv\">aws_access_key_id<\/span><span class=\"o\">=<\/span>YOUR_ACCESS_KEY_HERE\n<span class=\"nv\">aws_secret_access_key<\/span><span class=\"o\">=<\/span>YOUR_SECRET_ACCESS_KEY\n<span class=\"nv\">region<\/span><span class=\"o\">=<\/span>YOUR_REGION <span class=\"o\">(<\/span>such as us-west-2, us-west-1, etc<span class=\"o\">)<\/span>\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>\uac00\uc0c1\ud658\uacbd\uc5d0 \uc9c4\uc785 \ud6c4, Chalice\ub97c \uc124\uce58\ud558\uc790.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>pip <span class=\"nb\">install <\/span>chalice\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>\ud655\uc778\ud574\ubcf4\uc790.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>chalice <span class=\"nt\">--help<\/span>\nUsage: chalice <span class=\"o\">[<\/span>OPTIONS] COMMAND <span class=\"o\">[<\/span>ARGS]...\n...\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>\uc798 \uc124\uce58\ub418\uc5c8\ub2e4. \uc774\uc81c \ud504\ub85c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud558\uc790.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>chalice new-project imager\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>\ub514\ub809\ud1a0\ub9ac\ub85c \uc774\ub3d9\ud574\ubcf4\uc790.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">cd <\/span>imager\n<span class=\"nv\">$ <\/span><span class=\"nb\">ls<\/span> <span class=\"nt\">-la<\/span>\ndrwxr-xr-x   .chalice\n<span class=\"nt\">-rw-r--r--<\/span>   app.py\n<span class=\"nt\">-rw-r--r--<\/span>   requirements.txt\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>app.py\uc744 \uc5f4\uc5b4\ubcf4\uc790.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>from chalice import Chalice\napp <span class=\"o\">=<\/span> Chalice<span class=\"o\">(<\/span><span class=\"nv\">app_name<\/span><span class=\"o\">=<\/span><span class=\"s1\">'imager'<\/span><span class=\"o\">)<\/span>\n@app.route<span class=\"o\">(<\/span><span class=\"s1\">'\/'<\/span><span class=\"o\">)<\/span>\ndef index<span class=\"o\">()<\/span>:\n <span class=\"k\">return<\/span> <span class=\"o\">{<\/span><span class=\"s1\">'hello'<\/span>: <span class=\"s1\">'world'<\/span><span class=\"o\">}<\/span>\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>\ub514\ud50c\ub85c\uc774\ub97c \ud574\ubcf4\uc790.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>chalice deploy\n...\nInitiating first <span class=\"nb\">time <\/span>deployment...\nhttps:\/\/qxea58oupc.execute-api.us-west-2.amazonaws.com\/api\/\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>\ud655\uc778\ud574\ubcf4\uc790.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>curl https:\/\/qxea58oupc.execute-api.us-west-2.amazonaws.com\/api\/\n<span class=\"o\">{<\/span><span class=\"s2\">\"hello\"<\/span>: <span class=\"s2\">\"world\"<\/span><span class=\"o\">}<\/span>\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n<\/ol>\n\n<p class=\"notice--warning\">\uc544\uc8fc \uc798 \ub3d9\uc791\ud558\ub294\uac78 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. AWS Credentials\uc5d0 \ud070 \ubb38\uc81c\ub9cc \uc5c6\ub2e4\uba74 \uc815\uc0c1\ub3d9\uc791\ud560 \uac83\uc774\uace0, Deploy\uac00 \uc548\ub420\uacbd\uc6b0\uc5d0\ub294, \uc785\ub825\ud55c AWS key\uc5d0 \ud574\ub2f9 <u>Lambda\ub098 APIGateway\uc5d0 \ub300\ud55c \uad8c\ud55c<\/u>\uc774 \uc5f4\ub824\uc788\ub294\uc9c0 \ud655\uc778\ud574\ubcf4\uc790.<\/p>\n\n<p>\uae30\ubcf8\uc801\uc778 \uc138\ud305\uc774 \uc644\ub8cc\ub418\uc5c8\ub2e4\uba74, \uac01\uc790 \ub9c8\uc74c\ub300\ub85c \uc694\ub9ac\ud574\ubcf4\uc790. \ub098\uc758 \ud504\ub85c\uc81d\ud2b8 \uad6c\uc870\ub294 \uacb0\uacfc\uc801\uc73c\ub85c \uc774\ub7ec\ud558\ub2e4.<\/p>\n\n<dl>\n  <dt><img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/imager-tree.png\" alt=\"image-left\" class=\"align-left\" \/><\/dt>\n  <dt>app.py<\/dt>\n  <dd>SQS\uc640 \ub9f5\ud551\ud558\ub294 \uc2e4\uc81c Working \ucf54\ub4dc\uac00 \uc4f0\uc5ec\uc788\ub2e4.<\/dd>\n  <dt>chalicelib<\/dt>\n  <dd>app.py\ub098 \ub2e4\ub978 \ud30c\uc774\uc36c \ucf54\ub4dc\uc5d0 \uc790\uc2e0\uc774 \ub9cc\ub4e0 <u>\ucee4\uc2a4\ud140 \ubaa8\ub4c8\uc744 import\ud560 \uacbd\uc6b0<\/u>\uc5d0\ub294, <code class=\"language-plaintext highlighter-rouge\">chalicelib<\/code> \ub514\ub809\ud1a0\ub9ac\ub97c \ub9cc\ub4e4\uc5b4 \ub123\uc5b4\uc918\uc57c \ubb38\uc81c\uc5c6\uc774 deploy\ub41c\ub2e4.<\/dd>\n  <dt>S3_manager.py<\/dt>\n  <dd>S3 Bucket CRUD \ucf54\ub4dc\uc774\ub2e4.<\/dd>\n  <dt>aws.py<\/dt>\n  <dd>S3_manager.py\uc5d0\uc11c \uc774\uc6a9\ud558\ub294 AWS Credentials \uc815\ubcf4\uac00 \ub179\uc544\uc838\uc788\ub2e4.<\/dd>\n  <dt>imager.py<\/dt>\n  <dd>\uc774\ubbf8\uc9c0\ub97c \uc555\ucd95\ud558\ub294 \ucf54\ub4dc\uc774\ub2e4.<\/dd>\n<\/dl>\n\n<p class=\"notice--info\">Zappa\uc758 zappa_settings.json\uacfc \uac19\uc740 configuration \uc124\uc815\uc740 <code class=\"language-plaintext highlighter-rouge\">.chalice\/config.json<\/code>\uc5d0\uc11c \uac00\ub2a5\ud558\ub2e4.<\/p>\n\n<p>\ud604\uc7ac config.json\uc740 \uc774\ub807\ub2e4. \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 <a href=\"https:\/\/chalice.readthedocs.io\/en\/latest\/topics\/configfile.html\">\uacf5\uc2dd\ubb38\uc11c<\/a>\ub97c \ucc38\uace0\ud574\ubcf4\uc790.<\/p>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">cat<\/span> .chalice\/config.json\n<span class=\"o\">{<\/span>\n  <span class=\"s2\">\"version\"<\/span>: <span class=\"s2\">\"2.0\"<\/span>,\n  <span class=\"s2\">\"app_name\"<\/span>: <span class=\"s2\">\"imager\"<\/span>,\n  <span class=\"s2\">\"stages\"<\/span>: <span class=\"o\">{<\/span>\n    <span class=\"s2\">\"dev\"<\/span>: <span class=\"o\">{<\/span>\n      <span class=\"s2\">\"api_gateway_stage\"<\/span>: <span class=\"s2\">\"api\"<\/span>,\n          <span class=\"s2\">\"lambda_memory_size\"<\/span>: 128\n    <span class=\"o\">}<\/span>\n  <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\uc774\uc81c SQS\ub97c \ub9cc\ub4e4\uc5b4\ubcf4\uc790. <code class=\"language-plaintext highlighter-rouge\">AWS Console -&gt; SQS -&gt; Create New Queue<\/code>\ub97c \ud574\uc8fc\uba74 \ub41c\ub2e4. Queue\uc5d0 \ub124\uc784\uc740 imager-queue\ub85c \uba85\uba85\ud558\uc600\ub2e4.\n<img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/aws-sqs-imager-queue.png\" alt=\"image-center\" class=\"align-center\" \/>\n\uc790 \uc774\uc81c <code class=\"language-plaintext highlighter-rouge\">SQS -&gt; Lambda -&gt; S3<\/code>\ub97c \uad6c\ud604\ud558\uae30 \uc704\ud55c \ucf54\ub4dc\ub294 \uc544\ub798\uc640 \uac19\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># app.py\n<\/span><span class=\"kn\">from<\/span> <span class=\"nn\">chalice<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">Chalice<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">chalicelib.s3_manager<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">S3ManagerCore<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">logging<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">json<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">time<\/span>\n\n<span class=\"n\">app<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Chalice<\/span><span class=\"p\">(<\/span><span class=\"n\">app_name<\/span><span class=\"o\">=<\/span><span class=\"s\">'imager'<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"n\">debug<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">True<\/span>\n<span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"n\">log<\/span><span class=\"p\">.<\/span><span class=\"n\">setLevel<\/span><span class=\"p\">(<\/span><span class=\"n\">logging<\/span><span class=\"p\">.<\/span><span class=\"n\">DEBUG<\/span><span class=\"p\">)<\/span>\n\n<span class=\"o\">@<\/span><span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"n\">on_sqs_message<\/span><span class=\"p\">(<\/span><span class=\"n\">queue<\/span><span class=\"o\">=<\/span><span class=\"s\">'imager-queue'<\/span><span class=\"p\">,<\/span> <span class=\"n\">batch_size<\/span><span class=\"o\">=<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">def<\/span> <span class=\"nf\">build<\/span><span class=\"p\">(<\/span><span class=\"n\">event<\/span><span class=\"p\">):<\/span>\n    <span class=\"c1\">#app.log.info(\"Event: %s\", event.to_dict())\n<\/span>    <span class=\"n\">event<\/span> <span class=\"o\">=<\/span> <span class=\"n\">event<\/span><span class=\"p\">.<\/span><span class=\"n\">to_dict<\/span><span class=\"p\">()<\/span>\n    <span class=\"n\">status_code<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">200<\/span>\n    <span class=\"n\">records<\/span> <span class=\"o\">=<\/span> <span class=\"n\">event<\/span><span class=\"p\">.<\/span><span class=\"n\">get<\/span><span class=\"p\">(<\/span><span class=\"s\">'Records'<\/span><span class=\"p\">,<\/span> <span class=\"bp\">None<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">try<\/span><span class=\"p\">:<\/span>\n        <span class=\"k\">if<\/span> <span class=\"n\">records<\/span> <span class=\"ow\">is<\/span> <span class=\"ow\">not<\/span> <span class=\"bp\">None<\/span> <span class=\"ow\">and<\/span> <span class=\"n\">records<\/span><span class=\"p\">:<\/span>\n            <span class=\"k\">for<\/span> <span class=\"n\">rec<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">records<\/span><span class=\"p\">:<\/span>\n                <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">rec<\/span><span class=\"p\">)<\/span>\n                <span class=\"k\">try<\/span><span class=\"p\">:<\/span>\n                    <span class=\"n\">body<\/span> <span class=\"o\">=<\/span> <span class=\"n\">json<\/span><span class=\"p\">.<\/span><span class=\"n\">loads<\/span><span class=\"p\">(<\/span><span class=\"n\">rec<\/span><span class=\"p\">[<\/span><span class=\"s\">'body'<\/span><span class=\"p\">])<\/span>\n                    <span class=\"n\">filename<\/span> <span class=\"o\">=<\/span> <span class=\"n\">body<\/span><span class=\"p\">.<\/span><span class=\"n\">get<\/span><span class=\"p\">(<\/span><span class=\"s\">'filename'<\/span><span class=\"p\">)<\/span>\n                    <span class=\"n\">url<\/span> <span class=\"o\">=<\/span> <span class=\"n\">body<\/span><span class=\"p\">.<\/span><span class=\"n\">get<\/span><span class=\"p\">(<\/span><span class=\"s\">'url'<\/span><span class=\"p\">)<\/span>\n                    <span class=\"n\">build_core<\/span><span class=\"p\">(<\/span><span class=\"n\">filename<\/span><span class=\"p\">,<\/span> <span class=\"n\">url<\/span><span class=\"p\">)<\/span>\n                <span class=\"k\">except<\/span> <span class=\"nb\">Exception<\/span> <span class=\"k\">as<\/span> <span class=\"n\">e<\/span><span class=\"p\">:<\/span>\n                    <span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"n\">log<\/span><span class=\"p\">.<\/span><span class=\"n\">error<\/span><span class=\"p\">(<\/span><span class=\"n\">e<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">except<\/span> <span class=\"nb\">Exception<\/span> <span class=\"k\">as<\/span> <span class=\"n\">e<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">status_code<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">400<\/span>\n\n    <span class=\"n\">response<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n        <span class=\"s\">\"statusCode\"<\/span><span class=\"p\">:<\/span> <span class=\"n\">status_code<\/span><span class=\"p\">,<\/span>\n        <span class=\"s\">\"body\"<\/span><span class=\"p\">:<\/span> <span class=\"n\">json<\/span><span class=\"p\">.<\/span><span class=\"n\">dumps<\/span><span class=\"p\">(<\/span><span class=\"n\">event<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"k\">return<\/span> <span class=\"n\">response<\/span>\n\n<span class=\"c1\"># S3\uc5d0 \ub123\ub294 \ub85c\uc9c1\n<\/span><span class=\"k\">def<\/span> <span class=\"nf\">build_core<\/span><span class=\"p\">(<\/span><span class=\"n\">filename<\/span><span class=\"p\">,<\/span> <span class=\"n\">url<\/span><span class=\"p\">):<\/span>\n    <span class=\"n\">S3ManagerCore<\/span><span class=\"p\">.<\/span><span class=\"n\">build<\/span><span class=\"p\">(<\/span><span class=\"n\">filename<\/span><span class=\"p\">,<\/span> <span class=\"n\">url<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre><\/div><\/div>\n<p><code class=\"language-plaintext highlighter-rouge\">@app.on_sqs_message(queue='imager-queue', batch_size=1)<\/code> \uc774\ub77c\uace0 \ub370\ucf54\ub808\uc774\ud130\ub97c \uba39\uc774\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 event\ub97c \ubc1b\uc544 \uc62c \uc218 \uc788\ub2e4. \uc774\ub807\uac8c \ud3b8\ud560 \uc218 \uc5c6\ub2e4. \ub610\ud55c, batch_size\ub85c \ud55c\ubc88\uc5d0 \uac00\uc838\uc62c \uc218 \uc788\ub294 Queue\uc758 \uac2f\uc218\ub97c \uc815\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n<p>Deploy\ub97c \ud574\ubcf4\uaca0\ub2e4.<\/p>\n<div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>chalice deploy\nCreating deployment package.\n\nCould not <span class=\"nb\">install <\/span>dependencies:\n<span class=\"nv\">pillow<\/span><span class=\"o\">==<\/span>5.2.0\nYou will have to build these yourself and vendor them <span class=\"k\">in\n<\/span>the chalice vendor folder.\n\nYour deployment will <span class=\"k\">continue <\/span>but may not work correctly\n<span class=\"k\">if <\/span>missing dependencies are not present. For more information:\nhttp:\/\/chalice.readthedocs.io\/en\/latest\/topics\/packaging.html\n\nCreating IAM role: imager-dev\nCreating lambda <span class=\"k\">function<\/span>: imager-dev-build\nSubscribing imager-dev-build to SQS queue imager-queue\nResources deployed:\n  - Lambda ARN: arn:aws:lambda:ap-northeast-2:xxxxxxxx:function:imager-dev-build\n<\/code><\/pre><\/div><\/div>\n<p>\ubb38\uc81c\uc5c6\uc774 \uc5c5\ub85c\ub4dc \ub418\uc5c8\ub2e4. IAM role\ub3c4 \uc790\ub3d9\uc73c\ub85c \uc0dd\uc131\ub418\uc5b4 \ud3b8\ub9ac\ud558\ub2e4. \ucf58\uc194\uc5d0 \ub4e4\uc5b4\uac00 \ud655\uc778\ud574\ubcf4\uba74, \uc815\uc0c1\uc801\uc73c\ub85c SQS\uc640 \ub9f5\ud551\uc774 \ub41c\uac83\uc744 \ud655\uc778\ud560\uc218 \uc788\ub2e4.<\/p>\n\n<p><img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/aws-lambda-sqs.png\" alt=\"image-center\" class=\"align-center\" \/><\/p>\n\n<p>\uc2e4\uc81c\ub85c SQS\uc5d0 Queue\ub97c \ub0a0\ub824\ubcf4\ub2c8 S3\uc5d0 \ubb38\uc81c\uc5c6\uc774 \uc801\uc7ac\ub418\ub294 \uac83\uc744 \ud655\uc778\ud558\uc600\ub2e4. \uaf2d \ub2e4\uc74c\uacfc \uac19\uc740 \ubc29\uc2dd\uc774 \uc544\ub2c8\ub354\ub77c\ub3c4 \uc5ec\ub7ec \ubc29\uba74\uc73c\ub85c \ud65c\uc6a9\uc131\uc774 \uc88b\uc544\ubcf4\uc774\ub294 Chalice\uc600\ub2e4. Zappa\uc640\ub294 \ub2e4\ub978\uc810\uc73c\ub85c\ub294 <code class=\"language-plaintext highlighter-rouge\">app.py<\/code>\uc5d0\uc11c \uc815\uc758\ud55c function \ub9cc\ud07c \uac01\uae30 \ubcc4\ub3c4\uc758 Lambda\ub85c Deploy\ub418\uc5b4 \uc5ec\ub7ec\uac1c\uc758 Lambda\ub97c \ud558\ub098\uc758 \uc18c\uc2a4\uc5d0\uc11c \ud1b5\ud569\uad00\ub9ac\uac00 \uac00\ub2a5\ud574 \ubcf4\uc600\ub2e4. (Zappa \uac19\uc740\uacbd\uc6b0, \ud558\ub098\uc758 Lambda\uc5d0 url path\uc5d0 \ub530\ub978 \ubd84\uae30)<\/p>\n","pubDate":"Thu, 04 Oct 2018 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/python\/chalice\/serverless\/python-chalice\/","guid":"https:\/\/hidekuma.github.io\/python\/chalice\/serverless\/python-chalice\/","category":["chalice","serverless","Python","Chalice","Serverless"]},{"title":"Python: \ud30c\uc774\uc36c Zappa\ub85c AWS Lambda\uc5d0 \uc11c\ubc84\ub9ac\uc2a4 Web \uad6c\ud604\ud558\uae30","description":"<h2 id=\"flask--zappa--aws-lambda\">Flask + Zappa &gt; AWS Lambda<\/h2>\n<p>Flask\ub098 django\uc640 \uac19\uc740 \ud30c\uc774\uc36c \uc6f9\uc744 \uc11c\ubc84\ub9ac\uc2a4\ub85c \ub744\uc6b0\ub294 \ub370 Zappa\ub294 \ub9e4\uc6b0 \uc6a9\uc774\ud558\ub2e4. <a href=\"https:\/\/hidekuma.github.io\/python\/chalice\/serverless\/python-chalice\/\">Chalice<\/a>\uc640 \ub2ec\ub9ac \ub514\ud50c\ub85c\uc774 \ud588\uc744 \uc2dc, \ud558\ub098\uc758 Lambda\ud568\uc218\uc5d0\uc11c \ubaa8\ub4e0 Requests\ub97c \uad00\ub9ac\ud574\uc900\ub2e4. \ub610\ud55c Flask Web\uc5d0\uc11c \ud558\ub4ef\uc774 \ucf54\ub4dc\ub97c \uc790\uc720\ub86d\uac8c \uc9dc\uba74 \ub418\uae30 \ub54c\ubb38\uc5d0, \ud574\ub2f9 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\uc5d0 \uce5c\uc219\ud55c \uc0ac\ub78c\uc774\ub77c\uba74, Zappa\ub97c \ucc44\ud0dd\ud558\ub294 \uac83\uc774 \uc633\ub2e4.<\/p>\n<ul>\n  <li><a href=\"https:\/\/github.com\/Miserlou\/Zappa\">Zappa github<\/a><\/li>\n<\/ul>\n\n<ol>\n  <li>\uac00\uc0c1\ud658\uacbd\uc5d0 \uc9c4\uc785\ud55c\ub2e4. \ub098\uc758 \uacbd\uc6b0 (zappa-test)\ub77c\uace0 \uac00\uc0c1\ud658\uacbd\uc744 \ub9cc\ub4e4\uc5c8\ub2e4. <br \/><a href=\"https:\/\/hidekuma.github.io\/python\/virtualenv\/virtualenvwrapper\/python-virtualenv-wrapper\/\"><strong>\uac00\uc0c1\ud658\uacbd\uc744 \ub9cc\ub4dc\ub294 \ubc29\ubc95<\/strong>\uc5d0 \ub300\ud574 \uc54c\uace0 \uc2f6\ub2e4\uba74, \ud574\ub2f9 \ud3ec\uc2a4\ud2b8\ub97c \ucc38\uace0\ud558\uba74 \ub41c\ub2e4.<\/a><\/li>\n<\/ol>\n\n<!--more-->\n<ol>\n  <li>zappa \uc124\uce58.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"o\">(<\/span>zappa-test<span class=\"o\">)<\/span> <span class=\"nv\">$ <\/span>pip <span class=\"nb\">install <\/span>zappa\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>zappa init \ud55c\ub2e4.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"o\">(<\/span>zappa-test<span class=\"o\">)<\/span> <span class=\"nv\">$ <\/span>zappa init\n<\/code><\/pre><\/div>    <\/div>\n    <p>zappa init \ucee4\ub9e8\ub4dc\ub97c \uce58\uba74, \uba87 \uac00\uc9c0 \uc9c8\uc758\ub97c \ud574\uc628\ub2e4.<\/p>\n    <ul>\n      <li>\n        <dl>\n          <dt><strong>What do you want to call this environment (default \u2018dev\u2019)<\/strong><\/dt>\n          <dd>APIGateway -&gt; stage\uc640 \uc5f0\uacb0\ub41c\ub2e4. \uc790\uc2e0\uc774 \ud604\uc7ac \ub9cc\ub4dc\ub294 \ud658\uacbd\uc744 \uc815\uc758\ud574\uc8fc\uba74\ub41c\ub2e4. Deploy \uc6a9\ub3c4\ub77c\uba74 production\ub4f1\uc73c\ub85c \uc815\uc758\ud574\uc8fc\uba74 \ub41c\ub2e4. \ub098\uc911\uc5d0 \ubcc0\uacbd\uac00\ub2a5\ud558\ub2c8, \uc9c0\uae08\uc740 dev\ub85c \uc815\uc758\ud558\uc790.<\/dd>\n        <\/dl>\n      <\/li>\n      <li>\n        <dl>\n          <dt><strong>What do you want to call your bucket? (default \u2018zappa-xxxxxx\u2019)<\/strong><\/dt>\n          <dd>\uc774\ubbf8 Lambda function \uc18c\uc2a4\ub97c zip\ud615\ud0dc\ub85c \uc801\uc7ac\ud560 S3 Bucket\uc774 \uc788\ub2e4\uba74 \ub123\uc5b4\uc8fc\uace0, \uc5c6\ub2e4\uba74 \ub124\uc774\ubc0d \ud574\uc8fc\uba74 \ud574\ub2f9 \ubc84\ud0b7\uc774 S3\uc5d0 \uc0dd\uc131\ub41c\ub2e4.<\/dd>\n        <\/dl>\n      <\/li>\n      <li>\n        <dl>\n          <dt><strong>Would you like to deploy this application globally? (default \u2018n\u2019) [y\/n\/(p)rimary]<\/strong><\/dt>\n          <dd>\uae00\ub85c\ubc8c \ud558\uac8c \uc0ac\uc6a9\ud560 \uac83\uc778\uc9c0\ub97c \ubb3b\ub294\ub370, \uac01 \ub9ac\uc804\ub9c8\ub2e4 \ub78c\ub2e4\ub97c \uc0ac\uc6a9\ud574\uc57c \ud560 \uacbd\uc6b0\uc5d0\ub9cc, y\ub85c \ud558\uc790. \ud639\uc2dc y\ub85c \ud55c\ub2e4\uba74, zappa_settings.json\uc5d0 \ub9ac\uc804\ubcc4 config\uac00 \uc0dd\uc131\uc774 \ub420\uac83\uc774\ub2e4.<\/dd>\n        <\/dl>\n      <\/li>\n      <li>\n        <dl>\n          <dt><strong>Where is your app\u2019s function?<\/strong><\/dt>\n          <dd>\uc2e4\ud589 \uc2dc\ud0ac \ud639\uc740 \uc2e4\ud589 \uc2dc\ud0ac \uc608\uc815\uc778 py\ud30c\uc77c\uc744 \ub123\uc5b4\uc8fc\uba74 \ub41c\ub2e4. \ub098\uac19\uc740 \uacbd\uc6b0 app.py\uc73c\ub85c \ud30c\uc77c\uc744 \ub9cc\ub4e4 \uc608\uc815\uc774\ub2c8 app.app\uc774\ub77c\uace0 \ub123\uc5c8\ub2e4.<\/dd>\n        <\/dl>\n      <\/li>\n    <\/ul>\n  <\/li>\n  <li><strong>zappa_settings.json \uccb4\ud06c<\/strong>\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"o\">(<\/span>zappa-test<span class=\"o\">)<\/span> <span class=\"nv\">$ <\/span>tree\n<span class=\"nb\">.<\/span>\n\u2514\u2500\u2500 zappa_settings.json\n0 directories, 1 file\n<\/code><\/pre><\/div>    <\/div>\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"o\">(<\/span>zappa-test<span class=\"o\">)<\/span> <span class=\"nv\">$ <\/span><span class=\"nb\">cat <\/span>zappa_settings.json\n<span class=\"o\">{<\/span>\n <span class=\"s2\">\"dev\"<\/span>: <span class=\"o\">{<\/span>\n     <span class=\"s2\">\"app_function\"<\/span>: <span class=\"s2\">\"app.app\"<\/span>,\n     <span class=\"s2\">\"aws_region\"<\/span>: <span class=\"s2\">\"ap-northeast-2\"<\/span>,\n     <span class=\"s2\">\"profile_name\"<\/span>: <span class=\"s2\">\"default\"<\/span>,\n     <span class=\"s2\">\"project_name\"<\/span>: <span class=\"s2\">\"zappa-test\"<\/span>,\n     <span class=\"s2\">\"runtime\"<\/span>: <span class=\"s2\">\"python3.6\"<\/span>,\n     <span class=\"s2\">\"s3_bucket\"<\/span>: <span class=\"s2\">\"zappa-test\"<\/span>\n <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>Web Framework\uc740 Flask\ub97c \uc0ac\uc6a9\ud55c\ub2e4. (django\ub3c4 \uc9c0\uc6d0\ud568.)\n    <div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\">#app.py\n<\/span><span class=\"kn\">import<\/span> <span class=\"nn\">sys<\/span>\n<span class=\"kn\">from<\/span> <span class=\"nn\">flask<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">Flask<\/span><span class=\"p\">,<\/span> <span class=\"n\">redirect<\/span><span class=\"p\">,<\/span> <span class=\"n\">request<\/span><span class=\"p\">,<\/span> <span class=\"n\">jsonify<\/span><span class=\"p\">,<\/span> <span class=\"n\">url_for<\/span><span class=\"p\">,<\/span> <span class=\"n\">render_template<\/span>\n<span class=\"n\">app<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Flask<\/span><span class=\"p\">(<\/span><span class=\"n\">__name__<\/span><span class=\"p\">,<\/span> <span class=\"n\">static_url_path<\/span><span class=\"o\">=<\/span><span class=\"s\">''<\/span><span class=\"p\">)<\/span>\n<span class=\"o\">@<\/span><span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"n\">route<\/span><span class=\"p\">(<\/span><span class=\"s\">'\/'<\/span><span class=\"p\">,<\/span> <span class=\"n\">methods<\/span><span class=\"o\">=<\/span><span class=\"p\">[<\/span><span class=\"s\">'GET'<\/span><span class=\"p\">])<\/span>\n<span class=\"k\">def<\/span> <span class=\"nf\">index<\/span><span class=\"p\">():<\/span>\n     <span class=\"k\">return<\/span> <span class=\"s\">'hello zappa!'<\/span>\n<span class=\"k\">if<\/span> <span class=\"n\">__name__<\/span> <span class=\"o\">==<\/span> <span class=\"s\">'__main__'<\/span><span class=\"p\">:<\/span>\n <span class=\"k\">if<\/span> <span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">sys<\/span><span class=\"p\">.<\/span><span class=\"n\">argv<\/span><span class=\"p\">)<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mi\">1<\/span><span class=\"p\">:<\/span>\n     <span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"n\">debug<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">True<\/span>\n     <span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"n\">jinja_env<\/span><span class=\"p\">.<\/span><span class=\"n\">auto_reload<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">True<\/span>\n     <span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"n\">config<\/span><span class=\"p\">[<\/span><span class=\"s\">'TEMPLATES_AUTO_RELOAD'<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">True<\/span>\n     <span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"n\">run<\/span><span class=\"p\">(<\/span><span class=\"n\">host<\/span><span class=\"o\">=<\/span><span class=\"s\">'0.0.0.0'<\/span><span class=\"p\">,<\/span> <span class=\"n\">port<\/span><span class=\"o\">=<\/span><span class=\"mi\">4000<\/span><span class=\"p\">)<\/span>\n <span class=\"k\">else<\/span><span class=\"p\">:<\/span>\n     <span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"n\">run<\/span><span class=\"p\">(<\/span><span class=\"n\">host<\/span><span class=\"o\">=<\/span><span class=\"s\">'0.0.0.0'<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre><\/div>    <\/div>\n    <p>\uac1c\ubc1c\ud658\uacbd\uc744 \uad6c\ubd84\ud558\uae30 \uc704\ud574 \ub7ec\ub2dd \ucee4\ub9e8\ub4dc\uc5d0 \uc778\uc790\ub97c \ubc1b\uc744 \uc218 \uc788\uac8c\ub054 \uad6c\uc131\ud558\uc600\ub2e4.<\/p>\n    <ul>\n      <li>\n        <dl>\n          <dt><strong>app.debug<\/strong><\/dt>\n          <dd>\uc624\ub958\uc0ac\ud56d\uc774 \uc788\uc744 \uc2dc, view\uc5d0 \uc624\ub958\ub0b4\uc6a9\uc774 \uadf8\ub824\uc9c4\ub2e4.<\/dd>\n        <\/dl>\n      <\/li>\n      <li>\n        <dl>\n          <dt><strong>app.jinja_env.auto_reload \/ app.config[\u2018TEMPLATES_AUTO_RELOAD\u2019]<\/strong><\/dt>\n          <dd>jinja \/ html \/ py \ud30c\uc77c \ubcc0\uacbd\uc810\uc774 \uc788\uc744 \uc2dc, \ubc14\ub85c \uc7ac\ub85c\ub4dc\ud55c\ub2e4.<\/dd>\n        <\/dl>\n      <\/li>\n    <\/ul>\n  <\/li>\n  <li>Flask \uc124\uce58.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"o\">(<\/span>zappa-test<span class=\"o\">)<\/span> <span class=\"nv\">$ <\/span>pip <span class=\"nb\">install <\/span>flask\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>\uc2e4\ud589\uc2dc\ucf1c\ubcf4\uc790.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"o\">(<\/span>zappa-test<span class=\"o\">)<\/span> <span class=\"nv\">$ <\/span>python app.py <span class=\"nb\">test<\/span>\n <span class=\"k\">*<\/span> Serving Flask app <span class=\"s2\">\"app\"<\/span> <span class=\"o\">(<\/span>lazy loading<span class=\"o\">)<\/span>\n <span class=\"k\">*<\/span> Environment: production\nWARNING: Do not use the development server <span class=\"k\">in <\/span>a production environment.\nUse a production WSGI server instead.\n <span class=\"k\">*<\/span> Debug mode: on\n <span class=\"k\">*<\/span> Running on http:\/\/0.0.0.0:4000\/ <span class=\"o\">(<\/span>Press CTRL+C to quit<span class=\"o\">)<\/span>\n <span class=\"k\">*<\/span> Restarting with <span class=\"nb\">stat<\/span>\n <span class=\"k\">*<\/span> Debugger is active!\n <span class=\"k\">*<\/span> Debugger PIN: 954-150-263\n<\/code><\/pre><\/div>    <\/div>\n    <p><img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/hello-zappa.png\" alt=\"image-center\" class=\"align-center\" \/>\n\uc798 \ub3d9\uc791\ud558\ub294 \uac78 \ud655\uc778\ud588\ub2e4.<\/p>\n  <\/li>\n  <li>AWS Lambda\uc5d0 \uc5c5\ub85c\ub4dc\ud574\ubcf4\uc790.\n<a href=\"https:\/\/aws.amazon.com\/ko\/blogs\/security\/a-new-and-standardized-way-to-manage-credentials-in-the-aws-sdks\/\">AWS credentials file<\/a> \uc124\uc815\uc740 \uc774\ubbf8 \uc644\ub8cc\ub418\uc5b4\uc788\uc5b4\uc57c\ud55c\ub2e4. \uc798 \ubaa8\ub974\uaca0\ub2e4\uba74 \ubb38\uc11c\ub97c \ucc38\uace0\ud558\uc790.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"o\">(<\/span>zappa-test<span class=\"o\">)<\/span> <span class=\"nv\">$ <\/span>zappa deploy dev\nCalling deploy <span class=\"k\">for <\/span>stage dev..\nWarning! Your project and virtualenv have the same name! You may want to re-create your venv with a new name, or explicitly define a <span class=\"s1\">'project_name'<\/span>, as this may cause errors.\nDownloading and installing dependencies..\n - <span class=\"nv\">sqlite<\/span><span class=\"o\">==<\/span>python36: Using precompiled lambda package\nPackaging project as zip.\nUploading zappa-test-dev-1538977358.zip <span class=\"o\">(<\/span>5.7MiB<span class=\"o\">)<\/span>..\n100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 5.95M\/5.95M <span class=\"o\">[<\/span>00:00&lt;00:00, 8.63MB\/s]\nScheduling..\nScheduled zappa-test-dev-zappa-keep-warm-handler.keep_warm_callback with expression rate<span class=\"o\">(<\/span>4 minutes<span class=\"o\">)!<\/span>\nUploading zappa-test-dev-template-1538977365.json <span class=\"o\">(<\/span>1.6KiB<span class=\"o\">)<\/span>..\n100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 1.64K\/1.64K <span class=\"o\">[<\/span>00:00&lt;00:00, 47.1KB\/s]\nWaiting <span class=\"k\">for <\/span>stack zappa-test-dev to create <span class=\"o\">(<\/span>this can take a bit<span class=\"o\">)<\/span>..\n100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 4\/4 <span class=\"o\">[<\/span>00:09&lt;00:00,  2.66s\/res]\nDeploying API Gateway..\nDeployment <span class=\"nb\">complete<\/span><span class=\"o\">!<\/span>: https:\/\/scv5bcbvag.execute-api.ap-northeast-2.amazonaws.com\/dev\n<\/code><\/pre><\/div>    <\/div>\n    <p><img src=\"https:\/\/hidekuma.github.io\/images\/post-imgs\/zappa-lambda-output.png\" alt=\"image-center\" class=\"align-center\" \/>\n\uc798 \uc5c5\ub85c\ub4dc \ub418\uc5c8\ub2e4.<\/p>\n  <\/li>\n  <li>undeploy\ub97c \ud574\ubcf4\uc790\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"o\">(<\/span>zappa-test<span class=\"o\">)<\/span> <span class=\"nv\">$ <\/span>zappa undeploy dev\nCalling undeploy <span class=\"k\">for <\/span>stage dev..\nAre you sure you want to undeploy? <span class=\"o\">[<\/span>y\/n] y\nDeleting API Gateway..\nWaiting <span class=\"k\">for <\/span>stack zappa-test-dev to be deleted..\nUnscheduling..\nUnscheduled zappa-test-dev-zappa-keep-warm-handler.keep_warm_callback.\nDeleting Lambda <span class=\"k\">function<\/span>..\nDone!\n<\/code><\/pre><\/div>    <\/div>\n    <p>\uae68\ub057\ud558\uac8c \uc0ad\uc81c\ud558\uace0 \uc2f6\ub2e4\uba74, \ud574\ub2f9 \ucee4\ub9e8\ub4dc\ub85c\ub294 AWS IAM Role\uacfc S3 Bucket\uc740 \uc0ad\uc81c\ub418\uc9c0 \uc54a\uc73c\ub2c8, \ucf58\uc194\uc5d0 \uc811\uc18d\ud558\uc5ec \uc9c1\uc811 \uc9c0\uc6cc\uc8fc\uba74 \ub41c\ub2e4.<\/p>\n  <\/li>\n<\/ol>\n\n<p class=\"notice--warning\"><strong>Deploy\uc2dc \uc8fc\uc758\ud560 \uc810!<\/strong> <br \/> *.pyc \uce90\uc2dc \ud30c\uc77c\uc774 \uac19\uc774 \uc5c5\ub85c\ub4dc \ub418\uba74, TypeError: \u2018NoneType\u2019 object is not callable\uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud55c\ub2e4. \ub530\ub77c\uc11c \ud504\ub85c\uc81d\ud2b8 \ub0b4 \ud30c\uc774\uc36c \uce90\uc2dc\ud30c\uc77c\uc744 \ubaa8\ub450 \uc9c0\uc6cc\uc8fc\ub294 \ud3b8\uc774 \uc88b\ub2e4. \uc608\ub97c \ub4e4\uba74, find . -name *.pyc -delete \ud574\ub2f9 \uc258\ub85c \uc190\uc27d\uac8c \uc9c0\uc6b8\uc218 \uc788\ub2e4.<\/p>\n\n<hr \/>\n<h2 id=\"\uc790\uc8fc-\uc4f0\ub294-commands\">\uc790\uc8fc \uc4f0\ub294 Commands<\/h2>\n<ul>\n  <li>\n    <dl>\n      <dt>zappa deploy [stage]<\/dt>\n      <dd>\ud574\ub2f9 \uc2a4\ud14c\uc774\uc9c0\ub85c \uc18c\uc2a4\ub97c \uc5c5\ub85c\ub4dc\ud55c\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt>zappa update [stage]<\/dt>\n      <dd>\ud574\ub2f9 \uc2a4\ud14c\uc774\uc9c0\ub97c \uc5c5\ub370\uc774\ud2b8\ud55c\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt>zappa undeploy [stage]<\/dt>\n      <dd>\ud574\ub2f9 \uc2a4\ud14c\uc774\uc9c0\ub97c \uc0ad\uc81c\ud55c\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt>zappa tail [stage]<\/dt>\n      <dd>\ud574\ub2f9 \uc2a4\ud14c\uc774\uc9c0\uc758 \ub85c\uadf8\ub97c \ubcfc \uc218 \uc788\ub2e4. ex) zappa tail dev \u2013since 1m \u2013filter \u2018error\u2019<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt>zappa rollback [stage] -n [\uc22b\uc790]<\/dt>\n      <dd>\uc22b\uc790\ub9cc\ud07c \ub514\ud50c\ub85c\uc774 \ud588\ub358 \ud69f\uc218\ub97c \ucde8\uc18c\ud55c\ub2e4. \uc989 \ud604 \uc2dc\uc810\uc5d0\uc11c [\uc22b\uc790]\ud68c \uc804 \ub514\ud50c\ub85c\uc774 \ud658\uacbd\uc73c\ub85c \ub864\ubc31\uc2dc\ucf1c\uc900\ub2e4. ex) zappa rollback dev -n 1 (1\ud68c \uc804 \ub514\ud50c\ub85c\uc774 \ud658\uacbd\uc73c\ub85c \ub864\ubc31)<\/dd>\n    <\/dl>\n  <\/li>\n<\/ul>\n\n","pubDate":"Fri, 03 Aug 2018 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/serverless\/aws\/lambda\/apigateway\/zappa\/python-zappa\/","guid":"https:\/\/hidekuma.github.io\/serverless\/aws\/lambda\/apigateway\/zappa\/python-zappa\/","category":["serverless","aws","lambda","apigateway","zappa","Serverless","AWS","Lambda","APIGateway","Zappa"]},{"title":"Python: \ud30c\uc774\uc36c pyenv\ub97c \ud1b5\ud55c \ub2e4\uc591\ud55c \ud30c\uc774\uc36c \ubc84\uc804 \uc9c0\uc815\ubc95","description":"<h3 id=\"\ub2e8\uc21c\ud788-python-\ubc84\uc804\uc744-\uc9c0\uc815\ud558\ub294-\ubc29\ubc95\">\ub2e8\uc21c\ud788 Python \ubc84\uc804\uc744 \uc9c0\uc815\ud558\ub294 \ubc29\ubc95<\/h3>\n<p>pyenv\uc5d0\uc11c python \ubc84\uc804\uc744 \uad00\ub9ac\ud574\uc8fc\ub294\ub370, \ub2e8\uc21c\ud788 python \ub77c\uace0 \ucce4\uc744 \ub54c\uc758 \ubc84\uc804\uc744 \uc9c0\uc815\ud558\uace0\uc2f6\ub2e4\uba74!<\/p>\n\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">pyenv<\/span> <span class=\"k\">global<\/span> <span class=\"mf\">2.7<\/span><span class=\"p\">.<\/span><span class=\"mi\">5<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\ub77c\uace0 \ud558\uba74 \ub41c\ub2e4.<\/p>\n\n<h3 id=\"\ud558\uc9c0\ub9cc-python27-\uc774\ub77c\ub358\uc9c0-python35-\ucc98\ub7fc-\uc138\uc138\ud558\uac8c-\uc0ac\uc6a9\ud558\uace0-\uc2f6\ub2e4\uba74\">\ud558\uc9c0\ub9cc, python2.7 \uc774\ub77c\ub358\uc9c0 python3.5 \ucc98\ub7fc \uc138\uc138\ud558\uac8c \uc0ac\uc6a9\ud558\uace0 \uc2f6\ub2e4\uba74?<\/h3>\n<p>\uc608\ub97c \ub4e4\uc5b4, python3.5\ub97c \ucce4\uc744 \ub54c \uc774\ub7f0 \uc624\ub958\uac00 \ub098\uc628\ub2e4.<\/p>\n\n<div class=\"language-plaintext highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>pyenv: python3.5: command not found\nThe 'python3.5' command exists in these Python versions:\n  3.5.2\n<\/code><\/pre><\/div><\/div>\n\n<p>\uc774\ub7f4 \ub54c\ub294 \uc5ec\ub7ec \ubc84\uc804\uc744 \ub098\ub780\ud788 \uc4f0\uba74\ub41c\ub2e4. \ubb3c\ub860 pyenv install [python-version] \uc73c\ub85c \ud574\ub2f9 \ubc84\uc804\uc758 \ud30c\uc774\uc36c\uc774 \uc778\uc2a4\ud1a8\ub418\uc5b4\uc57c\ud55c\ub2e4.<\/p>\n<div class=\"language-python highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>  <span class=\"n\">pyenv<\/span> <span class=\"k\">global<\/span> <span class=\"n\">system<\/span> <span class=\"mf\">2.7<\/span><span class=\"p\">.<\/span><span class=\"mi\">5<\/span> <span class=\"mf\">3.5<\/span><span class=\"p\">.<\/span><span class=\"mi\">2<\/span> <span class=\"mf\">3.3<\/span><span class=\"p\">.<\/span><span class=\"mi\">2<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>\uc774\ub807\uac8c\ud558\uba74 \uae30\ubcf8 python\uc5d0\uc11c\ub294 \uc2dc\uc2a4\ud15c python\uc774 \uc0ac\uc6a9\ub418\uc5b4 python2.7\uc5d0\uc11c\ub294 2.7.5, python3.5\uc5d0\uc11c\ub294 3.5.2, python3.3\uc5d0\uc11c\ub294 3.3.2\uac00 \uc0ac\uc6a9\ub41c\ub2e4\ub294 \uc2dd\uc73c\ub85c \ub41c\ub2e4!<\/p>\n","pubDate":"Fri, 22 Jun 2018 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/python\/pyenv\/python-versioning-with-pyenv\/","guid":"https:\/\/hidekuma.github.io\/python\/pyenv\/python-versioning-with-pyenv\/","category":["pyenv","Python","Pyenv"]},{"title":"Python: \ud30c\uc774\uc36c \uac00\uc0c1\ud658\uacbd \ub9cc\ub4e4\uae30 (virtualenv + virtualenvWrapper)","description":"<h2 id=\"python-\uac00\uc0c1\ud658\uacbd\uc744-\uc190\uc27d\uac8c-\uad6c\ucd95\ud558\uc790\">Python \uac00\uc0c1\ud658\uacbd\uc744 \uc190\uc27d\uac8c \uad6c\ucd95\ud558\uc790.<\/h2>\n<p>Python\uc73c\ub85c \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\ub294\ub370, \uac00\uc0c1\ud658\uacbd\uc744 \uad6c\ucd95\ud558\ub294 \uac74 \ud544\uc218\uc801\uc774\ub2e4. venv, pyenv \ub4f1 \uac00\uc0c1\ud658\uacbd\uc744 \uad00\ub9ac\ud574\uc8fc\ub294 \ud328\ud0a4\uc9c0\ub4e4\uc774 \uc788\ub294\ub370, \uadf8 \uc911\uc5d0\uc11c\ub3c4 virtualenv\uc640 virtualenvWrapper\ub97c \uac00\uc7a5 \uc88b\uc544\ud55c\ub2e4. \uc774\uc720\ub294 \uac1c\uc778\uc801\uc73c\ub85c \uac00\uc0c1\ud658\uacbd \uad6c\ucd95\uacfc \ub3d9\uc2dc\uc5d0 \uad00\ub9ac \ub4f1\uc774 \uac00\uc7a5 \ud3b8\ub9ac\ud588\ub2e4\uace0 \ub290\uaf08\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n\n<p>\ud55c\ubc88 \uc124\uc815\ud574\ubcf4\uc790.<\/p>\n\n<hr \/>\n<h3 id=\"virtualenv-\uc124\uce58\">virtualenv \uc124\uce58<\/h3>\n<p>Mac\uc5d0\ub294 \uc774\ubbf8 python2\uac00 \uc124\uce58\ub418\uc5b4\uc788\uc9c0\ub9cc, python3\ub97c \uc774\uc6a9\ud558\uace0\uc2f6\uae30 \ub54c\ubb38\uc5d0 \uba3c\uc800 \uc124\uce58\ub2e4. pyenv\uac00 \uc124\uce58\ub418\uc5b4\uc788\ub2e4\uba74, pyenv\ub97c \uc0ac\uc6a9\ud558\ub294\uac8c \ubc14\ub78c\uc9c1\ud558\ub2e4.<\/p>\n\n<ol>\n  <li>python3 \uc124\uce58\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>brew <span class=\"nb\">install <\/span>python3\n<span class=\"nv\">$ <\/span>python <span class=\"nt\">-m<\/span> pip <span class=\"nt\">-V<\/span>\npip 9.0.1 from \/Library\/Frameworks\/Python.framework\/Versions\/3.6\/lib\/python3.6\/site-packages <span class=\"o\">(<\/span>python 3.6<span class=\"o\">)<\/span>\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>\uc815\uc0c1\uc801\uc73c\ub85c \uc124\uce58\uac00 \uc644\ub8cc\ub418\uc5c8\ub2e4\uba74, \ud328\ud0a4\uc9c0\ub4e4\uc744 \uc124\uce58\ud558\uc790.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>pip3 <span class=\"nb\">install <\/span>virtualenv virtualenvwrapper\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>\uac00\uc0c1\ud658\uacbd \ub9cc\ub4e4\uae30\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>virtualenv <span class=\"nt\">--python<\/span><span class=\"o\">=<\/span>python3.6 <span class=\"o\">[<\/span>\uac00\uc0c1\ud658\uacbd\uc774\ub984]\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>\uac00\uc0c1\ud658\uacbd \uc9c4\uc785\ud558\uae30\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">source<\/span> <span class=\"o\">[<\/span>\uac00\uc0c1\ud658\uacbd\uc774\ub984] \/bin\/activate\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>\uac00\uc0c1\ud658\uacbd \ubc97\uc5b4\ub098\uae30\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>deactivate\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n<\/ol>\n\n<p class=\"notice--warning\">\ub9cc\uc57d The path x.x does not exist\ub77c\ub294 \uc5d0\ub7ec\uac00 \ub09c\ub2e4\uba74 PYTHON\uc758 PATH \uacbd\ub85c\ubb38\uc81c\uc774\ub2e4. \ud658\uacbd\ubcc0\uc218\ub97c \uc808\ub300\uacbd\ub85c\ub85c \ub9de\ucdb0\uc8fc\uba74 \ub41c\ub2e4.\n\uc608\ub97c\ub4e4\uc5b4, which python3\uc744 \ud588\uc744 \ub54c \/usr\/bin\/python3\uc774 \ub098\uc654\ub2e4\uba74, virtualenv \u2013python=\/usr\/bin\/python3\uc640 \uac19\uc774 \uc808\ub300\uacbd\ub85c\ub85c \uc785\ub825\ud574\uc8fc\uc2dc\uba74 \ud574\uacb0\ub41c\ub2e4.<\/p>\n\n<hr \/>\n\n<h3 id=\"virtualenvwrapper-\uc124\uce58\">virtualenvWrapper \uc124\uce58<\/h3>\n<p>\uc774\ub807\uac8c virtualenv\ub97c \ud1b5\ud574\uc11c \uac00\uc0c1\ud658\uacbd\uc744 \ub9cc\ub4e4\uace0 \uc9c4\uc785\ud558\ub294 \ubc29\ubc95\uc744 \uc54c\uc544\ubcf4\uc558\ub2e4. \ud558\uc9c0\ub9cc \ubd88\ud3b8\ud55c\uc810\uc774 \uc788\ub2e4. source\ub97c \ud1b5\ud574 \uac00\uc0c1\ud658\uacbd\uc5d0 \uc9c4\uc785\ud558\ub824\uba74 \uc124\uce58\ub41c \ub514\ub809\ud1a0\ub9ac\ub85c \uc774\ub3d9\ud558\uace0, \uc5b4\ub514\uc5d0 \uac00\uc0c1\ud658\uacbd\uc774 \uad6c\ucd95\ub418\uc5b4\uc788\ub294\uc9c0 \uc0ac\uc6a9\uc790\uac00 \uc77c\uc77c\uc774 \uc54c\uace0 \ud655\uc778\ud574\uc57c\ud558\uae30 \ub54c\ubb38. \uc774\ub7ec\ud55c \ubb38\uc81c\uc810\uc744 \ud574\uacb0\ud558\uae30 \uc704\ud574  virtualenvWrapper\uc744 \uc0ac\uc6a9\ud558\uc790.<\/p>\n\n<ol>\n  <li>\uac00\uc0c1\ud658\uacbd \ub514\ub809\ud1a0\ub9ac \uc124\uc815\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">mkdir<\/span> ~\/.virtualenvs\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>\ud658\uacbd\ubcc0\uc218 \uc124\uc815\ud558\uae30\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">export <\/span><span class=\"nv\">WORKON_HOME<\/span><span class=\"o\">=<\/span>~\/.virtualenvs\n<span class=\"nv\">$ <\/span><span class=\"nb\">export <\/span><span class=\"nv\">VIRTUALENVWRAPPER_PYTHON<\/span><span class=\"o\">=<\/span><span class=\"s1\">'\ud30c\uc774\uc36c\uc758 \uacbd\ub85c'<\/span>  <span class=\"c\"># Usage of python3<\/span>\n<span class=\"nv\">$ <\/span><span class=\"nb\">source<\/span> \/usr\/local\/bin\/virtualenvwrapper.sh\n<\/code><\/pre><\/div>    <\/div>\n    <p>home \ub514\ub809\ud1a0\ub9ac\uc5d0 .bashrc\ub098 .bash_profile\uc758 \ub9c8\uc9c0\ub9c9\uc5d0 \uc0c1\uae30 \ucf54\ub4dc\ub97c \ubcf5\ubd99\ud574\uc900\ub2e4. \ud30c\uc77c\uc774 \uc5c6\ub2e4\uba74 \ub9cc\ub4e4\uba74 \ub41c\ub2e4. \ub610\ub294 zsh\ub97c \uc0ac\uc6a9\uc911\uc77c \uacbd\uc6b0\uc5d0\ub294 .zshrc\ucabd\uc5d0 \ub123\uc5b4\uc8fc\uba74 \ub41c\ub2e4. python\uc758 \uacbd\ub85c\ub97c \ubaa8\ub97c\uacbd\uc6b0\uc5d0\ub294 which python3\ub85c \uac80\uc0c9\ud574\ubcf4\uc790.<\/p>\n  <\/li>\n  <li>\ud639\uc2dc \/usr\/local\/bin\uc5d0\uc11c virtualenvwrapper.sh \ud30c\uc77c\uc744 \ucc3e\uc744 \uc218 \uc5c6\ub2e4\uba74, \/usr\/bin\uc5d0 \uc788\uc744 \uc218 \uc788\ub2e4. \uc798 \ubaa8\ub974\uaca0\uc73c\uba74 find\ub85c \ucc3e\uc544\ubcf4\uc790.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>find \/usr <span class=\"nt\">-name<\/span> virtualenvwrapper.sh\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>\n    <p>\uc124\uc815\uc774 \uc644\ub8cc\ub418\uc5c8\ub2e4\uba74, terminal\uc744 \ub2e4\uc2dc \ud0a4\uac70\ub098 source ~\/.bashrc\ub85c \uc124\uc815\uc744 \uc7ac\ub85c\ub4dc \ud574\uc900\ub2e4.<\/p>\n  <\/li>\n  <li>\ucee4\ub9e8\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>mkvirtualenv <span class=\"o\">[<\/span>\uac00\uc0c1\ud658\uacbd\uc774\ub984]\n<span class=\"nv\">$ <\/span>rmvirtualenv <span class=\"o\">[<\/span>\uac00\uc0c1\ud658\uacbd\uc774\ub984]\n<span class=\"nv\">$ <\/span>workon <span class=\"o\">[<\/span>\uac00\uc0c1\ud658\uacbd\uc774\ub984]\n<span class=\"nv\">$ <\/span>setvirtualenvproject\n<span class=\"nv\">$ <\/span>cdproject\n<span class=\"nv\">$ <\/span>deactivate\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n<\/ol>\n\n<hr \/>\n<h3 id=\"\uc790\uc8fc\uc4f0\ub294-commands\">\uc790\uc8fc\uc4f0\ub294 commands<\/h3>\n\n<ul>\n  <li>\n    <dl>\n      <dt>mkvirtualenv [\uac00\uc0c1\ud658\uacbd\uc774\ub984]<\/dt>\n      <dd>\uac00\uc0c1\ud658\uacbd\uc774\ub984\uc73c\ub85c \uac00\uc0c1\ud658\uacbd\uc744 \ub9cc\ub4e4\uc5b4\uc900\ub2e4. mkvirtualenv test -p [python-path]\ub85c python \ubc84\uc804\uc744 \uc9c0\uc815\ud574 \uc904 \uc218 \uc788\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt>rmvirtualenv [ \uac00\uc0c1\ud658\uacbd\uc774\ub984]<\/dt>\n      <dd>\ud574\ub2f9 \uac00\uc0c1\ud658\uacbd\uc744 \uc9c0\uc6b4\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt>workon [\uac00\uc0c1\ud658\uacbd\uc774\ub984]<\/dt>\n      <dd>\ud574\ub2f9 \uac00\uc0c1\ud658\uacbd\uc73c\ub85c \uc9c4\uc785\ud55c\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt>servirtualenvproject<\/dt>\n      <dd>\ud504\ub85c\uc81d\ud2b8 \ub514\ub809\ud1a0\ub9ac\ub85c \uc774\ub3d9 \ud6c4, \ud574\ub2f9 \ucee4\ub9e8\ub4dc\ub97c \uce58\uba74 \ub514\ub809\ud1a0\ub9ac\uc640 \uac00\uc0c1\ud658\uacbd\uc774 \ub9f5\ud551\ub41c\ub2e4. \uadf8\ub7ec\uba74 workon\ucee4\ub9e8\ub4dc\ub97c \uce58\ub294\uac83 \ub9cc\uc73c\ub85c \ud574\ub2f9 \ub514\ub809\ud1a0\ub9ac\uc5d0 \uc774\ub3d9\uae4c\uc9c0 \uc2dc\ucf1c\uc900\ub2e4. \uc544\uc8fc\uc88b\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt>cdproject<\/dt>\n      <dd>setvirtualenvproject\ub97c \ud588\uc744 \uacbd\uc6b0, \ud604\uc7ac \uc5b4\ub514\uc5d0 \uc788\ub4e0 \ud574\ub2f9 \ucee4\ub9e8\ub4dc\ub85c \ud504\ub85c\uc81d\ud2b8 \ub514\ub809\ud1a0\ub9ac\uc5d0 \uc774\ub3d9\uc774 \uac00\ub2a5\ud558\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n  <li>\n    <dl>\n      <dt>deactivate<\/dt>\n      <dd>\uac00\uc0c1\ud658\uacbd\uc5d0\uc11c \ube60\uc838\ub098\uc628\ub2e4.<\/dd>\n    <\/dl>\n  <\/li>\n<\/ul>\n\n","pubDate":"Mon, 12 Feb 2018 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/python\/virtualenv\/virtualenvwrapper\/python-virtualenv-wrapper\/","guid":"https:\/\/hidekuma.github.io\/python\/virtualenv\/virtualenvwrapper\/python-virtualenv-wrapper\/","category":["virtualenv","virtualenvWrapper","Python","Virtualenv","VirtualenvWrapper"]},{"title":"Python: pycurl\uc774 \uc124\uce58\uac00 \uc548\ub418\uac70\ub098, import\uc548\ub420 \uacbd\uc6b0 (No module named pycurl)","description":"<p>EC2\uc11c\ubc84\ub97c \uc138\ud305\uc911\uc778\ub370, pycurl\uc774 \uc124\uce58\uac00 \ub418\uc5c8\ub294\ub370\ub3c4 \ubd88\uad6c\ud558\uace0, import\uac00 \uc548\ub41c\ub2e4. \uae38\ub7ec\uc654\ub358 \uad6c\uae00\ub9c1 \uc2e4\ub825\uc73c\ub85c \ucc3e\uc544\ubcf4\ub2c8 \ube44\uc2b7\ud55c \ud604\uc0c1\uc774 \uaf64\ub098 \uc788\uc5c8\uc73c\ub098 \uc560\ub9e4\ud55c \ub2f5\ubcc0\ubfd0\uc774\uc600\ub2e4. \uc77c\ub2e8\uc740 \uae09\ud558\uac8c \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud574\uc57c\ud558\ub2c8 \uc790\uc138\ud558\uac8c \ub73b\uc744 \uc54c\uc544\ubcf4\ub294\uac74 \ub098\uc911\uc73c\ub85c \ubbf8\ub8e8\uace0 \ud574\uacb0\ubc29\ubc95\ub9cc \uacf5\uc720\ud558\uace0\uc790 \ud55c\ub2e4.<\/p>\n\n<ol>\n  <li>\uc124\uce58 \ub41c pycurl\uc744 \uc9c0\uc6b4\ub2e4.<\/li>\n  <li>\ud558\ub2e8 \ucf54\ub4dc\ub85c \ub2e4\uc2dc \uc124\uce58\ud55c\ub2e4. pycurl\uc758 SSL library \ud658\uacbd\uc124\uc815\uc744 \ud574\uc8fc\ub294 \ucee4\ub9e8\ub4dc\ub2e4.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nb\">export <\/span><span class=\"nv\">PYCURL_SSL_LIBRARY<\/span><span class=\"o\">=<\/span>openssl\npip <span class=\"nb\">install <\/span>pycurl <span class=\"nt\">--global-option<\/span><span class=\"o\">=<\/span>build_ext <span class=\"nt\">--global-option<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"-L\/usr\/local\/opt\/openssl\/lib\"<\/span> <span class=\"nt\">--global-option<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"-I\/usr\/local\/opt\/openssl\/include\"<\/span>\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>\uc544\uc9c1\ub3c4 \uc548\ub41c\ub2e4\uba74\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nb\">sudo env <\/span><span class=\"nv\">ARCHFLAGS<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"-arch x86_64\"<\/span> easy_install setuptools <span class=\"nv\">pycurl<\/span><span class=\"o\">==<\/span>7.19.0\n<\/code><\/pre><\/div>    <\/div>\n    <p>\ubc84\uc804\uc740 \ucd5c\uc2e0\uaebc \ud655\uc778\ud574\uc11c \ub123\uc5b4\ubcf4\uba74 \ub41c\ub2e4.<\/p>\n  <\/li>\n  <li>\ubcf4\ud1b5 \uc774\uac78\ub85c \ud574\uacb0\uc774 \ub418\ub354\ub77c. \ub9cc\uc57d ubuntu\uc77c \uacbd\uc6b0.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nb\">sudo <\/span>apt-get <span class=\"nb\">install <\/span>libcurl4-openssl-dev\n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n<\/ol>\n\n<p>\uc548\ub41c\ub2e4\uba74\u2026 \uadf8\ub0e5 requests\ub85c \uac08\uc544\ud0c0\uc790. \uc774 \uc88b\uc740\uac78 \ub0c5\ub450\uace0 \uace0\uc0dd\ud560 \ud544\uc694\uc5c6\ub2e4.<\/p>\n","pubDate":"Tue, 13 Jun 2017 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/python\/pycurl\/pycurl-install-error\/","guid":"https:\/\/hidekuma.github.io\/python\/pycurl\/pycurl-install-error\/","category":["pycurl","Python","Pycurl"]},{"title":"Git: \uacc4\uc815 password\uc5d0 timeout \ubb3c\ub9ac\uae30","description":"<h2 id=\"git\uc5d0\uc11c-\uacc4\uc815-\ube44\ubc00\ubc88\ud638\ub97c-\uc800\uc7a5-\ud639\uc740-\uce90\uc2f1\ud558\uc790\">Git\uc5d0\uc11c \uacc4\uc815 \ube44\ubc00\ubc88\ud638\ub97c \uc800\uc7a5 \ud639\uc740 \uce90\uc2f1\ud558\uc790.<\/h2>\n\n<p>Git \uc0ac\uc6a9\uc790 \uc911\uc5d0\uc11c\ub3c4 \uc758\uc678\ub85c \ubaa8\ub974\ub294 \uc0ac\ub78c\ub4e4\uc774 \uc788\ub294 \uac83\uac19\uc544 \uacf5\uc720\ud558\uace0\uc790\ud55c\ub2e4. \uc6b0\ub9ac\uac00 Git\uc744 \uc0ac\uc6a9\ud558\ub2e4 \ubcf4\uba74 git push\ub098 git pull\ub4f1\uc744 \ud560 \ub54c, \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud574\uc57c\ud558\ub294\ub370 \ud574\ub2f9 \ubd80\ubd84\uc744 \uc5c6\uc560\uac70\ub098 \uc904\uc77c \uc218 \uc788\ub2e4.<\/p>\n\n<ol>\n  <li>Repository URL\uc5d0 \uc9c1\uc811 \uc785\ub825.\n\ubcf4\ud1b5 \ud504\ub85c\uc81d\ud2b8\ub97c git clone\ud558\uac8c \ub418\uba74, \ud504\ub85c\uc81d\ud2b8 \ub0b4\uc5d0 .git\/config\uac00 \uc0dd\uae34\ub2e4. \ud574\ub2f9 config\ub97c \uc218\uc815\ud574\uc8fc\uba74 \ub418\ub294\ub370, \uae43 \ucee4\ub9e8\ub4dc\ub3c4 \uc788\uc9c0\ub9cc \ub098\ub294 vim\uc73c\ub85c \uc9c1\uc811 \uc218\uc815\ud558\ub294 \ud3b8\uc774\ub2e4.\n<!--more-->\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">cat<\/span> .git\/config\n<span class=\"o\">[<\/span>core]\n repositoryformatversion <span class=\"o\">=<\/span> 0\n filemode <span class=\"o\">=<\/span> <span class=\"nb\">true\n <\/span>bare <span class=\"o\">=<\/span> <span class=\"nb\">false\n <\/span>logallrefupdates <span class=\"o\">=<\/span> <span class=\"nb\">true<\/span>\n<span class=\"o\">[<\/span>remote <span class=\"s2\">\"origin\"<\/span><span class=\"o\">]<\/span>\n url <span class=\"o\">=<\/span> https:\/\/github.com\/hidekuma\/hidekuma.github.io.git         \n fetch <span class=\"o\">=<\/span> +refs\/heads\/<span class=\"k\">*<\/span>:refs\/remotes\/origin\/<span class=\"k\">*<\/span>                               \n<span class=\"o\">[<\/span>branch <span class=\"s2\">\"master\"<\/span><span class=\"o\">]<\/span>\n remote <span class=\"o\">=<\/span> origin\n merge <span class=\"o\">=<\/span> refs\/heads\/master\n<\/code><\/pre><\/div>    <\/div>\n    <p>\uc774\ub7f0\uc2dd\uc73c\ub85c config\uac00 \uc124\uc815\ub418\uc5b4 \uc788\uc744\ud150\ub370, \uc5ec\uae30\uc11c [remote \u201corigin\u201d] &gt; url\uc744 \ubcc0\uacbd\ud574\uc8fc\uba74 \ub41c\ub2e4.<\/p>\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"o\">[<\/span>remote <span class=\"s2\">\"origin\"<\/span><span class=\"o\">]<\/span>\n url <span class=\"o\">=<\/span> https:\/\/\uc544\uc774\ub514:\ud328\uc2a4\uc6cc\ub4dc@github.com\/hidekuma\/hidekuma.github.io.git         \n<\/code><\/pre><\/div>    <\/div>\n    <p>\ud5c8\ub098 \ud574\ub2f9 \ubc29\ubc95\uc740 \ub2e4\uc18c \ubcf4\uc548\uc0c1 \uc704\ud5d8\ud558\ub2e4. \ub530\ub77c\uc11c \ub098\uac19\uc740 \uacbd\uc6b0, \uc544\uc774\ub514\ub9cc\uc744 \ub123\uc5b4\uc900\ub2e4.<\/p>\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"o\">[<\/span>remote <span class=\"s2\">\"origin\"<\/span><span class=\"o\">]<\/span>\n url <span class=\"o\">=<\/span> https:\/\/\uc544\uc774\ub514@github.com\/hidekuma\/hidekuma.github.io.git         \n<\/code><\/pre><\/div>    <\/div>\n  <\/li>\n  <li>\uce90\uc2dc\uc124\uc815.\n\uc704\uc5d0 \uc81c\uc2dc\ub41c \ubc29\ubc95\ucc98\ub7fc, remote url\uc5d0 \uc544\uc774\ub514\ub9cc \ub123\uc5b4\uc8fc\uba74, \uae43 \ucee4\ub9e8\ub4dc\ub97c \uc0ac\uc6a9\ud560 \ub54c\ub9c8\ub2e4 \uacc4\uc18d\ud574\uc11c \ube44\ubc00\ubc88\ud638\ub97c \ubb3c\uc5b4\uc62c\uac83\uc774\ub2e4. \uc0dd\uac01\ub9cc \ud574\ub3c4 \ub054\ucc0d\ud55c\ub370, \uc774 \ube48\ub3c4\uc218\ub97c \ud655 \uc904\uc77c\uc218\uac00 \uc788\ub2e4.\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nv\">$ <\/span>git config <span class=\"nt\">--global<\/span> credential.helper cache \n<\/code><\/pre><\/div>    <\/div>\n    <p>\uc774\ub807\uac8c \ud558\uba74 15\ubd84\uac04 \ube44\ubc00\ubc88\ud638\ub97c \uce90\uc2f1\ud574\uc900\ub2e4. \ub514\ud3f4\ud2b8\uac00 900\ucd08\uc778 \uc148\uc778\ub370, \uc544\uc9c1\ub3c4 \uc9e7\ub2e4.<\/p>\n    <div class=\"language-bash highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>git config <span class=\"nt\">--global<\/span> credential.helper <span class=\"s1\">'cache --timeout=432000'<\/span>\n<\/code><\/pre><\/div>    <\/div>\n    <p>\uc774\ub807\uac8c \ud558\uba74 \ud0c0\uc784\uc544\uc6c3 \uc2dc\uac04\uc744 \ucee4\uc2a4\ud140\ud560 \uc218 \uc788\ub2e4. \uc790 \uc774\uc81c 5\uc77c\uac04 \uce90\uc2f1\uc744 \ud574\uc900\ub2e4. \uc0b4\uc558\ub2e4.<\/p>\n  <\/li>\n<\/ol>\n","pubDate":"Wed, 10 May 2017 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/git\/credential\/git-credential-helper-cache-timeout\/","guid":"https:\/\/hidekuma.github.io\/git\/credential\/git-credential-helper-cache-timeout\/","category":["git","credential","helper","cache","Git","Credential"]},{"title":"Python: \ud30c\uc774\uc36c\uc73c\ub85c \ud45c\uc900\ud3b8\ucc28, \ud3c9\uade0, \ubd84\uc0b0 \uad6c\ud558\uae30","description":"<h3 id=\"numpy\ub97c-\uc774\uc6a9\ud574-\uc190\uc27d\uac8c-\uacb0\uacfc\ub97c-\ub3c4\ucd9c\ud560-\uc218-\uc788\ub2e4\">Numpy\ub97c \uc774\uc6a9\ud574 \uc190\uc27d\uac8c \uacb0\uacfc\ub97c \ub3c4\ucd9c\ud560 \uc218 \uc788\ub2e4.<\/h3>\n<p>\ud3c9\uade0<sup id=\"fnref:1\" role=\"doc-noteref\"><a href=\"#fn:1\" class=\"footnote\" rel=\"footnote\">1<\/a><\/sup>, \ubd84\uc0b0<sup id=\"fnref:2\" role=\"doc-noteref\"><a href=\"#fn:2\" class=\"footnote\" rel=\"footnote\">2<\/a><\/sup>, \ud45c\uc900\ud3b8\ucc28<sup id=\"fnref:3\" role=\"doc-noteref\"><a href=\"#fn:3\" class=\"footnote\" rel=\"footnote\">3<\/a><\/sup>\uc758 \ub73b\uc744 \ub2e4\ub4e4 \uc54c\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc774 \uacf3\uc5d0 \ub3c4\ub2ec\ud588\ub2e4\uace0 \uac00\uc815\ud558\uaca0\ub2e4. \ub2e8\uc21c\ud558\uac8c \ub2f5\ub9cc \ubcf4\uace0\uac00\uc790.<\/p>\n\n<h2 id=\"answer\">Answer<\/h2>\n<p>```python\nimport numpy\narr = [1, 2, 3]<\/p>\n\n<p>numpy.mean(arr) # \ud3c9\uade0<\/p>\n<h1 id=\"20\">2.0<\/h1>\n<p>numpy.var(arr) # \ubd84\uc0b0<\/p>\n<h1 id=\"066666666666666663\">0.66666666666666663<\/h1>\n<p>numpy.std(arr) # \ud45c\uc900\ud3b8\ucc28<\/p>\n<h1 id=\"081649658092772603\">0.81649658092772603<\/h1>\n<div class=\"footnotes\" role=\"doc-endnotes\">\n  <ol>\n    <li id=\"fn:1\" role=\"doc-endnote\">\n      <p><a href=\"https:\/\/ko.wikipedia.org\/wiki\/\ud3c9\uade0\">https:\/\/ko.wikipedia.org\/wiki\/\ud3c9\uade0<\/a>\u00a0<a href=\"#fnref:1\" class=\"reversefootnote\" role=\"doc-backlink\">&#8617;<\/a><\/p>\n    <\/li>\n    <li id=\"fn:2\" role=\"doc-endnote\">\n      <p><a href=\"https:\/\/ko.wikipedia.org\/wiki\/\ubd84\uc0b0\">https:\/\/ko.wikipedia.org\/wiki\/\ubd84\uc0b0<\/a>\u00a0<a href=\"#fnref:2\" class=\"reversefootnote\" role=\"doc-backlink\">&#8617;<\/a><\/p>\n    <\/li>\n    <li id=\"fn:3\" role=\"doc-endnote\">\n      <p><a href=\"https:\/\/ko.wikipedia.org\/wiki\/\ud45c\uc900\ud3b8\ucc28\">https:\/\/ko.wikipedia.org\/wiki\/\ud45c\uc900\ud3b8\ucc28<\/a>\u00a0<a href=\"#fnref:3\" class=\"reversefootnote\" role=\"doc-backlink\">&#8617;<\/a><\/p>\n    <\/li>\n  <\/ol>\n<\/div>\n","pubDate":"Fri, 07 Apr 2017 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/python\/numpy\/python-numpy-mean-var-std\/","guid":"https:\/\/hidekuma.github.io\/python\/numpy\/python-numpy-mean-var-std\/","category":["\ubd84\uc0b0","\ud45c\uc900\ud3b8\ucc28","\ud3c9\uade0","Python","Numpy"]},{"title":"JavaScript: Iphone \ub4a4\ub85c\uac00\uae30\uc2dc \ube0c\ub77c\uc6b0\uc800 \uc0c8\ub85c\uace0\uce68 \uc548\ub418\ub294 \uacbd\uc6b0","description":"<h2 id=\"iphone-\ub4a4\ub85c\uac00\uae30\uc2dc-\ube0c\ub77c\uc6b0\uc800-\uc0c8\ub85c\uace0\uce68\uc774--\uc548\ub418\ub294-\ud604\uc0c1-debugging\">Iphone \ub4a4\ub85c\uac00\uae30\uc2dc \ube0c\ub77c\uc6b0\uc800 \uc0c8\ub85c\uace0\uce68\uc774  \uc548\ub418\ub294 \ud604\uc0c1 Debugging<\/h2>\n<p>\ubcf4\ud1b5 \ud06c\ub86c\uae30\ubc18 \ube0c\ub77c\uc6b0\uc800\uc758 history.back()\uc740 \uc774\uc804 \ud398\uc774\uc9c0 \uc815\ubcf4\ub97c refresh \ud55c\ub2e4. \ud558\uc9c0\ub9cc Safari\uc758 \uacbd\uc6b0 \uadf8\ub807\uc9c0 \uc54a\ub2e4.\n\ud398\uc774\uc9c0\uc5d0 \ub300\ud55c context\ub4e4\uc744 Safari\uc5d0\uc11c \uc800\uc7a5\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n\n<p>\ub530\ub77c\uc11c Safari\uc5d0\uc11c \ub4a4\ub85c\uac00\uae30\ub97c \ud074\ub9ad\ud558\uba74, \ub2e4\uc2dc \ud398\uc774\uc9c0\ub97c refresh\ud558\uc9c0 \uc54a\ub294 \uc774\uc0c1 JavaScript\uc758 window.onload, JQuery\uc758 document.ready()\ub294 \uc815\uc0c1\ub3d9\uc791\ud558\uc9c0 \uc54a\ub294\ub2e4\ub294 \uac83\uc774\ub2e4.<\/p>\n\n<p>\ud574\uacb0\uc744 \uc704\ud574\uc120 \ubcc4\ub3c4\ub85c \uc774\ubca4\ud2b8\ub97c \uad6c\ud604\ud574\uc57c\ud558\ub294\ub370 \ub2e4\uc74c\uacfc \uac19\ub2e4.\nwindow \uac1d\uccb4\uc758 onpageshow\ub77c\ub294 \uc774\ubca4\ud2b8\ub97c \uad6c\ud604\ud558\uba74 \uc544\uc774\ud3f0\uc5d0\uc11c \ube0c\ub77c\uc6b0\uc800 \ubc31\ubc84\ud2bc\uc744 \ub20c\ub800\uc744 \ub54c\ub3c4, \uc6d0\ud558\ub294 \uacb0\uacfc\ub97c \uc5bb\uc744 \uc218 \uc788\ub2e4.<\/p>\n<div class=\"language-javascript highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\">\/\/case by JavaScript<\/span>\n<span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nx\">onpageshow<\/span> <span class=\"o\">=<\/span>  <span class=\"kd\">function<\/span><span class=\"p\">(<\/span><span class=\"nx\">event<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/back \uc774\ubca4\ud2b8 \uc77c \uacbd\uc6b0<\/span>\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nx\">event<\/span><span class=\"p\">.<\/span><span class=\"nx\">persisted<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    \t\t<span class=\"c1\">\/\/todo<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<span class=\"c1\">\/\/case by JQuery<\/span>\n<span class=\"nx\">$<\/span><span class=\"p\">(<\/span><span class=\"nb\">window<\/span><span class=\"p\">).<\/span><span class=\"nx\">bind<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">pageshow<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"kd\">function<\/span><span class=\"p\">(<\/span><span class=\"nx\">event<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/back \uc774\ubca4\ud2b8 \uc77c \uacbd\uc6b0<\/span>\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nx\">event<\/span><span class=\"p\">.<\/span><span class=\"nx\">originalEvent<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nx\">event<\/span><span class=\"p\">.<\/span><span class=\"nx\">originalEvent<\/span><span class=\"p\">.<\/span><span class=\"nx\">persisted<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n         <span class=\"c1\">\/\/todo<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">});<\/span>\n<\/code><\/pre><\/div><\/div>\n<p>\uc774\uc640 \uac19\uc774 function\uc744 \uc9dc\uc900\ub2e4\uba74 history.back()\uc2dc\uc5d0\ub3c4 \uc6d0\ud558\ub294 \uacb0\uacfc\ub97c \uc5bb\uc744 \uc218 \uc788\ub2e4.<\/p>\n\n<p class=\"notice--info\">JQuery\uc5d0\uc11c, event.originalEvent \ub97c \uccb4\ud06c\ud558\ub294 \uc774\uc720\ub294 \ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c \ubc1c\uc0dd\uc2dc\ud0a8 event \ub0b4\uc5d0 event.originalEvent \uac00 \uc5c6\uc744 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc874\uc7ac\ud558\ub294\uc9c0 \uccb4\ud06c\uac00 \uba3c\uc800 \uc120\ud589\ub418\uc5b4\uc57c\ud55c\ub2e4. \uadf8\ub9ac\uace0 persisted \ub97c \ud1b5\ud574, \uc774 event\uac00 \ubc31\ubc84\ud2bc\uc5d0 \ub300\ud55c \uc774\ubca4\ud2b8\uc778\uc9c0 \ud655\uc778 \ud560 \uc218 \uc788\ub2e4.<\/p>\n","pubDate":"Fri, 07 Apr 2017 00:00:00 +0000","link":"https:\/\/hidekuma.github.io\/javascript\/jquery\/history\/iphone-history-back\/","guid":"https:\/\/hidekuma.github.io\/javascript\/jquery\/history\/iphone-history-back\/","category":["history","javascript","jquery","JavaScript","JQuery","history"]}]}}