<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발자 Sunho Lee</title>
    <link>https://sssunho.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 16 Jul 2026 04:52:25 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>수노 SUNHO</managingEditor>
    <image>
      <title>개발자 Sunho Lee</title>
      <url>https://tistory1.daumcdn.net/tistory/2797982/attach/057d76a5bbd54a2dacffa34af54ff1af</url>
      <link>https://sssunho.tistory.com</link>
    </image>
    <item>
      <title>Windows Terminal 세팅/꾸미기</title>
      <link>https://sssunho.tistory.com/102</link>
      <description>&lt;p&gt;나의 예쁜 서피스 랩탑2&lt;br&gt;은행업무 볼때만 쓰기 아까워서 Ubuntu와 Vim에 익숙해질겸 개발할 때도 써보려고 한다.&lt;/p&gt;
&lt;p&gt;우선, 장비를 받으면 꾸미는게 우선 아닙니까? 그래서 꾸미기편&lt;/p&gt;
&lt;h2&gt;Terminal Schema 설정&lt;/h2&gt;
&lt;p&gt;Vim에 익숙하지 않아 답답하여 vscode를 먼저 설치함&lt;br&gt;Windows Terminal 설정을 선택하면 vscode로 setting.json 파일을 열어줍니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
    &amp;quot;$schema&amp;quot;: &amp;quot;https://aka.ms/terminal-profiles-schema&amp;quot;,

    &amp;quot;defaultProfile&amp;quot;: &amp;quot;{07b52e3e-de2c-5db4-bd2d-ba144ed6c273}&amp;quot;,

    &amp;quot;profiles&amp;quot;:
    {
        &amp;quot;defaults&amp;quot;:
        {
            &amp;quot;fontFace&amp;quot;: &amp;quot;D2coding&amp;quot;,
            &amp;quot;colorScheme&amp;quot;: &amp;quot;Banana Blueberry&amp;quot;
        },
        &amp;quot;list&amp;quot;:
        [
            ...,
            {
                &amp;quot;guid&amp;quot;: &amp;quot;{07b52e3e-de2c-5db4-bd2d-ba144ed6c273}&amp;quot;,
                &amp;quot;hidden&amp;quot;: false,
                &amp;quot;name&amp;quot;: &amp;quot;Ubuntu-20.04&amp;quot;,
                &amp;quot;source&amp;quot;: &amp;quot;Windows.Terminal.Wsl&amp;quot;,
                &amp;quot;startingDirectory&amp;quot;: &amp;quot;//wsl$/Ubuntu-20.04/home/sunho&amp;quot;
            }
        ]
    },

    &amp;quot;schemes&amp;quot;: [{...}, {
        &amp;quot;name&amp;quot;: &amp;quot;Banana Blueberry&amp;quot;,
        ...
      }],
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;defaultProfile&lt;br&gt;윈도우터미널 열면 띄울 프로필을 설정&lt;br&gt;&lt;code&gt;list&lt;/code&gt;목록들을 보면 &lt;code&gt;guid&lt;/code&gt;가 있는데 그것을 입력해주면 됩니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fontFace&lt;br&gt;윈도우 기본 폰트는 마음에 안들기 때문에 &lt;code&gt;D2coding&lt;/code&gt;으로 변경&lt;br&gt;(물론, 컴퓨터에 해당 폰트가 설치되어 있어야 합니다)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;colorScheme&lt;br&gt;윈도우터미널 스키마를 변경할 수 있는데, &lt;a href=&quot;https://aka.ms/terminal-color-schemes&quot;&gt;https://aka.ms/terminal-color-schemes&lt;/a&gt; 여기에 있는 스키마라면 이름만 바꿔주면 된다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;하지만 여기에 마음에 드는게 없다면&lt;br&gt;&lt;a href=&quot;https://windowsterminalthemes.dev/&quot;&gt;https://windowsterminalthemes.dev/&lt;/a&gt; 사이트에서 원하는 스키마 선택&lt;br&gt;-&amp;gt; &amp;#39;Get theme&amp;#39;을 클릭하면 json이 복사됨&lt;br&gt;-&amp;gt; settings.json의 &lt;code&gt;schemes&lt;/code&gt;에 붙여넣기 (배열안에 json추가)&lt;br&gt;-&amp;gt; &lt;code&gt;colorScheme&lt;/code&gt;에 복사한 json에 있는 &lt;code&gt;name&lt;/code&gt; 입력&lt;br&gt;하면 원하는 테마를 적용할 수 있다!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;startingDirectory&lt;br&gt;Ubuntu를 기본 프로필로 설정해뒀는데 홈디렉토리가 먼저 뜨지 않아 거슬림&lt;br&gt;&lt;code&gt;//wsl$/&amp;lt;NAME&amp;gt;/home/&amp;lt;USERNAME&amp;gt;&lt;/code&gt;로 설정해두면 끝!&lt;br&gt;&lt;code&gt;NAME&lt;/code&gt;은 &lt;code&gt;&amp;quot;name&amp;quot;: &amp;quot;Ubuntu-20.04&amp;quot;&lt;/code&gt; 요 부분의 값을 넣어줘야 한다. &lt;code&gt;USERNAME&lt;/code&gt; 홈디렉토리명은 각자의 이름을 넣으면 됩니다요.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Tools</category>
      <category>Windows</category>
      <category>WindowsTerminal</category>
      <category>wsl</category>
      <category>윈도우터미널</category>
      <author>수노 SUNHO</author>
      <guid isPermaLink="true">https://sssunho.tistory.com/102</guid>
      <comments>https://sssunho.tistory.com/102#entry102comment</comments>
      <pubDate>Mon, 2 Nov 2020 00:39:26 +0900</pubDate>
    </item>
    <item>
      <title>Flask Admin</title>
      <link>https://sssunho.tistory.com/101</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사내 관리자 페이지가 필요해졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이미 있지만 프론트엔드 개발자 없이 만들 수 있는, 운영팀이 데이터를 직접 수정할 수 있어야하는 페이지가 필요해졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예전에 Django 튜토리얼을 따라하다가 알게된 Django Admin이 딱! 생각났다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;회사에서는 Flask를 쓰기 때문에 Django Admin을 쓰진 못하지만 Flask에도 분명 따라 만든게 있을거라 생각했다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;역시 존재한다! Flask Admin!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://flask-admin.readthedocs.io/en/latest/&quot;&gt;https://flask-admin.readthedocs.io/en/latest/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1559663619195&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://flask-admin.readthedocs.io/en/latest/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://flask-admin.readthedocs.io/en/latest/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Flask-Admin &amp;mdash; flask-admin 1.5.3 documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Flask-Admin Why Flask? As a micro-framework, Flask lets you build web services with very little overhead. It offers freedom for you, the designer, to implement your project in a way that suits your particular application. Why Flask-Admin? In a world of mic&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;flask-admin.readthedocs.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;도큐먼트에 기본적인 설치 부분이 없어서 믿어도 되는가 싶었지만, 괜찮다. Github 레포에 있으니까!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;도큐먼트를 열심히 만들지 않았을뿐, 자기들 나름대로 활용할 수 있는 다양한 예시 코드들을 만들어놨다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://github.com/flask-admin/flask-admin&quot;&gt;https://github.com/flask-admin/flask-admin&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1559663725879&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://github.com/flask-admin/flask-admin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://github.com/flask-admin/flask-admin&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cuKz7q/hyBsdbrcSg/jmAfN8A0dHkcfnB0orU0qk/img.png?width=175&amp;amp;height=175&amp;amp;face=0_0_175_175');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;flask-admin/flask-admin&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Simple and extensible administrative interface framework for Flask - flask-admin/flask-admin&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오늘은 맛보기로 설치, 테마 설정, 다양한 활용 예시를 보도록 하겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;hr&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1559663605834&quot; class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install flask-admin&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;기본 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1559664087956&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask import Flask
from flask_admin import Admin

app = Flask(__name__)

# set optional bootswatch theme
app.config['FLASK_ADMIN_SWATCH'] = 'cerulean'

# set flask_admin
admin = Admin(app, name='microblog', template_mode='bootstrap3')

