{"id":878,"date":"2013-11-07T00:50:23","date_gmt":"2013-11-06T15:50:23","guid":{"rendered":"http:\/\/43.203.250.216\/?p=878"},"modified":"2020-12-30T17:24:29","modified_gmt":"2020-12-30T08:24:29","slug":"app-engine%ec%97%90%ec%84%9c-google-calendar-event-%ea%b0%80%ec%a0%b8%ec%98%a4%ea%b8%b0","status":"publish","type":"post","link":"https:\/\/litcoder.com\/?p=878","title":{"rendered":"App engine &#8211; \uc9c0\uc815\ud55c \ub2ec\uc758 google calendar event \uac00\uc838\uc624\uae30"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/developers.google.com\/google-apps\/calendar\/v3\/reference\/events\/list\">Google calendar API \uc124\uba85\ubb38\uc11c<\/a>\uc5d0\ub294 event list\ub97c \uac00\uc838\uc624\ub294 \ubc29\ubc95\uc774 \uc124\uba85\uacfc \ud568\uaed8 \uc608\uc81c code\uac00 \uc81c\uc2dc\ub418\uc5b4 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"eclipse\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">page_token = None\nwhile True:\n  events = service.events().list(calendarId='primary', pageToken=page_token).execute()\n  for event in events['items']:\n    print event['summary']\n  page_token = events.get('nextPageToken')\n  if not page_token:\n    break<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\uc774 \ucf54\ub4dc\ub97c \uc218\ud589\ud558\uba74 \ub2ec\ub825\uc774 \uac00\uc9c0\uace0 \uc788\ub294 \ubaa8\ub4e0 event\ub4e4\uc744 \uac00\uc838\uc624\ub294\ub370, \uc774\uac83\uc744 \uc870\uae08 \uc218\uc815\ud574\uc11c \uc9c0\uc815\ub41c \ub2ec\uc5d0 \ud574\ub2f9\ud558\ub294 event \ubaa9\ub85d\uc744 \uac00\uc838\uc624\ub294 \uac83\uc73c\ub85c \ubcc0\uacbd\ud574 \ubcf4\uc790.<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>timeMax \/&nbsp;timeMin<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uac00\uc838\uc62c event\uc758 \ubc94\uc704\ub294 lower bound\ub97c \ub098\ud0c0\ub0b4\ub294 timeMin\uacfc upper bound\ub97c \ub098\ud0c0\ub0b4\ub294 timeMax\uac12\uc73c\ub85c \uc81c\ud55c\ud560 \uc218 \uc788\ub294\ub370 \uc774\ub54c \uc0ac\uc6a9\ub418\ub294 \ub0a0\uc9dc\uc758 \ud615\uc2dd\uc740 <a href=\"http:\/\/www.ietf.org\/rfc\/rfc3339.txt\">RFC3339<\/a>\uc744 \ub530\ub77c\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>calendar.monthrange()&nbsp;<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 method\ub294 \ub144\ub3c4\uc640 \uc6d4\uc744 \ubc1b\uc544\uc11c \uc2dc\uc791\uc77c\uc758 \uc8fc\uc640 \ub9c8\uc9c0\ub9c9 \ub0a0\uc9dc\ub97c tuple\ub85c \ubc18\ud658\ud574 \uc900\ub2e4. \ub2e4\uc74c\uacfc \uac19\uc774 \ud2b9\uc815 \ub2ec\uc758 \ub9c8\uc9c0\ub9c9 \ub0a0\uc9dc\ub97c \uad6c\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">>>> import calendar\n>>> calendar.monthrange(2002, 06)\n(5, 30)\n>>> calendar.monthrange(2002, 06)[1]\n30<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Python\uc5d0\uc11c RFC3339 \ud45c\uc2dc\ud558\uae30<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ud615\uc2dd\uc740 \uac04\ub2e8\ud788 \ub9d0\ud574 \ub0a0\uc9dc\ub97c \ub098\ud0c0\ub0b4\ub294 YYYY-MM-DD \ud615\uc2dd\uacfc \uc2dc\uac04\uc744 \ub098\ud0c0\ub0b4\ub294 hh:mm:ss\uac00 \ub300\ubb38\uc790 &#8216;T&#8217;\ub85c \uc5f0\uacb0\ub418\uba70 \uadf8 \ub4a4\uc5d0\ub294 UTC\ub85c \ubd80\ud130\uc758 time zone offset\uac12\uc774 \ubd99\ub294\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">2002-06-30T20:00:00+09:00<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">datetime.isoformat()\uc744 \uc774\uc6a9\ud558\uba74 \ube44\uc2b7\ud55c \ud615\uc2dd\uc744 \uc5bb\uc744 \uc218\ub294 \uc788\uc73c\ub098, \ub4a4\uc5d0 \ubd99\ub294 time zone offset\uc774 \ud45c\uc2dc\ub418\uc9c0 \uc54a\ub294\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">>>> datetime(2002, 06, 30, 20, 0, 0).isoformat()\n'2002-06-30T20:00:00'<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Python\uc5d0\uc11c time zone\uc744 \ub098\ud0c0\ub0b4\ub294<a href=\"http:\/\/docs.python.org\/2\/library\/datetime.html#datetime.tzinfo\"> tzinfo class\uc758 \uc124\uba85\ubb38<\/a>\uc5d0 \ub530\ub974\uba74 tzinfo\ub294 abstract class\uc5ec\uc11c \uc9c1\uc811 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uace0, \uc774\ub97c \uc0c1\uc18d\ubc1b\ub294 class\ub97c \uad6c\ud604\ud574\uc11c \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4. \ub2e4\uc74c\uc740 \uc774 \ubb38\uc11c\uc5d0 \uc788\ub294 \uc608\uc81c\ub97c \uc870\uae08 \uc218\uc815\ud558\uc5ec time zone offset \uac12\uc744 \ubc18\ud658\ud558\ub294 tzinfo\uc758 concrete class\ub97c \uad6c\ud604\ud55c \uac83\uc774\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"eclipse\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from datetime import tzinfo, timedelta, datetime\n\nZERO = timedelta(0)\nHOUR = timedelta(hours=1)\n\nclass TimeZoneOffset(tzinfo):\n    def __init__(self, hours, name):\n        self.__offset = timedelta(hours = hours)\n        self.__name = name\n\n    def utcoffset(self, dt):\n        return self.__offset\n\n    def tzname(self, dt):\n        return self.__name\n\n    def dst(self, dt):\n        return ZERO<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong style=\"line-height: 1.714285714; font-size: 1rem;\">Code<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">TimeZoneOffset class\ub97c \uc120\uc5b8\ud55c \ud6c4\uc5d0\ub294 datetime()\uc744 \ud638\ucd9c\ud560\ub54c tzinfo\uc5d0 TimeZoneOffset\uc758 instance\ub97c \ub118\uaca8\uc11c time zone offset \uc815\ubcf4\ub97c \ud3ec\ud568\ud558\ub294 RFC3339 \ub0a0\uc9dc \ud615\uc2dd\uc744 \uc5bb\uc744 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"eclipse\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># What's the last date of the Jun, 2002?\nlastDate = calendar.monthrange(2002, 6)[1]\n\n# Lower bound RFC3339 format '2002-06-01T00:00:00+09:00'\nlbound = datetime(2002, 6, 1, tzinfo=TimeZoneOffset(9, \"KST\")).isoformat()\n\n# Lower bound RFC3339 format '2002-06-01T23:59:59+09:00'\nubound = datetime(2002, 6, lastDate, 23, 59, 59, tzinfo=TimeZoneOffset(9, \"KST\")).isoformat()\n\npage_token = None\nwhile True:\n  # Fetch events within given lower\/upper bounds.\n  events = service.events().list(calendarId='primary', minTime=lbound, maxTime=ubound, pageToken=page_token).execute()\n  for event in events['items']:\n    print event['summary']\n  page_token = events.get('nextPageToken')\n  if not page_token:\n    break<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Google calendar API \uc124\uba85\ubb38\uc11c\uc5d0\ub294 event list\ub97c \uac00\uc838\uc624\ub294 \ubc29\ubc95\uc774 \uc124\uba85\uacfc \ud568\uaed8 \uc608\uc81c code\uac00 \uc81c\uc2dc\ub418\uc5b4 \uc788\ub2e4. \uc774 \ucf54\ub4dc\ub97c \uc218\ud589\ud558\uba74 \ub2ec\ub825\uc774 \uac00\uc9c0\uace0 \uc788\ub294 \ubaa8\ub4e0 event\ub4e4\uc744 \uac00\uc838\uc624\ub294\ub370, \uc774\uac83\uc744 \uc870\uae08 \uc218\uc815\ud574\uc11c \uc9c0\uc815\ub41c \ub2ec\uc5d0 \ud574\ub2f9\ud558\ub294 event \ubaa9\ub85d\uc744 \uac00\uc838\uc624\ub294 \uac83\uc73c\ub85c \ubcc0\uacbd\ud574 \ubcf4\uc790. timeMax \/&nbsp;timeMin \uac00\uc838\uc62c event\uc758 \ubc94\uc704\ub294 lower bound\ub97c \ub098\ud0c0\ub0b4\ub294 timeMin\uacfc upper bound\ub97c \ub098\ud0c0\ub0b4\ub294 timeMax\uac12\uc73c\ub85c \uc81c\ud55c\ud560 \uc218 \uc788\ub294\ub370 \uc774\ub54c \uc0ac\uc6a9\ub418\ub294 \ub0a0\uc9dc\uc758 \ud615\uc2dd\uc740 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[5],"tags":[16,25,105],"class_list":["post-878","post","type-post","status-publish","format-standard","hentry","category-programming","tag-appengine","tag-calendar-api","tag-python"],"jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":3322,"url":"https:\/\/litcoder.com\/?p=3322","url_meta":{"origin":878,"position":0},"title":"GitHub release\uc5d0 \ubc14\uc774\ub108\ub9ac \ucca8\ubd80 \uc790\ub3d9\ud654","author":"litcoder","date":"2024\ub144 1\uc6d4 1\uc77c","format":false,"excerpt":"GitHub\uc5d0\uc11c release\ub97c \uc0dd\uc131\ud558\uba74 source code\uc758 snapshot\uc774 zip\uacfc tar.gz\ub85c \uc800\uc7a5\ub41c\ub2e4. \uc5ec\uae30\uc5d0 \ucd94\uac00\ud574\uc11c \ucef4\ud30c\uc77c\ub41c \uacb0\uacfc\uac00 \uc790\ub3d9\uc73c\ub85c \ucd94\uac00\ud558\ub3c4\ub85d \ud55c\ub2e4\uba74, \uac04\ub2e8\ud788 source code\uc640 \uc5f0\uacc4\ub41c \ubc14\uc774\ub108\ub9ac\ub3c4 \ud568\uaed8 \ubc30\ud3ec\ud560 \uc218 \uc788\uc744 \uac83\uc774\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 \uc548\ub4dc\ub85c\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \uac00\uc815\ud574\uc11c release\ub97c \uc0dd\uc131\ud560 \ub54c \uc548\ub4dc\ub85c\uc774\ub4dc APK\ub97c \ube4c\ub4dc\ud558\uace0 source code\uc640 \ud568\uaed8 \ubc30\ud3ec\ud558\ub294 \uac04\ub2e8\ud55c workflow\ub97c \uc124\uba85\ud55c\ub2e4. \uc804\uccb4 \ucf54\ub4dc Event trigger on: release:\u2026","rel":"","context":"&quot;Android&quot;\uc5d0\uc11c","block_context":{"text":"Android","link":"https:\/\/litcoder.com\/?cat=2"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_release_attached-e1704114929383.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_release_attached-e1704114929383.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_release_attached-e1704114929383.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_release_attached-e1704114929383.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":3509,"url":"https:\/\/litcoder.com\/?p=3509","url_meta":{"origin":878,"position":1},"title":"gRPC\ub97c \uc774\uc6a9\ud55c Observer Pattern","author":"litcoder","date":"2024\ub144 10\uc6d4 14\uc77c","format":false,"excerpt":"Remote\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uae30\ub2a5\uc744 \ub9c8\uce58 local system\uc758 function call \ucc98\ub7fc \uc81c\uacf5 \ud55c\ub2e4\ub294 gRPC\uc758 \uac1c\ub150 \uc790\uccb4\ub294 1990\ub144\ub300\uc5d0\ub3c4 \uc788\uc5c8\ub358 \uac83\uc774\uae30\uc5d0 \uc0c8\ub85c\uc6b8 \uac83\uc740 \uc5c6\uc9c0\ub9cc, \uadf8 \uc704\uc5d0\uc11c \"Subject\uc758 \ubcc0\uacbd\uc774 \uc788\uc744 \ub54c subscriber\uc5d0\uac8c notify \ud574\uc8fc\ub294 Observer Pattern\uc744 \uc5b4\ub5bb\uac8c \uad6c\ud604 \ud560 \uc218 \uc788\uc744\uae4c?\"\ud558\ub294 \uc758\ubb38\uc774 \ub4e4\uc5c8\ub2e4. \uc774 \ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294 gRPC\ub97c \uc774\uc6a9\ud55c observer pattern\uc758 \uc608\uc81c\ub85c server\uc5d0\uc11c \uc784\uc758\uc758 \uc8fc\uc2dd\uacfc \uadf8 \ubcc0\ub3d9\u2026","rel":"","context":"&quot;Programming&quot;\uc5d0\uc11c","block_context":{"text":"Programming","link":"https:\/\/litcoder.com\/?cat=5"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2024\/10\/grpc_observer.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2024\/10\/grpc_observer.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2024\/10\/grpc_observer.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2024\/10\/grpc_observer.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":4299,"url":"https:\/\/litcoder.com\/?p=4299","url_meta":{"origin":878,"position":2},"title":"OpenProject\uc640 GitHub \uc5f0\ub3d9","author":"litcoder","date":"2026\ub144 4\uc6d4 15\uc77c","format":false,"excerpt":"\uc5f0\ub3d9\uc744 \uc704\ud55c \uc124\uc815 #1 \uba3c\uc800 OpenProject\uc5d0\uc11c \uc5f0\ub3d9\uae30\ub2a5\uc744 \uc804\ub2f4\ud560 \uacc4\uc815\uc744 \ud558\ub098 \uc0dd\uc131(GitHub Bot)\ud574\uc900\ub2e4. \uadf8\ub9ac\uace0 \uc0c8\ub85c\uc6b4 role(Github integration)\uc744 \ud558\ub098 \ub9cc\ub4e4\uace0 View work packages\uc640 Add comments \uad8c\ud55c\uc744 \uc900\ub2e4. #2 GitHub\uc640 \uc5f0\ub3d9\ud558\uace0\uc790 \ud558\ub294 \ud504\ub85c\uc81d\ud2b8\uc5d0 \uc0dd\uc131\ud55c \uc804\ub2f4\uacc4\uc815(GitHub Bot)\uc744 \ucd94\uac00\ud558\uace0 \uc5ed\ud560\ub85c GitHub integration\uc744 \ubd80\uc5ec\ud55c\ub2e4. #3 OpenProject\uc5d0 GitHub \uc804\ub2f4 \uacc4\uc815(GitHub Bot)\uc73c\ub85c \ub85c\uadf8\uc778\ud574\uc11c Account settings -> Access tokens\u2026","rel":"","context":"&quot;Tools &amp; Tips&quot;\uc5d0\uc11c","block_context":{"text":"Tools &amp; Tips","link":"https:\/\/litcoder.com\/?cat=6"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/04\/add_githubbot_member.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/04\/add_githubbot_member.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/04\/add_githubbot_member.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":864,"url":"https:\/\/litcoder.com\/?p=864","url_meta":{"origin":878,"position":3},"title":"Jinja2\uc758 UnicodeDecodeError","author":"litcoder","date":"2013\ub144 11\uc6d4 4\uc77c","format":false,"excerpt":"App engine\uc744 \uc774\uc6a9\ud558\ub294 project \uc911\uc5d0 Jinja2 template \ubd80\ubd84\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc774 UnicodeDecodeError\uac00 \ubc1c\uc0dd\ud558\ub294 \ubb38\uc81c\uac00 \uc0dd\uacbc\ub2e4. Traceback (most recent call last): File \"<<APP_ENGINE>>\/lib\/webapp2-2.5.2\/webapp2.py\", line 1535, in __call__ rv = self.handle_exception(request, response, e) File \"<<APP_ENGINE>>\/lib\/webapp2-2.5.2\/webapp2.py\", line 1529, in __call__ rv = self.router.dispatch(request, response) File \"<<APP_ENGINE>>\/lib\/webapp2-2.5.2\/webapp2.py\", line 1278, in default_dispatcher return route.handler_adapter(request, response)J File\u2026","rel":"","context":"&quot;Programming&quot;\uc5d0\uc11c","block_context":{"text":"Programming","link":"https:\/\/litcoder.com\/?cat=5"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2484,"url":"https:\/\/litcoder.com\/?p=2484","url_meta":{"origin":878,"position":4},"title":"\ud55c\uae00 \ud14d\uc2a4\ud2b8 \ucd94\ucd9c\uc744 \uc704\ud55c Python PDF module","author":"litcoder","date":"2020\ub144 3\uc6d4 6\uc77c","format":false,"excerpt":"\uc774 \ub0b4\uc6a9\uc740 2020\ub144 3\uc6d4\uc5d0 \uc791\uc131\ub41c \uac83\uc73c\ub85c \ucc38\uc870\ud558\ub294 \uc2dc\uc810\uc5d0 \ub530\ub77c \ubcc0\uacbd\ub41c \uc0ac\ud56d\ub4e4\uc774 \uc788\uc744 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. PyPDF2 PyPDF2\ub294 PDF file\uc758 metadata \uc815\ubcf4\ub97c \uac00\uc838\uc624\uac70\ub098 \ud398\uc774\uc9c0 \ub2e8\uc704\ub85c \ub098\ub204\uac70\ub098 \ud569\uce58\ub294 \ub4f1\uc758 \uc5ec\ub7ec\uac00\uc9c0 \ud3b8\ub9ac\ud55c \uae30\ub2a5\ub4e4\uc744 \uc81c\uacf5\ud55c\ub2e4. \ud558\uc9c0\ub9cc \ud55c\uae00\uc744 \uc81c\ub300\ub85c \ucd94\ucd9c\ud558\uc9c0 \ubabb\ud558\ub294 \ubb38\uc81c\uac00 \uc788\uc5b4\uc11c(\ud55c\uae00 \ubfd0 \uc544\ub2c8\ub77c CJK \ubaa8\ub450 \ub77c\uace0 \ud568) \ubaa9\uc801\uc5d0\ub294 \uc801\ud569\ud558\uc9c0 \uc54a\uc558\ub2e4. PDFMiner \ud55c\uae00 \ucc98\ub9ac\ub294 \ubb38\uc81c\u2026","rel":"","context":"&quot;Programming&quot;\uc5d0\uc11c","block_context":{"text":"Programming","link":"https:\/\/litcoder.com\/?cat=5"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":4520,"url":"https:\/\/litcoder.com\/?p=4520","url_meta":{"origin":878,"position":5},"title":"Rust \ud504\ub85c\uadf8\ub798\ubc0d, \ucf54\ub4dc \uac00\ub3c5\uc131\uc744 \ub192\uc774\uae30 \uc704\ud55c and_then() \ud65c\uc6a9","author":"litcoder","date":"2026\ub144 6\uc6d4 24\uc77c","format":false,"excerpt":"Rust\ub294 \uc120\uc5b8\uc801 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \uc801\uadf9\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\uae30\uc5d0 method chaining\uc744 \ub9ce\uc774 \uc0ac\uc6a9\ud558\ub294\ub370 \uc774\ub294 \uac00\ub3c5\uc131\uc744 \ub192\uc774\uace0 \ucef4\ud30c\uc77c\ub7ec\uac00 \ucd5c\uc801\ud654\ub97c \uc218\ud589\ud558\ub294\ub370 \uc801\ud569\ud55c \ud615\ud0dc\uc774\uae30 \ub54c\ubb38\uc774\ub2e4. \uc774 \ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294 method chaining\uc744 \uc720\uc9c0\ud558\uba74\uc11c\ub3c4 \uc911\ucca9\ub41c Result \ud639\uc740 Option \ud615\uc2dd\uc744 \ud53c\ud560 \uc218 \uc788\ub294 and_then()\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf8\ub2e4. match \ubb38\uc744 \uc774\uc6a9\ud55c \ucc98\ub9ac \uc138\uac1c\uc758 \ud568\uc218 \uac01\uac01\uc774 \ub2e4\uc74c\uacfc \uac19\uc774 Result\ub97c \ubc18\ud658\ud55c\ub2e4\uace0 \ud574\ubcf4\uc790. use std::io::{Error, ErrorKind}; \/\/\/\u2026","rel":"","context":"&quot;Programming&quot;\uc5d0\uc11c","block_context":{"text":"Programming","link":"https:\/\/litcoder.com\/?cat=5"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts\/878","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=878"}],"version-history":[{"count":1,"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts\/878\/revisions"}],"predecessor-version":[{"id":2759,"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts\/878\/revisions\/2759"}],"wp:attachment":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=878"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=878"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=878"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}