{"id":3322,"date":"2024-01-01T22:44:44","date_gmt":"2024-01-01T13:44:44","guid":{"rendered":"http:\/\/43.203.250.216\/?p=3322"},"modified":"2025-10-01T16:25:51","modified_gmt":"2025-10-01T07:25:51","slug":"github-release%ec%97%90-%eb%b0%94%ec%9d%b4%eb%84%88%eb%a6%ac-%ec%b2%a8%eb%b6%80-%ec%9e%90%eb%8f%99%ed%99%94","status":"publish","type":"post","link":"https:\/\/litcoder.com\/?p=3322","title":{"rendered":"GitHub release\uc5d0 \ubc14\uc774\ub108\ub9ac \ucca8\ubd80 \uc790\ub3d9\ud654"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\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.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\uc804\uccb4 \ucf54\ub4dc <\/h2>\n\n\n\n<script src=\"https:\/\/gist.github.com\/litcoder\/4c18ab4fc2b0134defae109199479bb7.js\">\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading\">Event trigger<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">on:\n  release:\n    types: [published]<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Release\uc5d0\uc11c\ub9cc \ub3d9\uc791\ud558\ubbc0\ub85c event trigger\ub294 release &#8211; published\uc774\ub2e4. \uc774 event\ub294 web\uc0c1\uc5d0\uc11c \uc0c8\ub85c\uc6b4 release package\ub97c publish \ud560\ub54c trigger \ub41c\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud658\uacbd\ubcc0\uc218<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">env:\n  TAG: ${{ github.ref_name }}\n  ASSET_FILE_PATH: \".\/prebuilt-${{ github.ref_name }}.zip\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Release package\ub97c \uc0dd\uc131\ud560 \ub54c \ub123\ub294 version\uc758 \uc774\ub984\uc740 <strong>github.ref_name<\/strong>\uc73c\ub85c \ucc38\uc870 \ub41c\ub2e4. \ucca8\ubd80\ub418\ub294 \ud30c\uc77c\uc758 \uc774\ub984\uc740 prebuilt-&lt;version_tag>.zip\uc73c\ub85c \uc124\uc815\ud55c\ub2e4. \ucc38\uace0\ub85c GitHub\uc5d0\uc11c\ub294 release\uc5d0 \ucd94\uac00\ub418\ub294 \uc18c\uc2a4\ucf54\ub4dc\uc678\uc758 \ud30c\uc77c\ub4e4\uc744 &#8220;Asset&#8221;\uc774\ub77c \ubd80\ub978\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ube4c\ub4dc \uc218\ud589 \ubc0f Asset \uc0dd\uc131<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    # Checkout source code and build Android APKs.\n    - name: Checkout\n      uses: actions\/checkout@v3\n    - name: Setup JDK 17\n      uses: actions\/setup-java@v3\n      with:\n        java-version: '17'\n        distribution: 'temurin'\n        cache: gradle\n    - name: Build Android APK and zip\n      run: |\n        sh .\/gradlew assemble\n        zip ${{ env.ASSET_FILE_PATH }} \\\n          .\/app\/build\/outputs\/apk\/debug\/app-debug.apk \\\n          .\/app\/build\/outputs\/apk\/release\/app-release*.apk<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Android build\ub97c \uc704\ud55c JAVA\ub97c \uc124\uc815\ud558\uace0 Gradle\uc758 <strong>assemble<\/strong> target\uc744 \uc124\uc815\ud558\uc5ec APK file\uc5d0 \ub300\ud55c \ube4c\ub4dc\ub97c \uc218\ud589\ud55c\ub2e4. Assemble\uc740 debug\uc640 release\uc6a9 \ub450\uac1c\uc758 apk\ub97c \uc131\uc131\ud558\ubbc0\ub85c \uc774\ub4e4\uc744 \ud558\ub098\uc758 zip\ud30c\uc77c\ub85c \ub9cc\ub4e4\uc5b4\uc11c <strong>prebuilt-&lt;version_tag&gt;.zip<\/strong>\uc5d0 \ucd94\uac00\ud55c\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Release\uc5d0 Asset  \ucd94\uac00<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Release\uc5d0 asset\uc744 \ucd94\uac00\ud574\uc8fc\ub294 GitHub action\uc740 \ubcf4\uc774\uc9c8 \uc54a\ub294\ub2e4. \uadf8\ub798\uc11c GitHub script\ub97c \uc774\uc6a9\ud574\uc11c release\uc5d0 asset\uc744 \ucd94\uac00\ud558\ub294 \ub3d9\uc791\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uc815\uc758\ud588\ub2e4. \uc774\ub294 \ub450 \uac1c\uc758 \ub3d9\uc791\uc73c\ub85c \uc774\ub8e8\uc5b4\uc9c0\ub294\ub370 \ud558\ub098\ub294 \uc8fc\uc5b4\uc9c4 tag\ub85c release \uc815\ubcf4\ub97c \ucc3e\uc544\uc624\ub294 \uac83\uc774\uace0, \ub2e4\ub978 \ud558\ub098\ub294 \uac00\uc838\uc628 release \uc815\ubcf4\uc5d0 \ud30c\uc77c\uc744 \uc5c5\ub85c\ub4dc\ud558\ub294 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ub3d9\uc791 1. Tag\ub85c release \uac00\uc838\uc624\uae30<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub script project\uc758 <a href=\"https:\/\/github.com\/actions\/github-script\/blob\/main\/README.md\" data-type=\"link\" data-id=\"https:\/\/github.com\/actions\/github-script\/blob\/main\/README.md\">README.md<\/a>\uc5d0 \ub530\ub974\uba74 GitHub script\uc0c1\uc5d0\uc11c <strong>github<\/strong>\uac1d\uccb4\ub294 \uc0ac\uc804\uc778\uc99d\ub41c(pre-authenticated) Octokit client\ub77c\uace0 \ud55c\ub2e4. \ub530\ub77c\uc11c \uc0c8\ub86d\uac8c instance\ub97c \ub9cc\ub4e4\uc9c0 \uc54a\uace0 \ubc14\ub85c Octokit\uc758 API\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. <a href=\"https:\/\/octokit.github.io\/rest.js\/v20\" data-type=\"link\" data-id=\"https:\/\/octokit.github.io\/rest.js\/v20\">getReleaseByTag()<\/a>\uc5d0 tag\ub97c \ub118\uaca8\uc8fc\uba74 \ud1b5\ud574 release\uc5d0 \ub300\ud55c \uac1d\uccb4\uac00 \ubc18\ud658\ub41c\ub2e4. \uadf8 \uc911\uc5d0 release\ub97c \uad6c\ubd84\ud558\uae30 \uc704\ud55c ID\ub9cc \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    \/\/ Get a release for given tag.\n    const release = await github.rest.repos.getReleaseByTag({\n       owner: context.repo.owner,\n       repo: context.repo.repo,\n       tag: process.env.TAG\n    });\n    const release_id = release.data.id;\n    console.log(\"Release id for the tag \" + process.env.TAG + \": \" + release_id);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ub3d9\uc791 2. Release\uc5d0 \ud30c\uc77c \uc5c5\ub85c\ub4dc \ud558\uae30<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc55e\uc758 \uacfc\uc815\uc5d0\uc11c \ub9cc\ub4e0 \uc5c5\ub85c\ub4dc\ud560 zip\ud30c\uc77c\uacfc release\ub97c \uad6c\ubd84\ud560 ID \uc815\ubcf4\ub97c <a href=\"https:\/\/octokit.github.io\/rest.js\/v20\" data-type=\"link\" data-id=\"https:\/\/octokit.github.io\/rest.js\/v20\">uploadReleaseAsset()<\/a>\uc5d0 \ub118\uaca8 \uc8fc\uba74 \ud574\ub2f9 \ud30c\uc77c\uc774 asset\uc73c\ub85c \ub4f1\ub85d\ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    \/\/ Upload release assets.\n    const fs = require(\"fs\");\n    const filename = process.env.ASSET_FILE_PATH.replace(\/^.*[\\\\\/]\/, \"\");\n    var uploaded = await github.rest.repos.uploadReleaseAsset({\n       owner: context.repo.owner,\n       repo: context.repo.repo,\n       release_id: release_id,\n       name: filename,\n       data: await fs.readFileSync(process.env.ASSET_FILE_PATH),\n    });\n    console.log(\n       process.env.ASSET_FILE_PATH\n       + \" has been uploaded as \" + filename\n       + \" to the release \" + process.env.TAG);<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc8fc\uc758:<\/strong> upload \ub3d9\uc791\uc740 release\ub97c \uc218\uc815\ud558\ub294 \uac83\uc774\ubbc0\ub85c workflow\uac00 repository\uc5d0 \ub300\ud55c write permission\uc774 \uc788\uc5b4\uc57c \ud558\ubbc0\ub85c settings \ud56d\ubaa9\uc5d0\uc11c \uc5d0\uc11c write permission\uc774 \ud5c8\uac00\ub418\uc5b4 \uc788\ub294\uc9c0 \ud655\uc778\ud55c\ub2e4. \uc774 \ubd80\ubd84\uc774 \uc548\ub418\uc5b4 \uc788\ub2e4\uba74 403 error\uac00 \ub0a0 \uac83\uc774\ub2e4.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"620\" height=\"332\" src=\"https:\/\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_write_perm.png\" alt=\"\" class=\"wp-image-3368\" srcset=\"https:\/\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_write_perm.png 620w, https:\/\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_write_perm-300x161.png 300w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Release workflow \uc2e4\ud589<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub repo\uc758 Code \ud0ed\uc5d0\uc11c Tags -> Releases -> Tag -> Draft a new release\ub97c \uc120\ud0dd\ud55c \ud6c4 Choose a tag\ub97c \ub20c\ub7ec\uc11c \ub098\uc624\ub294 \uc785\ub825\ucc3d\uc5d0 \uc0c8\ub85c \uc0dd\uc131\ud560 version tag\ub97c \uc785\ub825\ud574 Create new tag\ub97c \uc120\ud0dd\ud55c \ub2e4\uc74c Publish release \ubc84\ud2bc\uc744 \ub204\ub978\ub2e4.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"395\" height=\"287\" src=\"https:\/\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_create_tag.png\" alt=\"\" class=\"wp-image-3369\" style=\"width:319px;height:auto\" srcset=\"https:\/\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_create_tag.png 395w, https:\/\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_create_tag-300x218.png 300w\" sizes=\"auto, (max-width: 395px) 100vw, 395px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ub54c \ub9cc\ub4e4\uc5b4\uc9c0\ub294 release\uc5d0\ub294 \uc18c\uc2a4\ucf54\ub4dc\ub9cc \ub4e4\uc5b4 \uc788\uc9c0\ub9cc, \uc815\uc0c1\uc801\uc73c\ub85c \ub3d9\uc791\ud588\ub2e4\uba74 Actions tab\uc5d0 release workflow\uac00 \ub4f1\ub85d\ub418\uc5b4 \uc218\ud589\ub418\ub294 \uac83\uc774 \ubcf4\uc77c \uac83\uc774\ub2e4. Workflow\uac00 \uc815\uc0c1 \uc885\ub8cc\ub41c \ud6c4 \ud574\ub2f9 release\ub85c \ub2e4\uc2dc \uac00\ubcf4\uba74 asset\uc774 \ub4f1\ub85d\ub418\uc5b4 \uc788\ub294 \uac83\uc744 \ubcfc \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"911\" height=\"323\" src=\"https:\/\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_release_attached-e1704114929383.png\" alt=\"\" class=\"wp-image-3370\" srcset=\"https:\/\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_release_attached-e1704114929383.png 911w, https:\/\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_release_attached-e1704114929383-300x106.png 300w, https:\/\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_release_attached-e1704114929383-768x272.png 768w, https:\/\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_release_attached-e1704114929383-624x221.png 624w\" sizes=\"auto, (max-width: 911px) 100vw, 911px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>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 Release\uc5d0\uc11c\ub9cc \ub3d9\uc791\ud558\ubbc0\ub85c event trigger\ub294 release &#8211; published\uc774\ub2e4. [&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":[2,4],"tags":[11,54,321,320,319],"class_list":["post-3322","post","type-post","status-publish","format-standard","hentry","category-android","category-linux","tag-android","tag-github","tag-ocktokit","tag-release","tag-workflow"],"jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":2549,"url":"https:\/\/litcoder.com\/?p=2549","url_meta":{"origin":3322,"position":0},"title":"OpenGrok \ucd5c\uc2e0\ubc84\uc804 \uc124\uce58\ud558\uae30","author":"litcoder","date":"2020\ub144 8\uc6d4 5\uc77c","format":false,"excerpt":"\ud55c \ub54c \uac11\uc790\uae30 \ubc30\ud3ec\ud558\ub358 \uc11c\ubc84\uac00 \uc5c6\uc5b4\uc838\uc11c \ud639\uc2dc\ub098 \ud558\ub294 \uac71\uc815\uc5d0 \ubc30\ud3ec\ud30c\uc77c\uc744 \ub2e4\uc6b4\ub85c\ub4dc \ubc1b\uc544 \ub450\uae30\uae4c\uc9c0 \ud588\ub358 OpenGrok project\uac00 \ub2e4\ud589\ud788 Oracle\uc758 GitHub \ub0b4\uc5d0 \uc790\ub9ac\ub97c \uc7a1\uace0 \uc798 \uafb8\uc900\ud788 \uc5c5\ub370\uc774\ud2b8 \ub418\uace0 \uc788\ub2e4.\uc608\uc804\uc5d0 \uc791\uc131\ud588\ub358 OpenGrok \uc124\uce58\ub97c \uc704\ud55c \uae00\ub4e4\uc740 \ub108\ubb34 \uc624\ub798\ub418\uc5b4\uc11c \uc798 \ub9de\uc9c0 \uc54a\ub294 \uac83\ub3c4 \uc788\uace0 \ud574\uc11c \ucd5c\uadfc \ubc84\uc804\uacfc \ud658\uacbd\uc744 \uae30\uc900\uc73c\ub85c \ub2e4\uc2dc \uc124\uce58 \uacfc\uc815\uc744 \uc815\ub9ac\ud588\ub2e4. \uc774 \ud3ec\uc2a4\ud305\uc740\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\/2020\/08\/img_0003-1.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2020\/08\/img_0003-1.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2020\/08\/img_0003-1.jpg?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":4332,"url":"https:\/\/litcoder.com\/?p=4332","url_meta":{"origin":3322,"position":1},"title":"Release Please &#8211; Change log \uc0dd\uc131 \uc790\ub3d9\ud654","author":"litcoder","date":"2026\ub144 5\uc6d4 6\uc77c","format":false,"excerpt":"\ud300\uc5d0\uc11c Conventional commit\uc744 \ub530\ub974\uace0 \uc788\ub2e4\uba74, \uc774\uac83\uc744 \ud65c\uc6a9\ud574\uc11c change log\ub97c \ub9cc\ub4dc\ub294 \uac83\uacfc \uac19\uc740 \uadc0\ucc2e\uc740 \uc77c\ub4e4\uc744 \uc790\ub3d9\uc73c\ub85c \uc218\ud589\ud574 \uc8fc\ub294 \ub3c4\uad6c\ub4e4\uc774 \ub9ce\uc774 \uc788\ub2e4. \uc774 \ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294 \uadf8 \uc911\uc5d0\uc11c\ub3c4 GitHub\uc5d0\uc11c \uc0ac\uc6a9\ud558\uae30\uc5d0 \ud3b8\ud558\ub2e4\ub294 release-please\ub97c Rust project\uc5d0 \uc801\uc6a9\ud574 \ubcf8 \ub0b4\uc6a9\uc744 \ub2e4\ub8ec\ub2e4. \uc0ac\uc804 \uc900\ube44 GitHub PAT(Personal Access Token) GitHub -> Settings -> Developer settings -> Personal 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\/release-please-pr-created.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/04\/release-please-pr-created.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/04\/release-please-pr-created.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/04\/release-please-pr-created.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/04\/release-please-pr-created.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/04\/release-please-pr-created.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":1337,"url":"https:\/\/litcoder.com\/?p=1337","url_meta":{"origin":3322,"position":2},"title":"MinnowboardMAX\uc5d0 Android \uc62c\ub824 \ubcf8 \ub0b4\uc6a9 \uc815\ub9ac","author":"litcoder","date":"2015\ub144 9\uc6d4 19\uc77c","format":false,"excerpt":"Android \/ Chromium OS \/ Windows\ub97c \uc62c\ub824 \ubcfc \uc218 \uc788\ub294 Intel Baytrail \uae30\ubc18\uc758 \uac1c\ubc1c\ubcf4\ub4dc\uc778 MinnowboardMAX\uc5d0 Android 5.1\uc744 install\ud558\ub294 \uacfc\uc815\uc744 \uc124\uba85\ud55c\ub2e4. \ud544\uc694\ud55c \uac83 \ub4e4 Minnowboard MAX - \ud310\ub9e4\ud558\ub294 \uacf3, 2015\ub144 9\uc6d4 \ud604\uc7ac \uad6d\ub0b4\uc5d0\uc11c \ud310\ub9e4\ud558\ub294 \uacf3\uc740 \uc5c6\ub294\uac83 \uac19\ub2e4. FTDI cable - Serial \ucd9c\ub825\uc744 PC\uc5d0\uc11c \ubc1b\uae30 \uc704\ud574 guide \ubb38\uc11c\uc5d0\ub294 TTL-232R\uc744 \uc0ac\uc6a9\ud558\ub77c\uace0 \u00a0\ub098\uc640 \uc788\ub294\ub370\u2026","rel":"","context":"&quot;Android&quot;\uc5d0\uc11c","block_context":{"text":"Android","link":"https:\/\/litcoder.com\/?cat=2"},"img":{"alt_text":"minnowboardMAX_connection","src":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2015\/09\/minnowboardMAX_connection.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":4654,"url":"https:\/\/litcoder.com\/?p=4654","url_meta":{"origin":3322,"position":3},"title":"PyO3\ub85c Rust code\uc5d0\uc11c Python module \uc0ac\uc6a9\ud558\uae30","author":"litcoder","date":"2026\ub144 8\uc6d4 19\uc77c","format":false,"excerpt":"PyO3\ub97c \uc774\uc6a9\ud558\uba74 Rust\uc5d0\uc11c Python\uc744 \ud638\ucd9c\ud558\uac70\ub098 \ubc18\ub300\ub85c Python\uc5d0\uc11c Rust\ub97c \ud638\ucd9c\ud558\ub294 \ubc14\uc778\ub529\uc744 \uad6c\ud604\ud560 \uc218 \uc788\ub2e4. \uc774 \ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294 \uc608\uc804\uc5d0 \ud574\ubd24\ub358 Datumaro\ub85c \ub370\uc774\ud130\uc14b\uc744 detect\ud558\ub294 Python\ud568\uc218\ub97c Rust\ub85c \ud638\ucd9c\ud558\ub294 \uc608\uc81c\ub97c \uad6c\ud604\ud574 \ubcf8\ub2e4. Python \uc758\uc874\uc124 \uc124\uce58 Python \uad00\ub828\ud55c \uc758\uc874\uc131\uc740 \uc608\uc804\uacfc \uac19\uc774 Datumaro\ub97c \uc0ac\uc6a9\ud558\ub294\ub370 \ud544\uc694\ud55c \uac83\ub4e4\uc744 \uc124\uce58\ud574 \uc900\ub2e4. pip install 'datumaro[tf,tfds]' \\ tensorboardX \\ tensorflow-dataset \\ importlib_resources \\\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\/2026\/07\/sc_dsdetect_rust.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/07\/sc_dsdetect_rust.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/07\/sc_dsdetect_rust.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2026\/07\/sc_dsdetect_rust.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":3716,"url":"https:\/\/litcoder.com\/?p=3716","url_meta":{"origin":3322,"position":4},"title":"OpenVINO\ub85c Intel NPU\uc5d0\uc11c \ucd94\ub860 \uc2e4\ud589\ud558\uae30","author":"litcoder","date":"2025\ub144 11\uc6d4 12\uc77c","format":false,"excerpt":"Intel 14\uc138\ub300 Meteor Lake \ubd80\ud130 NPU\uac00 \ud568\uaed8 embedding\ub418\uc5b4 \uc81c\uacf5\ub41c\ub2e4. Linux system\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub824\uba74 kernel version 6.2\uc774\uc0c1\uc774 \uc124\uce58\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4. NPU \ub514\ubc14\uc774\uc2a4 \ud655\uc778 CPU: Intel(R) Core(TM) Ultra 5 OS: Ubuntu 24.04 Linux kernel: 6.14.0-33-generic lspci \uba85\ub839\uc5b4\ub85c NPU \ub514\ubc14\uc774\uc2a4\uac00 \uc778\uc2dd\ub418\uc5b4 \uc788\ub294\uc9c0\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4. $ lspci -v|grep -A 9 NPU 00:0b.0 Processing accelerators:\u2026","rel":"","context":"&quot;Linux&quot;\uc5d0\uc11c","block_context":{"text":"Linux","link":"https:\/\/litcoder.com\/?cat=4"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":666,"url":"https:\/\/litcoder.com\/?p=666","url_meta":{"origin":3322,"position":5},"title":"OpenGrok 0.11.1","author":"litcoder","date":"2013\ub144 5\uc6d4 1\uc77c","format":false,"excerpt":"Update 2020\ub144 12\uc6d4 26\uc77c.\ub2e4\ud589\ud788 OpenGrok project\ub294 \uc0c8 \uc8fc\uc778\uc744 \uc798 \ub9cc\ub098 GitHub(https:\/\/github.com\/oracle\/opengrok)\uc5d0\uc11c \ubc30\ud3ec\ub418\uace0 \uc788\uc5b4, \uc544\ub798\uc758 \ub0b4\uc6a9\uc740 \ub354 \uc774\uc0c1 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. GitHub\ub85c \ubd80\ud130 \ucd5c\uc2e0 \ubc84\uc804\uc744 \uc124\uce58\ud558\ub294 \ubc29\ubc95\uc740 OpenGrok \ucd5c\uc2e0\ubc84\uc804 \uc124\uce58\ud558\uae30\ub97c \ucc38\uace0\ud558\uc138\uc694. \uc5b8\uc81c \ubd80\ud134\uac00 Oracle\uc5d0\uc11c OpenGrok page\uac00 \uc5c6\uc5b4\uc84c\ub2e4.GitHub\uc5d0 source\ub85c \ubc30\ud3ec\ud558\ub294 \uacf3\uc740 \uc788\ub294\ub370 \ube4c\ub4dc\ub41c \ubc84\uc804\uc5d0 \ub300\ud55c \ub9c1\ud06c\ub97c \ucc3e\uae30 \ud798\ub4e4\uc5b4\uc11c \uc608\uc804\uc5d0 \ubc1b\uc544 \ub450\uc5c8\ub358 0.11.1 version\uc758\u2026","rel":"","context":"&quot;Linux&quot;\uc5d0\uc11c","block_context":{"text":"Linux","link":"https:\/\/litcoder.com\/?cat=4"},"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\/3322","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=3322"}],"version-history":[{"count":11,"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts\/3322\/revisions"}],"predecessor-version":[{"id":3674,"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts\/3322\/revisions\/3674"}],"wp:attachment":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}