@app.route('/')
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    app.run()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이렇게 간단히 입력만해주고 Flask를 실행해준 다음,&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a href=&quot;http://127.0.0.1:5000/admin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://127.0.0.1:5000/admin&lt;/a&gt; 들어가면 바로 확인 가능하다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cluESX/btqvO91o2Mn/ZkF8A4INWsi2fSiPsvqunK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cluESX/btqvO91o2Mn/ZkF8A4INWsi2fSiPsvqunK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cluESX/btqvO91o2Mn/ZkF8A4INWsi2fSiPsvqunK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcluESX%2FbtqvO91o2Mn%2FZkF8A4INWsi2fSiPsvqunK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;테마 변경&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;테마가 당연히 바꾸고 싶어질 것이다! 백엔드 개발자여도 이쁜거 좋아한다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://github.com/flask-admin/flask-admin/tree/master/flask_admin/static/bootstrap/bootstrap3/swatch&quot;&gt;https://github.com/flask-admin/flask-admin/tree/master/flask_admin/static/bootstrap/bootstrap3/swatch&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;레포지토리 이 부분에 테마 목록을 확인할 수 있다. (이 부분에서 내가 프알못이란 티가 팍팍나는 것 같다)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아래 사이트에 들어가면 테마를 직접 눈으로 보고 선택할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bootswatch.com/&quot;&gt;https://bootswatch.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1559664305349&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://bootswatch.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://bootswatch.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/639lA/hyBr4ewvCU/XKQKKIVsw74ccczQUXxjK0/img.png?width=1000&amp;amp;height=600&amp;amp;face=0_0_1000_600,https://scrap.kakaocdn.net/dn/bWKuu6/hyBtLLa0t2/9xhIdpiXjVAQtyIFNqAal0/img.png?width=1000&amp;amp;height=600&amp;amp;face=0_0_1000_600,https://scrap.kakaocdn.net/dn/mryiB/hyBr4ewvET/2CcNW8IgpPu9YQDiKPIgk1/img.png?width=1000&amp;amp;height=600&amp;amp;face=0_0_1000_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Bootswatch: Free themes for Bootstrap&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Customizable Changes are contained in just two SASS files, enabling further customization and ensuring forward compatibility.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;bootswatch.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1559664135056&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;app.config['FLASK_ADMIN_SWATCH'] = 'theme name'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마음에 드는 테마를 찾았다면 이 부분에 테마 이름만 넣어주면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;다양한 활용 예시&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Github 레포에 SQLAlchemy, Auth 등 다양한 활용 예시들이 있다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://github.com/flask-admin/flask-admin/tree/7fa26ab227868ff7512bb25c26a30fd7d69184bc/examples&quot;&gt;https://github.com/flask-admin/flask-admin/tree/7fa26ab227868ff7512bb25c26a30fd7d69184bc/examples&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;나는 SQLAlchemy를 쓰기 때문에 예제 코드 그대로 따라해봤는데 잘됐다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;모델링만 해주면 Admin 페이지에서 CRUD 작업을 처리해준다.&lt;/p&gt;
&lt;p&gt;Delete는 함부로 하면 안되기 때문에 DELETE 기능을 끄는 옵션도 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;SQLAlchemy 뿐만 아니라 다른 것도 해보고 실제로 활용도가 높을지 제안해봐야겠다!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python</category>
      <category>flask</category>
      <category>flask_admin</category>
      <category>Python</category>
      <category>sqlalchemy</category>
      <author>수노 SUNHO</author>
      <guid isPermaLink="true">https://sssunho.tistory.com/101</guid>
      <comments>https://sssunho.tistory.com/101#entry101comment</comments>
      <pubDate>Wed, 5 Jun 2019 01:32:10 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] Mac에 AWS S3 설치하기</title>
      <link>https://sssunho.tistory.com/99</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/awscli-install-linux-al2017.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/awscli-install-linux-al2017.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#fafafa; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #e5e5e5&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#666; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;brew&amp;nbsp;install&amp;nbsp;awscli&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(229, 229, 229); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;터미널에서 명령어를 통하여 설치&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#fafafa; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #e5e5e5&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#666; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;aws&amp;nbsp;configure&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(229, 229, 229); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;설치 후, 명령어 입력해서 기본 세팅해주면 끝!&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Tools</category>
      <category>AWS</category>
      <category>awsS3</category>
      <category>s3</category>
      <author>수노 SUNHO</author>
      <guid isPermaLink="true">https://sssunho.tistory.com/99</guid>
      <comments>https://sssunho.tistory.com/99#entry99comment</comments>
      <pubDate>Thu, 4 Apr 2019 00:04:00 +0900</pubDate>
    </item>
    <item>
      <title>[EOS] 3060101 database_guard_exception: Database usage is at unsafe levels</title>
      <link>https://sssunho.tistory.com/96</link>
      <description>&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#272727; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #4f4f4f&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#aaa; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;4&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;5&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;6&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;7&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;8&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;9&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;10&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;info&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#c10aff&quot;&gt;2019&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;24T01:&lt;span style=&quot;color:#c10aff&quot;&gt;40&lt;/span&gt;:&lt;span style=&quot;color:#c10aff&quot;&gt;37.&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;000&lt;/span&gt;&amp;nbsp;thread&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;0&lt;/span&gt;&amp;nbsp;&amp;nbsp;producer_plugin.cpp:&lt;span style=&quot;color:#c10aff&quot;&gt;1490&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;produce_block&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&amp;nbsp;Produced&amp;nbsp;block&amp;nbsp;0015bb7995027940...&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;#1424249&amp;nbsp;@&amp;nbsp;2019-01-24T01:40:37.000&amp;nbsp;signed&amp;nbsp;by&amp;nbsp;eosio&amp;nbsp;[trxs:&amp;nbsp;0,&amp;nbsp;lib:&amp;nbsp;1424248,&amp;nbsp;confirmed:&amp;nbsp;0]&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;error&amp;nbsp;&lt;span style=&quot;color:#c10aff&quot;&gt;2019&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;24T01:&lt;span style=&quot;color:#c10aff&quot;&gt;40&lt;/span&gt;:&lt;span style=&quot;color:#c10aff&quot;&gt;37.&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;500&lt;/span&gt;&amp;nbsp;thread&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;0&lt;/span&gt;&amp;nbsp;&amp;nbsp;chain_plugin.cpp:&lt;span style=&quot;color:#c10aff&quot;&gt;969&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log_guard_exception&amp;nbsp;&amp;nbsp;]&amp;nbsp;Database&amp;nbsp;has&amp;nbsp;reached&amp;nbsp;an&amp;nbsp;unsafe&amp;nbsp;level&amp;nbsp;of&amp;nbsp;usage,&amp;nbsp;shutting&amp;nbsp;down&amp;nbsp;to&amp;nbsp;avoid&amp;nbsp;corrupting&amp;nbsp;the&amp;nbsp;database.&amp;nbsp;&amp;nbsp;Please&amp;nbsp;increase&amp;nbsp;the&amp;nbsp;value&amp;nbsp;&lt;span style=&quot;color:#4be6fa&quot;&gt;set&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;for&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ffd500&quot;&gt;&quot;chain-state-db-size-mb&quot;&lt;/span&gt;&amp;nbsp;and&amp;nbsp;restart&amp;nbsp;the&amp;nbsp;process&lt;span style=&quot;color:#ff3399&quot;&gt;!&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;debug&amp;nbsp;&lt;span style=&quot;color:#c10aff&quot;&gt;2019&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;24T01:&lt;span style=&quot;color:#c10aff&quot;&gt;40&lt;/span&gt;:&lt;span style=&quot;color:#c10aff&quot;&gt;37.&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;500&lt;/span&gt;&amp;nbsp;thread&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;0&lt;/span&gt;&amp;nbsp;&amp;nbsp;chain_plugin.cpp:&lt;span style=&quot;color:#c10aff&quot;&gt;975&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log_guard_exception&amp;nbsp;&amp;nbsp;]&amp;nbsp;Details:&amp;nbsp;&lt;span style=&quot;color:#c10aff&quot;&gt;3060101&lt;/span&gt;&amp;nbsp;database_guard_exception:&amp;nbsp;Database&amp;nbsp;usage&amp;nbsp;is&amp;nbsp;at&amp;nbsp;unsafe&amp;nbsp;levels&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;database&amp;nbsp;free:&amp;nbsp;&lt;span style=&quot;color:#c10aff&quot;&gt;134217280&lt;/span&gt;,&amp;nbsp;guard&amp;nbsp;size:&amp;nbsp;&lt;span style=&quot;color:#c10aff&quot;&gt;134217728&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span style=&quot;color:#ffd500&quot;&gt;&quot;f&quot;&lt;/span&gt;:&lt;span style=&quot;color:#c10aff&quot;&gt;134217280&lt;/span&gt;,&lt;span style=&quot;color:#ffd500&quot;&gt;&quot;g&quot;&lt;/span&gt;:&lt;span style=&quot;color:#c10aff&quot;&gt;134217728&lt;/span&gt;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;thread&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;0&lt;/span&gt;&amp;nbsp;&amp;nbsp;controller.cpp:&lt;span style=&quot;color:#c10aff&quot;&gt;2073&lt;/span&gt;&amp;nbsp;validate_db_available_size&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;info&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#c10aff&quot;&gt;2019&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;24T01:&lt;span style=&quot;color:#c10aff&quot;&gt;40&lt;/span&gt;:&lt;span style=&quot;color:#c10aff&quot;&gt;37.&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;500&lt;/span&gt;&amp;nbsp;thread&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;0&lt;/span&gt;&amp;nbsp;&amp;nbsp;net_plugin.cpp:&lt;span style=&quot;color:#c10aff&quot;&gt;3049&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plugin_shutdown&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&amp;nbsp;shutdown..&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;info&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#c10aff&quot;&gt;2019&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;24T01:&lt;span style=&quot;color:#c10aff&quot;&gt;40&lt;/span&gt;:&lt;span style=&quot;color:#c10aff&quot;&gt;37.&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;501&lt;/span&gt;&amp;nbsp;thread&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;0&lt;/span&gt;&amp;nbsp;&amp;nbsp;net_plugin.cpp:&lt;span style=&quot;color:#c10aff&quot;&gt;3052&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plugin_shutdown&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&amp;nbsp;close&amp;nbsp;acceptor&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;info&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#c10aff&quot;&gt;2019&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;24T01:&lt;span style=&quot;color:#c10aff&quot;&gt;40&lt;/span&gt;:&lt;span style=&quot;color:#c10aff&quot;&gt;37.&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;501&lt;/span&gt;&amp;nbsp;thread&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;0&lt;/span&gt;&amp;nbsp;&amp;nbsp;net_plugin.cpp:&lt;span style=&quot;color:#c10aff&quot;&gt;3055&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plugin_shutdown&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&amp;nbsp;close&amp;nbsp;&lt;span style=&quot;color:#c10aff&quot;&gt;0&lt;/span&gt;&amp;nbsp;connections&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;info&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#c10aff&quot;&gt;2019&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;24T01:&lt;span style=&quot;color:#c10aff&quot;&gt;40&lt;/span&gt;:&lt;span style=&quot;color:#c10aff&quot;&gt;37.&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;501&lt;/span&gt;&amp;nbsp;thread&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;0&lt;/span&gt;&amp;nbsp;&amp;nbsp;net_plugin.cpp:&lt;span style=&quot;color:#c10aff&quot;&gt;3063&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plugin_shutdown&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&amp;nbsp;exit&amp;nbsp;shutdown&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: rgb(79, 79, 79);&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(79, 79, 79); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;디비 사용량 초과 에러가 뜬 경우, 해결방법은 사용가능한 크기를 늘려주면 된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#272727; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #4f4f4f&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#aaa; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;nodeos&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;e&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;p&amp;nbsp;eosio&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;plugin&amp;nbsp;eosio::producer_plugin&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;plugin&amp;nbsp;eosio::chain_plugin&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;plugin&amp;nbsp;eosio::chain_api_plugin&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;plugin&amp;nbsp;eosio::http_plugin&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;plugin&amp;nbsp;eosio::history_plugin&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;plugin&amp;nbsp;eosio::history_api_plugin&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;data&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;dir&amp;nbsp;CONTRACTS_DIR&lt;span style=&quot;color:#ff3399&quot;&gt;/&lt;/span&gt;eosio&lt;span style=&quot;color:#ff3399&quot;&gt;/&lt;/span&gt;data&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;config&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;dir&amp;nbsp;CONTRACTS_DIR&lt;span style=&quot;color:#ff3399&quot;&gt;/&lt;/span&gt;eosio&lt;span style=&quot;color:#ff3399&quot;&gt;/&lt;/span&gt;config&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;access&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;control&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;allow&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;origin&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ffd500&quot;&gt;'*'&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;contracts&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;console&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;http&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;validate&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;host&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;false&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;verbose&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;http&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;errors&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;filter&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;on&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ffd500&quot;&gt;'*'&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;http&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;server&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;address&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;0.&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;0.&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;0.&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;0&lt;/span&gt;:&lt;span style=&quot;color:#c10aff&quot;&gt;8888&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;http&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#4be6fa&quot;&gt;alias&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;fabius.ciceron.xyz:&lt;span style=&quot;color:#c10aff&quot;&gt;8888&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;chain&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;state&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;db&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;size&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;mb&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;3072&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;nodeos.log&amp;nbsp;&lt;span style=&quot;color:#c10aff&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;&amp;amp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(79, 79, 79); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;nodeos를 실행할 때,&amp;nbsp;&lt;span class=&quot;cs-sublime-black-common-keyword1&quot; style=&quot;color: rgb(255, 51, 153); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 12px; white-space: pre; background-color: rgb(39, 39, 39);&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;cs-sublime-black-common-keyword2&quot; style=&quot;color: rgb(0, 134, 179); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 12px; white-space: pre; background-color: rgb(39, 39, 39);&quot;&gt;&lt;/span&gt;&lt;span class=&quot;cs-sublime-black-common-keyword1&quot; style=&quot;color: rgb(255, 51, 153); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 12px; white-space: pre; background-color: rgb(39, 39, 39);&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: rgb(240, 240, 240); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 12px; white-space: pre; background-color: rgb(39, 39, 39);&quot;&gt;chain&lt;/span&gt;&lt;span class=&quot;cs-sublime-black-common-keyword2&quot; style=&quot;color: rgb(0, 134, 179); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 12px; white-space: pre; background-color: rgb(39, 39, 39);&quot;&gt;&lt;/span&gt;&lt;span class=&quot;cs-sublime-black-common-keyword1&quot; style=&quot;color: rgb(255, 51, 153); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 12px; white-space: pre; background-color: rgb(39, 39, 39);&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: rgb(240, 240, 240); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 12px; white-space: pre; background-color: rgb(39, 39, 39);&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;cs-sublime-black-common-keyword2&quot; style=&quot;color: rgb(0, 134, 179); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 12px; white-space: pre; background-color: rgb(39, 39, 39);&quot;&gt;&lt;/span&gt;&lt;span class=&quot;cs-sublime-black-common-keyword1&quot; style=&quot;color: rgb(255, 51, 153); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 12px; white-space: pre; background-color: rgb(39, 39, 39);&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: rgb(240, 240, 240); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 12px; white-space: pre; background-color: rgb(39, 39, 39);&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;cs-sublime-black-common-keyword2&quot; style=&quot;color: rgb(0, 134, 179); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 12px; white-space: pre; background-color: rgb(39, 39, 39);&quot;&gt;&lt;/span&gt;&lt;span class=&quot;cs-sublime-black-common-keyword1&quot; style=&quot;color: rgb(255, 51, 153); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 12px; white-space: pre; background-color: rgb(39, 39, 39);&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: rgb(240, 240, 240); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 12px; white-space: pre; background-color: rgb(39, 39, 39);&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;cs-sublime-black-common-keyword2&quot; style=&quot;color: rgb(0, 134, 179); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 12px; white-space: pre; background-color: rgb(39, 39, 39);&quot;&gt;&lt;/span&gt;&lt;span class=&quot;cs-sublime-black-common-keyword1&quot; style=&quot;color: rgb(255, 51, 153); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 12px; white-space: pre; background-color: rgb(39, 39, 39);&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: rgb(240, 240, 240); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 12px; white-space: pre; background-color: rgb(39, 39, 39);&quot;&gt;mb&lt;/span&gt;&lt;span class=&quot;cs-sublime-black-common-keyword2&quot; style=&quot;color: rgb(0, 134, 179); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 12px; white-space: pre; background-color: rgb(39, 39, 39);&quot;&gt;&lt;/span&gt;&lt;span class=&quot;cs-sublime-black-common-keyword1&quot; style=&quot;color: rgb(255, 51, 153); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 12px; white-space: pre; background-color: rgb(39, 39, 39);&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;cs-sublime-black-common-number&quot; style=&quot;color: rgb(193, 10, 255); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 12px; white-space: pre; background-color: rgb(39, 39, 39);&quot;&gt;3072&lt;/span&gt;&amp;nbsp;를 추가해서 사용 가능한 크기를 설정해준다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;p&gt;참고&lt;/p&gt;&lt;ul style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.eosdocs.io/bp/commonmistakes/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://www.eosdocs.io/bp/commonmistakes/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developers.eos.io/eosio-nodeos/docs/chain_plugin&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://developers.eos.io/eosio-nodeos/docs/chain_plugin&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Blockchain</category>
      <category>blockchain</category>
      <category>eos</category>
      <category>eosio</category>
      <author>수노 SUNHO</author>
      <guid isPermaLink="true">https://sssunho.tistory.com/96</guid>
      <comments>https://sssunho.tistory.com/96#entry96comment</comments>
      <pubDate>Tue, 2 Apr 2019 09:00:00 +0900</pubDate>
    </item>
    <item>
      <title>좋은 에러 응답 고민하기</title>
      <link>https://sssunho.tistory.com/94</link>
      <description>&lt;h1&gt;Good Error Response&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Issue&lt;/h2&gt;&lt;div&gt;친하지만 한번도 같이 프로젝트를 해본적 없는 동료와 프로젝트를 시작하게 되었다. 좋은 프로젝트, 코드 등 업무 관련해서 다양한 대화를 할 수 있는 좋은 동료다. 그래서 함께 프로젝트를 시작하는 것이 좋았다.&lt;/div&gt;&lt;div&gt;우리는 현재 회사의 에러 응답에 대한 규칙, 형식을 요번 기회에 정해보자고 했다. 그래서 Facebook, Google 등 대기업의 에러 응답도 분석해보고 글을 읽으며 우리들만의 규칙을 정했다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Solution&lt;/h2&gt;&lt;div&gt;code(에러 번호), message(메세지), description(설명)를&amp;nbsp;에러의 기본 형태로 정했다.&lt;/div&gt;&lt;div&gt;code를 카테고라이징하여 맨앞자리가 분류를 나타내고, message를 통해 code의 이름을 알려주고, 설명을 통해 상황마다의 자세한 설명을 넣기로 하였다. 그리고 이를 정리한 것을 엑셀로 정리하여 공유하기로 했다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;도움받은 사이트&lt;/h3&gt;&lt;ul style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;Best Practices for Designing a Pragmatic RESTful API&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#fafafa; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #e5e5e5&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#666; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;4&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;5&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;code&quot;&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;1234&lt;/span&gt;,&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;message&quot;&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;Something&amp;nbsp;bad&amp;nbsp;happened&amp;nbsp;:(&quot;&lt;/span&gt;,&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;description&quot;&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;More&amp;nbsp;details&amp;nbsp;about&amp;nbsp;the&amp;nbsp;error&amp;nbsp;here&quot;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: rgb(229, 229, 229);&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(229, 229, 229); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;overflow: auto; position: relative !important;&quot;&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: rgb(1, 1, 1); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace !important; overflow: auto; position: relative !important;&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#fafafa; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #e5e5e5&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#666; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;4&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;5&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;6&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;7&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;8&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;9&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;10&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;11&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;12&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;13&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;14&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;15&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;16&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;code&quot;&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;1024&lt;/span&gt;,&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;message&quot;&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;Validation&amp;nbsp;Failed&quot;&lt;/span&gt;,&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;errors&quot;&lt;/span&gt;&amp;nbsp;:&amp;nbsp;[&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;code&quot;&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;5432&lt;/span&gt;,&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;field&quot;&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;first_name&quot;&lt;/span&gt;,&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;message&quot;&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;First&amp;nbsp;name&amp;nbsp;cannot&amp;nbsp;have&amp;nbsp;fancy&amp;nbsp;characters&quot;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;code&quot;&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;5622&lt;/span&gt;,&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;field&quot;&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;password&quot;&lt;/span&gt;,&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;message&quot;&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;Password&amp;nbsp;cannot&amp;nbsp;be&amp;nbsp;blank&quot;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;]&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: rgb(229, 229, 229);&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(229, 229, 229); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style=&quot;list-style-type: square;&quot;&gt;&lt;p&gt;&lt;ul style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;overflow: auto; position: relative !important;&quot;&gt;&lt;font color=&quot;#010101&quot; face=&quot;Consolas, Liberation Mono, Menlo, Courier, monospace&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://blog.mwaysolutions.com/2014/06/05/10-best-practices-for-better-restful-api&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;10 Best Practices for Better RESTful API&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;overflow: auto; position: relative !important;&quot;&gt;&lt;p&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#fafafa; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #e5e5e5&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#666; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;4&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;5&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;6&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;7&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;8&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;9&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;10&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;errors&quot;&lt;/span&gt;:&amp;nbsp;[&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;userMessage&quot;&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;Sorry,&amp;nbsp;the&amp;nbsp;requested&amp;nbsp;resource&amp;nbsp;does&amp;nbsp;not&amp;nbsp;exist&quot;&lt;/span&gt;,&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;internalMessage&quot;&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;No&amp;nbsp;car&amp;nbsp;found&amp;nbsp;in&amp;nbsp;the&amp;nbsp;database&quot;&lt;/span&gt;,&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;code&quot;&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;34&lt;/span&gt;,&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;more&amp;nbsp;info&quot;&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;http://dev.mwaysolutions.com/blog/api/v1/errors/12345&quot;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;]&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: rgb(229, 229, 229);&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(229, 229, 229); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>error</category>
      <author>수노 SUNHO</author>
      <guid isPermaLink="true">https://sssunho.tistory.com/94</guid>
      <comments>https://sssunho.tistory.com/94#entry94comment</comments>
      <pubDate>Tue, 2 Apr 2019 09:00:00 +0900</pubDate>
    </item>
    <item>
      <title>Python과 함께 텔레그램 챗봇 만들기(3)</title>
      <link>https://sssunho.tistory.com/93</link>
      <description>
&lt;meta charset=&quot;UTF-8&quot;&gt;&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width initial-scale=1&quot;&gt;
&lt;title&gt;bot/ telegram bot&lt;/title&gt;

&lt;p&gt;&lt;a href=&quot;https://core.telegram.org/bots/api&quot; target=&quot;_blank&quot; class=&quot;url&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;https://core.telegram.org/bots/api&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;봇은 키워드 설정을 잘해야한다
message, callback_query
inline keyboard - url, callback_data&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;데이터를 잘 분석하여 원하는 답장 보내기 등 활용을 해야한다.&lt;/p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;h3&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;getUpdate 데이터&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://api.telegram.org/bot561471433:AAEeWZ7KdcqjYc4ujyufJHuKl8EpPQC3MdY/getUpdates&quot; target=&quot;_blank&quot; class=&quot;url&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;https://api.telegram.org/bot561471433:AAEeWZ7KdcqjYc4ujyufJHuKl8EpPQC3MdY/getUpdates&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;pre&gt;&lt;code class=&quot;language-json&quot; lang=&quot;json&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;{
    &quot;ok&quot;: true,
    &quot;result&quot;: [
        {
            `&quot;update_id&quot;`: 14493&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;917,
            &quot;message&quot;: {
                `&quot;message_id&quot;`: 2,
                &quot;from&quot;: {
                    &quot;id&quot;: 6042&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;2092,
                    &quot;is_bot&quot;: false,
                    &quot;first_name&quot;: &quot;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&quot;,
                    &quot;last_name&quot;: &quot;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&quot;,
                    &quot;language_code&quot;: &quot;ko-KR&quot;
                },
                &quot;chat&quot;: {
                    `&quot;id&quot;`: 60425&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;092,
                    &quot;first_name&quot;: &quot;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&quot;,
                    &quot;last_name&quot;: &quot;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&quot;,
                    &quot;type&quot;: &quot;private&quot;
                },
                &quot;date&quot;: 1529892301,
                `&quot;text&quot;`: &quot;nice&quot;
            }
        }
    ]
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;polling: 특정 시간마다 계속 불러온다&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;Webhook이 있으나 드러워서 안써~ 느리고, 죽고.. HTTPS도 까다롭게 필요하고..&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;sendMessage 데이터&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://core.telegram.org/bots/api#sendmessage&quot; target=&quot;_blank&quot; class=&quot;url&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;https://core.telegram.org/bots/api#sendmessage&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://api.telegram.org/bot561471433:AAEeWZ7KdcqjYc4ujyufJHuKl8EpPQC3MdY/sendMessage&quot; target=&quot;_blank&quot; class=&quot;url&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;https://api.telegram.org/bot561471433:AAEeWZ7KdcqjYc4ujyufJHuKl8EpPQC3MdY/sendMessage&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;pre&gt;&lt;code class=&quot;language-json&quot; lang=&quot;json&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;{
    &quot;ok&quot;: true,
    &quot;result&quot;: {
        &quot;message_id&quot;: 3,
        &quot;from&quot;: {
            &quot;id&quot;: 5611433,
            &quot;is_bot&quot;: true,
            &quot;first_name&quot;: &quot;test&quot;,
            &quot;username&quot;: &quot;testbot&quot;
        },
        &quot;chat&quot;: {
            &quot;id&quot;: 60422092,
            &quot;first_name&quot;: &quot;&quot;,
            &quot;last_name&quot;: &quot;&quot;,
            &quot;type&quot;: &quot;private&quot;
        },
        &quot;date&quot;: 15292458,
        &quot;text&quot;: &quot;to meet you&quot;
    }
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;
&lt;/span&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Python</category>
      <category>Bot</category>
      <category>Chatbot</category>
      <category>Python</category>
      <category>telegram</category>
      <category>챗봇</category>
      <category>텔레그램</category>
      <category>파이썬</category>
      <author>수노 SUNHO</author>
      <guid isPermaLink="true">https://sssunho.tistory.com/93</guid>
      <comments>https://sssunho.tistory.com/93#entry93comment</comments>
      <pubDate>Mon, 1 Apr 2019 09:00:00 +0900</pubDate>
    </item>
    <item>
      <title>UnicodeEncodeError 해결하기</title>
      <link>https://sssunho.tistory.com/91</link>
      <description>
&lt;meta charset=&quot;UTF-8&quot;&gt;&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width initial-scale=1&quot;&gt;

&lt;h2&gt;problem&lt;/h2&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#272727; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #4f4f4f&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#aaa; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;UnicodeEncodeError:&amp;nbsp;&lt;span style=&quot;color:#ffd500&quot;&gt;'latin-1'&lt;/span&gt;&amp;nbsp;codec&amp;nbsp;can&lt;span style=&quot;color:#ffd500&quot;&gt;'t&amp;nbsp;encode&amp;nbsp;characters&amp;nbsp;in&amp;nbsp;position&amp;nbsp;...&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ffd500&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: rgb(79, 79, 79);&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(79, 79, 79); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;파이썬 작업 중 &lt;code&gt;UnicodeEncodeError&lt;/code&gt; 인코딩 에러가 계속 뜬다.&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;인코딩 문제는 방심할 때 나타난다. 어디서 어떻게 나타날지 모른다.&lt;/p&gt;&lt;p&gt;그래서 오늘은 인코딩이 일어날 때 사용중이었던 모듈을 기록해두려한다.&lt;/p&gt;
&lt;h3&gt;spec&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;sqlalchemy&lt;/li&gt;
&lt;li&gt;pymysql&lt;/li&gt;
&lt;li&gt;requests&lt;/li&gt;
&lt;li&gt;json&lt;/li&gt;

&lt;/ul&gt;
&lt;br /&gt;
&lt;h2&gt;cause&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;정확히는 원인을 찾아나간 과정입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&quot;&quot;&gt;
&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;1. requests의 response가 문제인 줄 알았다.&lt;/p&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#272727; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #4f4f4f&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#aaa; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;4&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;5&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;6&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;7&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;8&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;9&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;10&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;{&lt;span style=&quot;color:#ffd500&quot;&gt;'data1'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color:#ffd500&quot;&gt;&quot;????&amp;nbsp;????&amp;nbsp;??&amp;nbsp;???&amp;nbsp;??&amp;nbsp;???&amp;nbsp;???.'&quot;&lt;/span&gt;,&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ffd500&quot;&gt;'data2'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color:#ffd500&quot;&gt;'Huh?&amp;nbsp;really?\n'&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ffd500&quot;&gt;'huh?&amp;nbsp;really?\n'&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ffd500&quot;&gt;'?&amp;nbsp;what?\n'&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ffd500&quot;&gt;'huh??\n'&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ffd500&quot;&gt;'?&amp;nbsp;what?\n'&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ffd500&quot;&gt;'huh??\n'&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ffd500&quot;&gt;'huh??\n'&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ffd500&quot;&gt;&quot;'Let's&amp;nbsp;say.&amp;nbsp;'\n&quot;&lt;/span&gt;,&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ffd500&quot;&gt;'data3'&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color:#ffd500&quot;&gt;'?????&amp;nbsp;?????&amp;nbsp;??&amp;nbsp;???&amp;nbsp;??&amp;nbsp;???&amp;nbsp;???&amp;nbsp;&amp;amp;quot;'&lt;/span&gt;}&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(79, 79, 79); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;그래서 일단 결과값들을 decoding하기 시작..&lt;/p&gt;&lt;p&gt;json.loads()가 encoding, decoding을 못하는 줄 알고 온갖 인코딩, 디코딩 방법들을 시도했다.&lt;/p&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#272727; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #4f4f4f&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#aaa; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;res.json().encode('utf-8')&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;json.loads(res.content,&amp;nbsp;encoding='utf-8')&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(79, 79, 79); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol start=&quot;&quot;&gt;

&lt;/ol&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;/ol&gt;&lt;p&gt;&lt;p&gt;2. mysql 테이블 character set을 잘못한 줄 알았으나 &lt;code&gt;utf8_general_ci&lt;/code&gt;로 잘 되있었다.
workbench에서 직접 쿼리도 때려보고,&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/p&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#272727; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #4f4f4f&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#aaa; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;SHOW&lt;/span&gt;&amp;nbsp;FULL&amp;nbsp;COLUMNS&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;FROM&lt;/span&gt;&amp;nbsp;table_name;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color:#4f4f4f; text-decoration:none&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none; color:white&quot;&gt;&lt;span style=&quot;font-size:9px; word-break:normal; background-color:#4f4f4f; color:white; border-radius:10px; padding:1px&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;/div&gt;&lt;p&gt;&lt;p&gt;를 통하여 칼럼 속성도 다시 확인해보았으나 오류를 발견하지 못했다.&lt;/p&gt;
&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;ol start=&quot;2&quot;&gt;
&lt;/ol&gt;&lt;p&gt;&lt;p&gt;3. 갑자기 쎄한 기분이 들어, sqlalchemy의 결과값, row를 찍어보았다. &lt;/p&gt;&lt;p&gt;역시나.. 쎄한기분은 틀리지 않는다.&lt;/p&gt;&lt;/p&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#272727; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #4f4f4f&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#aaa; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;(&lt;span style=&quot;color:#ffd500&quot;&gt;&quot;'???,&amp;nbsp;???'\x85??&amp;nbsp;??&amp;nbsp;???\n??&amp;nbsp;2018-07-04&amp;nbsp;11:47\n??&amp;nbsp;'???'?&amp;nbsp;??[??&amp;nbsp;?]\n(??=???)&amp;nbsp;???.&quot;&lt;/span&gt;)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color:#4f4f4f; text-decoration:none&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none; color:white&quot;&gt;&lt;span style=&quot;font-size:9px; word-break:normal; background-color:#4f4f4f; color:white; border-radius:10px; padding:1px&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;/div&gt;&lt;p&gt;&lt;p&gt;드디어 원인을 찾았다! sqlalchemy 결과값부터가 문제였다.&lt;/p&gt;&lt;/p&gt;&lt;p&gt;여태 아무 문제없이 잘 돌고 있었는데.. 이렇게 통수를 치다니. 방심했다.&lt;/p&gt;
&lt;br /&gt;
&lt;h2&gt;solution&lt;/h2&gt;
&lt;p&gt;원인찾기는 많이 헤맸지만 문제해결은 어렵지 않았다.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://docs.sqlalchemy.org/en/latest/dialects/mysql.html?highlight=encode&quot;&gt;SQLAlchemy, MySQL Document&lt;/a&gt; 에서 바로 알 수 있다.&lt;/p&gt;&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#272727; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #4f4f4f&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#aaa; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;4&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;5&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;#&amp;nbsp;방법&amp;nbsp;&lt;span style=&quot;color:#c10aff&quot;&gt;1&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;engine&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#4be6fa&quot;&gt;=&lt;/span&gt;&amp;nbsp;create_engine(&lt;span style=&quot;color:#ffd500&quot;&gt;'mysql+mysqldb://...'&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color:#4be6fa&quot;&gt;=&lt;/span&gt;utf8)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;#&amp;nbsp;방법&amp;nbsp;&lt;span style=&quot;color:#c10aff&quot;&gt;2&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;mysql&lt;span style=&quot;color:#4be6fa&quot;&gt;+&lt;/span&gt;pymysql:&lt;span style=&quot;color:#4be6fa&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#4be6fa&quot;&gt;/&lt;/span&gt;{user}:{password}@{host}:&lt;span style=&quot;color:#c10aff&quot;&gt;3306&lt;/span&gt;&lt;span style=&quot;color:#4be6fa&quot;&gt;/&lt;/span&gt;{database}?&lt;span style=&quot;color:#ff3399&quot;&gt;charset&lt;/span&gt;&lt;span style=&quot;color:#4be6fa&quot;&gt;=&lt;/span&gt;utf8&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(79, 79, 79); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;charset=utf8&lt;/code&gt; 만 붙여주면 모든 것이 평화롭다.&lt;/p&gt;
&lt;br /&gt;
&lt;h2&gt;key point summary&lt;/h2&gt;
&lt;p&gt;sqlalchemy의 charset을 utf8로 설정해둠으로써 인코딩에 대한 우려를 접을 수 있다.&lt;/p&gt;&lt;p&gt;sqlalchemy 뿐만아니라 string을 다룰 땐 항상 charset, encode, decode를 조심하자. 제발.&lt;/p&gt;</description>
      <category>Python</category>
      <category>enode</category>
      <category>Python</category>
      <category>urlcodeencodeerror</category>
      <category>인코딩에러</category>
      <category>파이썬</category>
      <author>수노 SUNHO</author>
      <guid isPermaLink="true">https://sssunho.tistory.com/91</guid>
      <comments>https://sssunho.tistory.com/91#entry91comment</comments>
      <pubDate>Fri, 29 Mar 2019 09:00:00 +0900</pubDate>
    </item>
    <item>
      <title>[Jenkins] GemNotFound</title>
      <link>https://sssunho.tistory.com/90</link>
      <description>
&lt;meta charset=&quot;UTF-8&quot;&gt;&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width initial-scale=1&quot;&gt;

&lt;h2&gt;problem&lt;/h2&gt;
&lt;p&gt;github pages에 포스팅할 때, 수정사항이 반영됐나 바로 확인하기 위해서 &lt;code&gt;jekyll serve&lt;/code&gt;를 돌리고 싶었습니다.&lt;/p&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#272727; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #4f4f4f&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#aaa; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;$&amp;nbsp;jekyll&amp;nbsp;serve&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;/&lt;/span&gt;Library&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;/&lt;/span&gt;Ruby&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;/&lt;/span&gt;Gems&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;2.&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;3.&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;/&lt;/span&gt;gems&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;/&lt;/span&gt;bundler&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;1.&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;16.&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;/&lt;/span&gt;lib&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;/&lt;/span&gt;bundler&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;/&lt;/span&gt;spec_set.rb:&lt;span style=&quot;color:#c10aff&quot;&gt;91&lt;/span&gt;:in&amp;nbsp;`block&amp;nbsp;in&amp;nbsp;materialize&lt;span style=&quot;color:#ffd500&quot;&gt;':&amp;nbsp;Could&amp;nbsp;not&amp;nbsp;find&amp;nbsp;gemoji-3.0.0&amp;nbsp;in&amp;nbsp;any&amp;nbsp;of&amp;nbsp;the&amp;nbsp;sources&amp;nbsp;(Bundler::GemNotFound)&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ffd500&quot;&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: rgb(79, 79, 79);&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(79, 79, 79); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;GemNotFound가 뜨면서 &lt;code&gt;gemoji&lt;/code&gt;를 찾을 수 없다고 합니다.&lt;/p&gt;
&lt;br /&gt;
&lt;h2&gt;cause&lt;/h2&gt;
&lt;p&gt;Gemfile에 추가해둔 gemoji가 문제입니다. gemoji가 설치가 안되어 있는거죠.&lt;/p&gt;&lt;p&gt;그럼 gemoji를 설치해주면 되겠습니다.&lt;/p&gt;
&lt;br /&gt;
&lt;h2&gt;solution&lt;/h2&gt;&lt;div&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#272727; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #4f4f4f&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#aaa; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;bundle&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(79, 79, 79); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;bundle&lt;/code&gt; 명령어를 통해 Gemfile에 추가한 gem을 설치해줍니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#272727; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #4f4f4f&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#aaa; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;4&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;5&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;6&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;Gem::FilePermissionError:&amp;nbsp;You&amp;nbsp;don&lt;span style=&quot;color:#ffd500&quot;&gt;'t&amp;nbsp;have&amp;nbsp;write&amp;nbsp;permissions&amp;nbsp;for&amp;nbsp;the&amp;nbsp;/var/folders/53/m5_nh66s4zqf0r36sgc3dyx40000gp/T/bundler20180711-1697-1vghnecgemoji-3.0.0/bin&amp;nbsp;directory.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ffd500&quot;&gt;An&amp;nbsp;error&amp;nbsp;occurred&amp;nbsp;while&amp;nbsp;installing&amp;nbsp;gemoji&amp;nbsp;(3.0.0),&amp;nbsp;and&amp;nbsp;Bundler&amp;nbsp;cannot&amp;nbsp;continue.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ffd500&quot;&gt;Make&amp;nbsp;sure&amp;nbsp;that&amp;nbsp;`gem&amp;nbsp;install&amp;nbsp;gemoji&amp;nbsp;-v&amp;nbsp;'&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;3.&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;0.&lt;/span&gt;0&lt;span style=&quot;color:#ffd500&quot;&gt;'&amp;nbsp;--source&amp;nbsp;'&lt;/span&gt;https:&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;/&lt;/span&gt;rubygems.org&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#ffd500&quot;&gt;'`&amp;nbsp;succeeds&amp;nbsp;before&amp;nbsp;bundling.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ffd500&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ffd500&quot;&gt;In&amp;nbsp;Gemfile:&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ffd500&quot;&gt;&amp;nbsp;&amp;nbsp;gemoji&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: rgb(79, 79, 79);&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(79, 79, 79); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;라며 permission error가 나타날 수도 있습니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#272727; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #4f4f4f&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#aaa; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;4&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;5&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;6&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;7&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;8&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;9&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;10&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#999999&quot;&gt;#&amp;nbsp;방법&amp;nbsp;1&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;$&amp;nbsp;gem&amp;nbsp;install&amp;nbsp;gemoji&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;v&amp;nbsp;&lt;span style=&quot;color:#ffd500&quot;&gt;'3.0.0'&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;source&amp;nbsp;&lt;span style=&quot;color:#ffd500&quot;&gt;'https://rubygems.org/'&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#999999&quot;&gt;#&amp;nbsp;방법&amp;nbsp;2&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;$&amp;nbsp;sudo&amp;nbsp;bundle&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;Don&lt;span style=&quot;color:#ffd500&quot;&gt;'t&amp;nbsp;run&amp;nbsp;Bundler&amp;nbsp;as&amp;nbsp;root.&amp;nbsp;Bundler&amp;nbsp;can&amp;nbsp;ask&amp;nbsp;for&amp;nbsp;sudo&amp;nbsp;if&amp;nbsp;it&amp;nbsp;is&amp;nbsp;needed,&amp;nbsp;and&amp;nbsp;installing&amp;nbsp;your&amp;nbsp;bundle&amp;nbsp;as&amp;nbsp;root&amp;nbsp;will&amp;nbsp;break&amp;nbsp;this&amp;nbsp;application&amp;nbsp;for&amp;nbsp;all&amp;nbsp;non-root&amp;nbsp;users&amp;nbsp;on&amp;nbsp;this&amp;nbsp;machine.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ffd500&quot;&gt;Fetching&amp;nbsp;gem&amp;nbsp;metadata&amp;nbsp;from&amp;nbsp;https://rubygems.org/...........&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ffd500&quot;&gt;...&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ffd500&quot;&gt;Bundle&amp;nbsp;complete!&amp;nbsp;3&amp;nbsp;Gemfile&amp;nbsp;dependencies,&amp;nbsp;29&amp;nbsp;gems&amp;nbsp;now&amp;nbsp;installed.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ffd500&quot;&gt;Use&amp;nbsp;`bundle&amp;nbsp;info&amp;nbsp;[gemname]`&amp;nbsp;to&amp;nbsp;see&amp;nbsp;where&amp;nbsp;a&amp;nbsp;bundled&amp;nbsp;gem&amp;nbsp;is&amp;nbsp;installed.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: rgb(79, 79, 79);&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(79, 79, 79); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;두 가지 방법으로 설치를 할 수 있습니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;두번째 방법은 경고가 뜨기 때문에 첫번째 방법을 추천합니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Tools</category>
      <category>jenkins</category>
      <category>tool</category>
      <category>젠킨스</category>
      <author>수노 SUNHO</author>
      <guid isPermaLink="true">https://sssunho.tistory.com/90</guid>
      <comments>https://sssunho.tistory.com/90#entry90comment</comments>
      <pubDate>Thu, 28 Mar 2019 09:00:00 +0900</pubDate>
    </item>
    <item>
      <title>[Jenkins] create slave node via SSH</title>
      <link>https://sssunho.tistory.com/89</link>
      <description>&lt;h2&gt;issue&lt;/h2&gt;
&lt;p&gt;젠킨스를 설치한 서버가 아닌 외부 서버를 대상으로 스케줄러를 돌리기&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p cid=&quot;n2&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block md-p md-focus&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.8em 0px; white-space: pre-wrap; width: inherit; position: relative; color: rgb(51, 51, 51); font-family: &amp;quot;Open Sans&amp;quot;, &amp;quot;Clear Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;md-plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;처음으로 스케줄러 작업을 해보았습니다.&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n3&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block md-p&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.8em 0px; white-space: pre-wrap; width: inherit; position: relative; color: rgb(51, 51, 51); font-family: &amp;quot;Open Sans&amp;quot;, &amp;quot;Clear Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16px;&quot;&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;md-plain md-expand&quot; style=&quot;box-sizing: border-box;&quot;&gt;jenkins, apache mesos, celery 등 여러 도구로 작업할 수 있는데, 그 중에서 젠킨스를 선택했습니다. 사수가 이것을 이용하고 있었던게 가장 큰 이유입니다.&lt;/span&gt;&lt;/p&gt;&lt;p cid=&quot;n4&quot; mdtype=&quot;paragraph&quot; class=&quot;md-end-block md-p&quot; style=&quot;box-sizing: border-box; orphans: 4; margin: 0.8em 0px; white-space: pre-wrap; width: inherit; position: relative; color: rgb(51, 51, 51); font-family: &amp;quot;Open Sans&amp;quot;, &amp;quot;Clear Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16px;&quot;&gt;&lt;span md-inline=&quot;link&quot; class=&quot; md-link&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;a spellcheck=&quot;false&quot; href=&quot;https://jenkins.io/&quot; style=&quot;box-sizing: border-box; cursor: pointer; color: rgb(65, 131, 196); -webkit-user-drag: none;&quot;&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;md-plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;젠킨스&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;md-plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;는 소프트웨어 개발 시 지속적 통합(continuous integration) 서비스를 제공하는 툴이라고 위키백과에서 알려줬어요. 마우스 클릭만으로도 등록할 수 있어 배우기 쉽고 간편하다는 장점이 있다고 합니다.&lt;/span&gt;&lt;span md-inline=&quot;softbreak&quot; class=&quot;md-softbreak&quot; style=&quot;box-sizing: border-box;&quot;&gt;
&lt;/span&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;md-plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;mesos는 코드로 작업해야하지만 기능은 더 많고, celery는 스케줄러로 등록할 내용을 API로 만들어서 몇분마다 요청하도록 하는 파이썬 패키지래요.&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span md-inline=&quot;plain&quot; class=&quot;md-plain&quot; style=&quot;box-sizing: border-box;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;process&lt;/h2&gt;
&lt;p&gt;jenkins에 slave node를 등록하려면, jenkins가 돌아가고 있는 서버에서 SSH 키를 만들어 slave node에 인증을 해줘야 한다.&lt;/p&gt;&lt;p&gt;그러므로 Jenkins  페이지에서도 작업을 해야하지만 양쪽 서버에서 다 작업을 해줘야합니다. &lt;/p&gt;&lt;p&gt;처음이라 많이 헤맸지만, 다시 헤매고 싶지 않아 이렇게 기록을 해둡니다. jenkins야 왜 한번에 안알려주냐!&lt;/p&gt;
&lt;br /&gt;
&lt;h3&gt;slave node server에 사용자 jenkins 추가&lt;/h3&gt;&lt;p&gt;1. slave node로 등록할 서버에 'jenkins'라는 사용자 만들어주기
스케줄러를 돌릴 때, 일반적으로, 스케줄러 돌릴 용도로 사용자를 만들어 준다고 합니다.&lt;/p&gt;&lt;div&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: rgb(240, 240, 240); overflow: auto; position: relative !important;&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace !important; margin: 0px; padding: 0px; border: none; background-color: rgb(39, 39, 39); border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #4f4f4f&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#aaa; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;sudo&amp;nbsp;adduser&amp;nbsp;jenkins&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(79, 79, 79); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; color: rgb(0, 0, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; color: rgb(0, 0, 0);&quot;&gt;2. 사용자 jenkins의 권한 권한 수정해주기&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;code style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;/code&gt;&lt;/p&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;overflow: auto; font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace !important; position: relative !important;&quot;&gt;&lt;p&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#272727; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #4f4f4f&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#aaa; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;vim&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;/&lt;/span&gt;etc&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;/&lt;/span&gt;sudoers&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(79, 79, 79); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;code style=&quot;color: rgb(0, 0, 0);&quot;&gt;&amp;nbsp;/etc/sudoers&lt;/code&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;들어갑니다.&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;overflow: auto; font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace !important; position: relative !important;&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#272727; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #4f4f4f&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#aaa; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#999999&quot;&gt;#&amp;nbsp;User&amp;nbsp;privilege&amp;nbsp;specification&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ALL&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;(ALL)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ALL&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;jenkins&amp;nbsp;ALL&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;(ALL)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NOPASSWD:&amp;nbsp;ALL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;#&amp;nbsp;이&amp;nbsp;줄을&amp;nbsp;추가해주세요&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(79, 79, 79); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;jenkins의 권한을 비밀번호 없이 접근 가능하도록 수정해줍니다.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;jenkins가 설치된 server에서 SSH Key 인증&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;1. jenkins(master) 서버에서 SSH 키 만들기&lt;/p&gt;&lt;p&gt;실제 jenkins가 돌아가고 있는 서버에 로그인해줍니다.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;비밀번호를 설정해주면 매번 비밀번호를 입력해야되는 수고로움이 있습니다.&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#272727; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #4f4f4f&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#aaa; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;ssh&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;keygen&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;t&amp;nbsp;rsa&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(79, 79, 79); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span style=&quot;color: rgb(0, 0, 0); font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;여러가지 질문이 나오는데 다 빈칸으로, 엔터를 그냥 계속 눌러주면 됩니다.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0); font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0); font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;2. slave 서버에 만든 SSH 키 인증하기&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;overflow: auto; position: relative !important;&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#272727; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #4f4f4f&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#aaa; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;4&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;5&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;6&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;$&amp;nbsp;ssh&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;copy&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;id&amp;nbsp;jenkins@`your&amp;nbsp;slave&amp;nbsp;server&amp;nbsp;ip&amp;nbsp;or&amp;nbsp;domain`&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;...&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;The&amp;nbsp;authenticity&amp;nbsp;of&amp;nbsp;host&amp;nbsp;&lt;span style=&quot;color:#ffd500&quot;&gt;'10.20.3.132&amp;nbsp;(10.20.3.132)'&lt;/span&gt;&amp;nbsp;can&lt;span style=&quot;color:#ffd500&quot;&gt;'t&amp;nbsp;be&amp;nbsp;established.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ffd500&quot;&gt;ECDSA&amp;nbsp;key&amp;nbsp;fingerprint&amp;nbsp;is&amp;nbsp;53:c2:32:63:12:a2:8f:29:25:40:fa:0a:b1:d4:8c:f4.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ffd500&quot;&gt;...&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ffd500&quot;&gt;Permission&amp;nbsp;denied&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: rgb(79, 79, 79);&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(79, 79, 79); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0); font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;우리가 이미 slave 서버에 jenkins를 만들었기 때문에 jenkins라는 서버에 인증을 해주는 것입니다.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0); font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;마지막에 'Permission denied'라고 떠서 실패한 것 같지만 잘 읽어보면 위에 &lt;/span&gt;&lt;code style=&quot;color: rgb(0, 0, 0);&quot;&gt;fingerprint&lt;/code&gt;&lt;span style=&quot;color: rgb(0, 0, 0); font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif;&quot;&gt;가 찍혔다고 메세지가 뜬 것을 확인할 수 있습니다. 제대로 등록된 것입니다.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;jenkins에 credentials, ssh private key 등록&lt;/h3&gt;
&lt;ol start=&quot;&quot;&gt;
&lt;li&gt;Jenkins에서, 왼쪽 바의 &lt;strong&gt;Credentials &amp;gt; Systems&lt;/strong&gt; 페이지 들어간다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Global credentials (unrestricted)&lt;/strong&gt; 클릭 왼쪽 메뉴바의 &lt;code&gt;Add Credentials&lt;/code&gt; 클릭&lt;/li&gt;
&lt;li&gt;아래와 같이 설정하고 SAVE&lt;/li&gt;

&lt;/ol&gt;
&lt;figure&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Kind&lt;/td&gt;&lt;td&gt;&lt;strong&gt;SSH Username with private key&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Scope&lt;/td&gt;&lt;td&gt;Global&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Username&lt;/td&gt;&lt;td&gt;접속할 서버의(slave node로 추가할) 사용자 이름 &lt;br /&gt;ex)ubuntu, sunho&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Private Key&lt;/td&gt;&lt;td&gt;Enter directly 선택 후, ssh 또는 pem 키를 텍스트 복사붙여넣기&lt;br /&gt;cat, vim을 통하여 키를 열면 텍스트로 보입니다.(아래 사진 참고)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;
&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;&lt;img src=&quot;/assets/img/jenkins/2018-07-12-01.png&quot; alt=&quot;ssh_key&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;slave node 등록&lt;/h3&gt;
&lt;ol start=&quot;&quot;&gt;
&lt;li&gt;왼쪽 바의** Jenkins 관리 &amp;gt; 노드 관리** 페이지 들어간다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;신규 노드&lt;/strong&gt; 클릭&lt;/li&gt;
&lt;li&gt;노드명 입력하고 &lt;code&gt;Permanent Agent&lt;/code&gt; 선택 후 OK&lt;/li&gt;
&lt;li&gt;아래값 설정하고 SAVE&lt;/li&gt;

&lt;/ol&gt;
&lt;figure&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Name&lt;/td&gt;&lt;td&gt;slave node 이름&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Description&lt;/td&gt;&lt;td&gt;(선택사항) 설명을 입력해주세요&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;# of  executors&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Remote root directory&lt;/td&gt;&lt;td&gt;credentials 등록할 때 입력한 Username의 기본 폴더&lt;br /&gt;credentials 등록한 SSH키 서버에 jenkins라는 사용자를 만드는 것을 추천합니다.&lt;br /&gt;ex) /home/jenkins&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Labels&lt;/td&gt;&lt;td&gt;닉네임 정도라고 생각하면 됩니다. item 등록할 때 필요합니다.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Usage&lt;/td&gt;&lt;td&gt;Use this node as much as possible&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Launch method&lt;/td&gt;&lt;td&gt;Launch slave agents via SSH (아래에서 자세히)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Availability&lt;/td&gt;&lt;td&gt;Keep this agent online as much as possible&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;
&lt;/table&gt;&lt;/figure&gt;
&lt;h4&gt;Launch method 설정&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Host:  domain 또는 ip 주소 입력&lt;/li&gt;
&lt;li&gt;Credentials:  위에서 등록한 것 선택&lt;/li&gt;
&lt;li&gt;Host Key Verification Strategy: Known hosts file Verification Strategy&lt;/li&gt;
&lt;li&gt;Port: &lt;em&gt;고급&lt;/em&gt; 버튼을 클릭하면 뜨는데, 기본은 22입니다. &lt;strong&gt;이 포트를 꼭 열어두세요.&lt;/strong&gt;&lt;/li&gt;

&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;Node Properties&lt;/code&gt; 는 필요하면 추가하세요.&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;new item 등록하기&lt;/h3&gt;
&lt;p&gt;이제 jenkins에 slave node까지 붙였으니, 드디어 제가 원하던 스케줄러 작업만 붙여주면 됩니다.&lt;/p&gt;
&lt;br /&gt;
&lt;h4&gt;jenkins에서 새로운 item 만들기&lt;/h4&gt;
&lt;ol start=&quot;&quot;&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;새로운 item&lt;/strong&gt; 클릭&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter an item name &amp;gt; &lt;strong&gt;Freestyle project&lt;/strong&gt;
존재하는 Item 중에 복사할 게 있다면 &lt;strong&gt;Copy from&lt;/strong&gt;으로 복사할 수 있습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;구성 설정하고 SAVE&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;설명: 협업하는 사람들을 위해 써주면 센스쟁이&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;General&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;오래된 빌드 삭제&lt;/strong&gt; 선택&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Strategy: Log Rotation&lt;/li&gt;
&lt;li&gt;보관할 최대갯수: 1000&lt;/li&gt;

&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;빌드 안함&lt;/strong&gt; 선택&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Restrict where this project can be run&lt;/strong&gt; 선택&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Label Expression: &lt;/p&gt;&lt;p&gt;등록한 slave node의 label 이름을 입력하면 됩니다. 자동완성 기능이 있으니 처음 몇자만 입력해주면 됩니다.&lt;/p&gt;
&lt;/li&gt;

&lt;/ul&gt;
&lt;/li&gt;

&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;소스 코드 관리: None&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;빌드 유발&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build periodically&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;원하는 시간마다 실행할 수 있습니다. &lt;a href=&quot;https://crontab.guru/&quot;&gt;crontab.guru&lt;/a&gt; 을 통하여 쉽게 원하는 값을 찾을 수 있습니다.&lt;/p&gt;
&lt;/li&gt;

&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;빌드 환경: 건너뜁니다&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Build&lt;/p&gt;&lt;p&gt;&lt;code&gt;Add build step&lt;/code&gt; 에서 다양한 옵션을 선택할 수 있는데, 저는 스크립트로 바로 실행할 것이기 때문에 &lt;code&gt;Execute shell&lt;/code&gt;을 선택했습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Execute shell: &lt;/p&gt;&lt;p&gt;쉘로 스크립트를 실행할 수 있습니다. &lt;/p&gt;&lt;p&gt;실행하는 위치는 설정한 node의 &lt;code&gt;/home/'node user name'/workspace/'item_name'&lt;/code&gt;입니다. &lt;/p&gt;
&lt;/li&gt;

&lt;/ul&gt;
&lt;/li&gt;

&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;빌드 후 조치: 건너뜁니다.&lt;/p&gt;
&lt;/li&gt;

&lt;/ul&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;br /&gt;
&lt;h4&gt;slave node에서 스케줄러 등록할 작업 만들기&lt;/h4&gt;
&lt;p&gt;스케줄러 돌릴 코드(작업)은 이미 만들어 두셨겠죠?&lt;/p&gt;&lt;p&gt;이 과정을 마지막에 하는 이유는, 작업을 원하는 임의의 위치에 둘 수도 있지만 jenkins가 돌아가는 위치에 둘 수도 있기 때문에 마지막으로 미뤘습니다.&lt;/p&gt;
&lt;ol start=&quot;&quot;&gt;
&lt;li&gt;&lt;p&gt;slave 서버의  jenkins로 로그인&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cd workspace/&lt;code&gt;jenkins에서 만든 item 이름&lt;/code&gt;에 스케줄러 돌릴 작업 만들기&lt;/p&gt;&lt;p&gt;굳이 이 아래에 두는 이유는 jenkins에서 어디로 이동할지나 권한에 대한 고민을 덜 수 있기 때문입니다.&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;br /&gt;
&lt;h2&gt;epilogue&lt;/h2&gt;
&lt;p&gt;이렇게 알면 간단하지만 험난한 jenkins에 slave node 등록하기 + item 추가하기 까지 해보았습니다.&lt;/p&gt;&lt;p&gt;jenkins가 한번 설정해두면 간단하지만 초기 세팅도 간단하진 않네요.&lt;/p&gt;&lt;p&gt;slave node를 등록하려면 jenkins 페이지뿐만 아니라 서버에서도 작업을 해줘야 합니다.&lt;/p&gt;&lt;p&gt;제 사수께서 직접 해봐야 알고, 언제까지 자기가 해줄 수 없으니 저에게 미션을 주셨는데.. 허허.. 힘들었지만 뿌듯하고 감사함을 느낄 수 있었습니다. 고마워요!&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;p&gt;참고:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://mohitgoyal.co/2017/02/14/add-linux-slave-node-in-the-jenkins/&quot;&gt;Add linux slave node in the Jenkins&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-install-java-with-apt-get-on-ubuntu-16-04&quot;&gt;How To Install Java with Apt-Get on Ubuntu 16.04&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Tools</category>
      <category>jenkins</category>
      <category>tool</category>
      <category>젠킨스</category>
      <author>수노 SUNHO</author>
      <guid isPermaLink="true">https://sssunho.tistory.com/89</guid>
      <comments>https://sssunho.tistory.com/89#entry89comment</comments>
      <pubDate>Wed, 27 Mar 2019 09:00:00 +0900</pubDate>
    </item>
    <item>
      <title>위쪽과 왼쪽에 곱하는 수가 있는 곱셈표(구구단) 출력하기</title>
      <link>https://sssunho.tistory.com/100</link>
      <description>&lt;h2&gt;Doit! 자료구조와 함께 배우는 알고리즘 입문 [자바편]&lt;/h2&gt;&lt;h3&gt;01장&amp;nbsp;기본 알고리즘&lt;/h3&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;연습문제 Q12&lt;/b&gt;&lt;/p&gt;&lt;p&gt;오른쪽과 같이 위쪽과 왼쪽에 곱하는 수가 있는 곱셈표를 출력하는 프로그램을 작성하세요.&lt;/p&gt;&lt;p&gt;(구분선은 수직선 기호(|), 마이너스 기호(-), 플러스 기호(+)를 사용하세요)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#fafafa; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #e5e5e5&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#666; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;4&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;5&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;6&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;7&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;8&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;9&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;10&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;11&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;|&amp;nbsp;1&amp;nbsp;&amp;nbsp;2&amp;nbsp;&amp;nbsp;3&amp;nbsp;&amp;nbsp;4&amp;nbsp;&amp;nbsp;5&amp;nbsp;&amp;nbsp;6&amp;nbsp;&amp;nbsp;7&amp;nbsp;&amp;nbsp;8&amp;nbsp;&amp;nbsp;9&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;-+---------------------------&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;1&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;2&amp;nbsp;&amp;nbsp;3&amp;nbsp;&amp;nbsp;4&amp;nbsp;&amp;nbsp;5&amp;nbsp;&amp;nbsp;6&amp;nbsp;&amp;nbsp;7&amp;nbsp;&amp;nbsp;8&amp;nbsp;&amp;nbsp;9&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;2&amp;nbsp;&amp;nbsp;2&amp;nbsp;&amp;nbsp;4&amp;nbsp;&amp;nbsp;6&amp;nbsp;&amp;nbsp;8&amp;nbsp;10&amp;nbsp;12&amp;nbsp;14&amp;nbsp;16&amp;nbsp;18&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;3&amp;nbsp;&amp;nbsp;3&amp;nbsp;&amp;nbsp;6&amp;nbsp;&amp;nbsp;9&amp;nbsp;12&amp;nbsp;15&amp;nbsp;18&amp;nbsp;21&amp;nbsp;24&amp;nbsp;27&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;4&amp;nbsp;&amp;nbsp;4&amp;nbsp;&amp;nbsp;8&amp;nbsp;12&amp;nbsp;16&amp;nbsp;20&amp;nbsp;24&amp;nbsp;28&amp;nbsp;32&amp;nbsp;36&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;5&amp;nbsp;&amp;nbsp;5&amp;nbsp;10&amp;nbsp;15&amp;nbsp;20&amp;nbsp;25&amp;nbsp;30&amp;nbsp;35&amp;nbsp;40&amp;nbsp;45&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;6&amp;nbsp;&amp;nbsp;6&amp;nbsp;12&amp;nbsp;18&amp;nbsp;24&amp;nbsp;30&amp;nbsp;36&amp;nbsp;42&amp;nbsp;48&amp;nbsp;54&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;7&amp;nbsp;&amp;nbsp;7&amp;nbsp;14&amp;nbsp;21&amp;nbsp;28&amp;nbsp;35&amp;nbsp;42&amp;nbsp;49&amp;nbsp;56&amp;nbsp;63&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;8&amp;nbsp;&amp;nbsp;8&amp;nbsp;16&amp;nbsp;24&amp;nbsp;32&amp;nbsp;40&amp;nbsp;48&amp;nbsp;56&amp;nbsp;64&amp;nbsp;72&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;9&amp;nbsp;&amp;nbsp;9&amp;nbsp;18&amp;nbsp;27&amp;nbsp;36&amp;nbsp;45&amp;nbsp;54&amp;nbsp;63&amp;nbsp;72&amp;nbsp;81&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(229, 229, 229); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;정답&lt;/h3&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#272727; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #4f4f4f&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#aaa; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;4&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;5&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;6&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;7&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;8&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;9&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;10&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;11&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;12&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;13&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;14&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;class&lt;/span&gt;&amp;nbsp;Mutilple99&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;void&lt;/span&gt;&amp;nbsp;main&amp;nbsp;(&lt;span style=&quot;color:#4be6fa&quot;&gt;String&lt;/span&gt;[]&amp;nbsp;args)&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#4be6fa&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color:#4be6fa&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color:#4be6fa&quot;&gt;println&lt;/span&gt;(&lt;span style=&quot;color:#ffd500&quot;&gt;&quot;&amp;nbsp;|&amp;nbsp;1&amp;nbsp;&amp;nbsp;2&amp;nbsp;&amp;nbsp;3&amp;nbsp;&amp;nbsp;4&amp;nbsp;&amp;nbsp;5&amp;nbsp;&amp;nbsp;6&amp;nbsp;&amp;nbsp;7&amp;nbsp;&amp;nbsp;8&amp;nbsp;&amp;nbsp;9&quot;&lt;/span&gt;);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#4be6fa&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color:#4be6fa&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color:#4be6fa&quot;&gt;println&lt;/span&gt;(&lt;span style=&quot;color:#ffd500&quot;&gt;&quot;-+---------------------------&quot;&lt;/span&gt;);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color:#4be6fa&quot;&gt;int&lt;/span&gt;&amp;nbsp;i&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;1&lt;/span&gt;;i&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;10&lt;/span&gt;;i&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;+&lt;/span&gt;)&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#4be6fa&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color:#4be6fa&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color:#4be6fa&quot;&gt;print&lt;/span&gt;(i);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color:#4be6fa&quot;&gt;int&lt;/span&gt;&amp;nbsp;j&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;1&lt;/span&gt;;j&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#c10aff&quot;&gt;10&lt;/span&gt;;j&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;+&lt;/span&gt;)&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#4be6fa&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color:#4be6fa&quot;&gt;out&lt;/span&gt;.printf(&lt;span style=&quot;color:#ffd500&quot;&gt;&quot;%3d&quot;&lt;/span&gt;,&amp;nbsp;i&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;*&lt;/span&gt;j);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#4be6fa&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color:#4be6fa&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color:#4be6fa&quot;&gt;println&lt;/span&gt;();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: rgb(79, 79, 79);&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(79, 79, 79); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;p&gt;Github:&amp;nbsp;&lt;a href=&quot;https://github.com/sssunho/algorithm/blob/master/doit/chap01/src/Mutilple99.java&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://github.com/sssunho/algorithm/blob/master/doit/chap01/src/Mutilple99.java&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Algorithm</category>
      <category>doit</category>
      <category>java</category>
      <category>구구단알고리즘</category>
      <category>구구단출력</category>
      <category>알고리즘</category>
      <author>수노 SUNHO</author>
      <guid isPermaLink="true">https://sssunho.tistory.com/100</guid>
      <comments>https://sssunho.tistory.com/100#entry100comment</comments>
      <pubDate>Tue, 26 Mar 2019 23:32:03 +0900</pubDate>
    </item>
  </channel>
</rss>