<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>mi_hyun.log</title>
        <link>https://velog.io/</link>
        <description>안녕하세여</description>
        <lastBuildDate>Mon, 20 May 2024 03:54:38 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>mi_hyun.log</title>
            <url>https://velog.velcdn.com/images/mi_hyun/profile/d8ffa371-bdbf-4c99-99c7-45ee27946644/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. mi_hyun.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/mi_hyun" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[독학으로 5일만에 토익 700 -> 800 달성 후기]]></title>
            <link>https://velog.io/@mi_hyun/%EB%8F%85%ED%95%99%EC%9C%BC%EB%A1%9C-5%EC%9D%BC%EB%A7%8C%EC%97%90-%ED%86%A0%EC%9D%B5-700-800-%EB%8B%AC%EC%84%B1-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@mi_hyun/%EB%8F%85%ED%95%99%EC%9C%BC%EB%A1%9C-5%EC%9D%BC%EB%A7%8C%EC%97%90-%ED%86%A0%EC%9D%B5-700-800-%EB%8B%AC%EC%84%B1-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Mon, 20 May 2024 03:54:38 GMT</pubDate>
            <description><![CDATA[<p>안녕하세요 오늘은 토익 독학 후기를 남기려고 합니다.
5일 정도 하루 3~4시간 공부하며 성적 올렸고,
나름 특이한(?) 순서로 문제를 풀어서 도움이 될 수도 있으니 올려보아용</p>
<h3 id="평소-영어-실력">평소 영어 실력</h3>
<p>2020 수능 2등급
한 달 토익 학원 다니고 700점 나옴..
영어 논문 종종 읽는 상태
듣기 잘 못함</p>
<h3 id="토익-rc-푸는-순서-꿀팁">토익 RC 푸는 순서 꿀팁</h3>
<p>part 5, 6, 7 순서대로 풀기는 합니다만,
part 7은 뒤에서부터 풀었어요.</p>
<p>왜냐하면 연습할 때도 그렇고, 시험장에서도 그렇고 
part 7을 풀다가 후반부로 갈 수록 너무 지치는 거에요.</p>
<p>지문은 길어지고, 시간은 적어져 심리적으로 부담이 됐기 때문에
<strong>triple</strong> 지문 -&gt; double 지문 -&gt; single 지문 순으로 풀었어요.
문제 번호로 치면 <strong>185~200</strong> -&gt; 175<del>184 -&gt; 145</del>174
triple 지문부터 풀면, 그 때는 집중력도 높아서 잘 풀리고, 이 때 눈도 빨라져서 앞 부분의 간단한 지문은 더 빨리 풀게 되더라고요.</p>
<h3 id="토익-rc-공부법">토익 RC 공부법</h3>
<p>저는 해커스 1000제 3로 공부했는데요.
모의고사 단위로 풀지 않았습니다. 
모의고사 10회가 있다면
part 5만 모아서 다 푸는 식으로 했어요.
part 5가 30문제니까 모의고사 10회분이면 300문제입니다.
이걸 2일에 걸쳐서 다 풀었어요.
그 다음은 part 6만 모아서 총 100문제 다 풀고,
그 다음에 part 7만 모아서 총 540문제 푸는 식으로 했습니다.
물론 part 7은 문제 수가 너무 많아서 3일로 잡았어요.</p>
<h3 id="토익-lc-공부법">토익 LC 공부법</h3>
<p>LC는 시험 2일 전에 교재를 사서 공부했는데요.
그래요 완전 벼락치기 했어요.
시간이 없어서 대화 흐름부터 파악하자 해서,
모의고사 1, 2회는 답지부터 펼쳐들었습니다.</p>
<p>part 1, 2는 이런식으로 훼이크를 치는구나?
part 3, 4는 스크립트를 읽으며 3문제 나오는 느낌? 흐름?을 파악했어요</p>
<p>그래서 모의고사 1, 2회는 답지와 같이 흐름을 파악했고,
이렇게 하니 문제 흐름은 다 보이더라고요.</p>
<p>시간이 없어서 한 행동이었는데 너무나 잘했다고 생각들어요.
그리고 모의고사 3, 4회만 실전처럼 풀고, 단어 정리 싹 하고 시험장에 들어갔습니다 ㅎㅎ</p>
<p>사실 LC 공부는 많이 부족했어요. 
그리고 해커스 모의고사 1000제 LC는 들으면 한 두지문 빼고는 다 들렸는데 시험장 LC는 훨씬 어렵더라고요? 
사설보다 실전이 체감상 2.5배는 더 어려웠습니다. 
다음 번에 또 토익 보면 LC는 더 어려운 사설 모의고사를 많이 듣고 가야할 것 같아요.</p>
<h3 id="시험장에서-문제-푸는-순서">시험장에서 문제 푸는 순서</h3>
<p>토익 LC에서 part 1, 2 도입부에 문제 설명하는 시간 있거든요, 그 때 part5를 많이 풀었습니다. 그리고 part 1, 2  시간에는 문제지가 필요 없어요. 바로 답안지에 체크하기 때문에 문제지는 아예 part 5를 펼쳐들고 풀었습니다. 
LC 시간에 part 5 두 페이지를 전부 풀었기 때문에 20문제는 푼 것 같아요.
그러면 나중에 part 7에 부을 시간이 존재하기 때문에 확실히 나아집니다.</p>
<p>LC part 3, 4 풀 때는 문제에만 집중하세요. 
스크립트 당 3지문 먼저 읽고, 듣기를 준비하는데에도 시간 부족합니다. </p>
<h3 id="후기">후기</h3>
<p>이번에는 학원도 안다니고, 제 멋대로, 공부하고, 풀었는데요.
학원 다닐 때보다 저의 성향에 맞게 문제를 푸니 페이스 맞추기도 더 좋고,
성적도 좋네요. 이왕 올린 김에 더 공부해서 900 넘기고 싶지만,
컴공에서 이정도면 괜찮을 것 같기도 하고,,
일단은 보류합니닷</p>
<p><img src="https://velog.velcdn.com/images/mi_hyun/post/81953428-4a43-4dbf-81f3-7597c53fcc23/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Google Cloud Monitoring Metric Guide보고 Naver Cloud Metric 구현하기]]></title>
            <link>https://velog.io/@mi_hyun/Google-Cloud-Monitoring-Metric-Guide%EB%B3%B4%EA%B3%A0-Naver-Cloud-Metric-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@mi_hyun/Google-Cloud-Monitoring-Metric-Guide%EB%B3%B4%EA%B3%A0-Naver-Cloud-Metric-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 14 May 2024 15:25:20 GMT</pubDate>
            <description><![CDATA[<p>google cloud 용어정리</p>
<h2 id="lables">Lables</h2>
<p>key-value pair로 구성되며, 데이터 값에 대한 정보를 제공하는데 사용된다.</p>
<p>Monitored-resource types과 Metric types에 대한 label이 각각 존재한다.</p>
<p>예시) &quot;버킷 이름 : 눈누나난나&quot; 이 자체가 label이라는 뜻</p>
<h2 id="components-of-the-metric-model">Components of the metric model</h2>
<ul>
<li><p>Monitored-resource types</p>
<pre><code>  bucket_name: bangeul
  project_id: 001233
  location: Seoul</code></pre></li>
</ul>
<ul>
<li>Metric types<pre><code>  response_code: OK
  method: read</code></pre></li>
<li>Time series : monitored-resource label에 따른 데이터를 시간별로 제시하는데 metric type label도 같이 제공해준다. 
즉 bucket:1234에 대한 데이터 값과 metric type을 제공한다.<pre><code class="language-python">  요약본)
  #resource type, metric type, data
  bucket:1234, response_code: OK, method:read, {(2, wed 2:00pm), (8, wed 2:05pm)}
  bucket:1234, response_code: FAIL, method:write, {(2, wed 2:01pm), (1, wed 2:04pm)}
  bucket:9908, response_code: OK, method:write, {(0, wed 2:01pm), (1, wed 2:04pm)}

</code></pre>
</li>
</ul>
<pre><code>원본)
{
  &quot;metric&quot;: {
    &quot;labels&quot;: {
      &quot;log&quot;: &quot;kubelet&quot;,
      &quot;severity&quot;: &quot;DEFAULT&quot;
    },
    &quot;type&quot;: &quot;logging.googleapis.com/log_entry_count&quot;
  },
  &quot;resource&quot;: {
    &quot;type&quot;: &quot;gce_instance&quot;,
    &quot;labels&quot;: {
      &quot;instance_id&quot;: &quot;5106847938295940291&quot;,
      &quot;zone&quot;: &quot;us-central1-a&quot;,
      &quot;project_id&quot;: &quot;a-gcp-project&quot;
    }
  },
  &quot;metricKind&quot;: &quot;DELTA&quot;,
  &quot;valueType&quot;: &quot;INT64&quot;,
  &quot;points&quot;: [
    {
      &quot;interval&quot;: {
        &quot;startTime&quot;: &quot;2019-12-20T20:25:38Z&quot;,
        &quot;endTime&quot;: &quot;2019-12-20T20:26:38Z&quot;
      },
      &quot;value&quot;: {
        &quot;int64Value&quot;: &quot;20&quot;
      }
    }
  ]
}</code></pre><h2 id="metirc-kinds-and-value-types">metirc kinds and value types</h2>
<p>metric타입을 다룰 때, metric kind와 value type을 다루게 된다.</p>
<ol>
<li><p>value type : 특정 시점에서의 데이터 타입</p>
<p> <code>BOOL</code>
 <code>INT64</code>
 <code>DOUBLE</code>
 <code>STRING</code></p>
</li>
</ol>
<pre><code>`DISTRIBUTION` 여러 값들이 그룹으로 묶여있을 때는 DISTRIBUTION을 사용하며 mean, count, max, and other statistics로 표현할 수 있다. 내가 주로 보는 타입이다.</code></pre><ol start="2">
<li><p>Metric kind : 특정 시점에서의 메트릭 종류로, 값들의 관계를 해석할 때 사용한다.</p>
<ul>
<li>gauge metric : cpu utilization, current temperature</li>
<li>delta metric : start time, end time</li>
<li>cumulative metric : sent bytes, total bytes</li>
</ul>
</li>
</ol>
<h2 id="google-cloud의-metric-list-가져오는-api">google cloud의 metric list 가져오는 api</h2>
<h4 id="metricdescriptor의-결과값"><strong>metricDescriptor의 결과값</strong></h4>
<pre><code class="language-python">{
  &quot;name&quot;: string,
  &quot;type&quot;: string,
  &quot;labels&quot;: [
    {
      object (LabelDescriptor)
    }
  ],
  &quot;metricKind&quot;: enum (MetricKind),
  &quot;valueType&quot;: enum (ValueType),
  &quot;unit&quot;: string,        #단위 %, s, h, d, M, k ...
  &quot;description&quot;: string,
  &quot;displayName&quot;: string,
  &quot;metadata&quot;: {
    object (MetricDescriptorMetadata)
  },
  &quot;launchStage&quot;: enum (LaunchStage),
  &quot;monitoredResourceTypes&quot;: [
    string
  ]
}</code></pre>
<h2 id="naver-cloud의-metric-list-가져오는-api-">naver cloud의 metric list 가져오는 api : </h2>
<h4 id="searchmetriclist-결과값"><strong>SearchMetricList 결과값</strong></h4>
<pre><code class="language-python">{
  &quot;metrics&quot;: [
    {
      &quot;desc&quot;: &quot;user ratio&quot;,        #그냥 메트릭에 대한 설명
      &quot;dimensions&quot;: [
        {
          &quot;dim&quot;: &quot;type&quot;,
          &quot;val&quot;: &quot;cpu&quot;
        },
        {
          &quot;dim&quot;: &quot;cpu_idx&quot;,
          &quot;val&quot;: &quot;0&quot;
        }
      ],
      &quot;idDimension&quot;: &quot;instanceNo&quot;,        #gcp의 key값
      &quot;metric&quot;: &quot;used_rto&quot;,        #메트릭 이름
      &quot;options&quot;: {
        &quot;Min1&quot;: [
          &quot;COUNT&quot;,
          &quot;SUM&quot;,
          &quot;MAX&quot;,
          &quot;MIN&quot;,
          &quot;AVG&quot;
        ],
        &quot;Min5&quot;: [
          &quot;COUNT&quot;,
          &quot;SUM&quot;,
          &quot;MAX&quot;,
          &quot;MIN&quot;,
          &quot;AVG&quot;
        ],
        &quot;Min30&quot;: [
          &quot;COUNT&quot;,
          &quot;SUM&quot;,
          &quot;MAX&quot;,
          &quot;MIN&quot;,
          &quot;AVG&quot;
        ],
        &quot;Hour2&quot;: [
          &quot;COUNT&quot;,
          &quot;SUM&quot;,
          &quot;MAX&quot;,
          &quot;MIN&quot;,
          &quot;AVG&quot;
        ],
        &quot;Day1&quot;: [
          &quot;COUNT&quot;,
          &quot;SUM&quot;,
          &quot;MAX&quot;,
          &quot;MIN&quot;,
          &quot;AVG&quot;
        ]
      },
      &quot;prodKey&quot;: &quot;xxxxxxxxxxxxxxxxxx&quot;,
      &quot;unit&quot;: &quot;%&quot;
    },
    {
      &quot;desc&quot;: &quot;user ratio&quot;,
      &quot;dimensions&quot;: [
        {
          &quot;dim&quot;: &quot;type&quot;,
          &quot;val&quot;: &quot;cpu&quot;
        },
        {
          &quot;dim&quot;: &quot;cpu_idx&quot;,
          &quot;val&quot;: &quot;1&quot;
        }
      ],
      &quot;idDimension&quot;: &quot;instanceNo&quot;,
      &quot;metric&quot;: &quot;used_rto&quot;,
      &quot;options&quot;: {
        &quot;Min1&quot;: [
          &quot;COUNT&quot;,
          &quot;SUM&quot;,
          &quot;MAX&quot;,
          &quot;MIN&quot;,
          &quot;AVG&quot;
        ],
        &quot;Min5&quot;: [
          &quot;COUNT&quot;,
          &quot;SUM&quot;,
          &quot;MAX&quot;,
          &quot;MIN&quot;,
          &quot;AVG&quot;
        ],
        &quot;Min30&quot;: [
          &quot;COUNT&quot;,
          &quot;SUM&quot;,
          &quot;MAX&quot;,
          &quot;MIN&quot;,
          &quot;AVG&quot;
        ],
        &quot;Hour2&quot;: [
          &quot;COUNT&quot;,
          &quot;SUM&quot;,
          &quot;MAX&quot;,
          &quot;MIN&quot;,
          &quot;AVG&quot;
        ],
        &quot;Day1&quot;: [
          &quot;COUNT&quot;,
          &quot;SUM&quot;,
          &quot;MAX&quot;,
          &quot;MIN&quot;,
          &quot;AVG&quot;
        ]
      },
      &quot;prodKey&quot;: &quot;xxxxxxxxxxxxxxxxxx&quot;,
      &quot;unit&quot;: &quot;%&quot;
    }
  ],
  &quot;prodKey&quot;: &quot;xxxxxxxxxxxxxxxxxx&quot;
}</code></pre>
<h4 id="구글---네이버-같은-의미-연결하기"><strong>구글 - 네이버 같은 의미 연결하기</strong></h4>
<p>key - idDimension (메트리 고유 식별자)</p>
<p>name - metric (메트릭 이름)</p>
<p>unit - unit    (단위)</p>
<p>metric_query - payload (입력값)</p>
<h2 id="cloudforet-google-cloud-monitoring의-list_metrics-코드-분석">cloudforet-google-cloud-monitoring의 list_metrics 코드 분석</h2>
<pre><code class="language-python">    def list_metrics(self, query):
        metrics_info = []

        if &#39;name&#39; in query:
            for metric_filter in query.get(&#39;filters&#39;, []):
                _query = {
                    &#39;name&#39;: query[&#39;name&#39;],
                    &#39;filter&#39;: self.set_metric_filter(metric_filter)
                }

                for gc_metric in self.list_metric_descriptors(_query):        #gc_metric은 dictionary형
                    metric_kind = gc_metric.get(&#39;metricKind&#39;, &#39;&#39;)    #&#39;GAUGE&#39; or &#39;DELTA&#39; or &#39;CUMULATIVE&#39;
                    value_type = gc_metric.get(&#39;valueType&#39;, &#39;&#39;)        #&#39;BOOL&#39; or &#39;INT64&#39; or &#39;DOUBLE&#39; or &#39;STRING&#39; or &#39;DISTRIBUTION&#39;
                    key = gc_metric.get(&#39;type&#39;, &#39;&#39;)        #&quot;type&quot;: &quot;gce_instance&quot;

                    if metric_kind in [&#39;DELTA&#39;, &#39;GAUGE&#39;] and value_type in [&#39;DOUBLE&#39;, &#39;INT64&#39;]:        #metric_kind와 value_type이 특정 조건을 만족하면 데이터 수집한다.
                        gc_metric_info = {
                            &#39;key&#39;: key,
                            &#39;name&#39;: gc_metric.get(&#39;displayName&#39;, &#39;&#39;),        #&quot;displayName&quot;: &quot;VM Instance&quot;
                            &#39;unit&#39;: self._get_metric_unit(gc_metric.get(&#39;unit&#39;)),
                            &#39;metric_query&#39;: {
                                &#39;name&#39;: query[&#39;name&#39;],
                                &#39;resource_id&#39;: query[&#39;resource_id&#39;],
                                &#39;filter&#39;: {
                                    &#39;metric_type&#39;: key,
                                    &#39;labels&#39;: metric_filter.get(&#39;labels&#39;)
                                }
                            }
                        }

                        metrics_info.append(gc_metric_info)

        return {&#39;metrics&#39;: metrics_info}</code></pre>
<h2 id="cloudforet-naver-cloud-monitioring의-list_metrics-코드-작성하기">cloudforet-naver-cloud-monitioring의 list_metrics 코드 작성하기</h2>
<p><img src="https://velog.velcdn.com/images/mi_hyun/post/c45e1d96-eca2-4325-a309-f011cb831ed5/image.png" alt="">헷갈리는 점이 있다면 spaceone에서는 connector를 구현할 때, init.py와 metric.py를 모두 사용한다.
init에서 api를 사용하여 연결하고, metric에서 클라우드포렛의 규격화된 데이터 형식에 맞게 변환한다고 생각하면 된다. 데이터가 잘 이동하는 지는 test_connector를 이용한다.
코드 보는 순서는 test-&gt;init-&gt;metric이라 생각하면 된다.</p>
<pre><code class="language-python">**test.py**

class TestNaverCloudConnector(unittest.TestCase):
    secret_data = {
        &#39;ncloud_access_key_id&#39;: AKI,
        &#39;ncloud_secret_key&#39;: SK,
    }
    @classmethod
    def setUpClass(cls):
        super().setUpClass()

    def test_list_metrics(self):
        options = {}
        payload = {
            &quot;prodKey&quot;: &quot;460438727509020672&quot;
        }
        secret_data = self.secret_data
        endpoint = &#39;/cw_fea/real/cw/api/rule/group/metric/search&#39;
        self.naver_cloud_connector = NaverCloudConnector(secret_data=secret_data)        #init으로 가서 connect

        self.naver_cloud_connector.set_connect({}, options=options, secret_data=secret_data, endpoint=endpoint, payload=payload)
        metrics_info = self.naver_cloud_connector.list_metrics(payload)        #init에서 metric으로 가는 부분

        print_data(metrics_info, &#39;test_list_metrics&#39;)        #최종적으로 원하는 규격으로 데이터 가공 성공
        #metrics_info [{&#39;key&#39;: &#39;instanceId&#39;, &#39;name&#39;: &#39;concurrent_session&#39;, &#39;unit&#39;: None, &#39;metric_query&#39;: {&#39;dimValues&#39;: [], &#39;query&#39;: [], &#39;dimensionsSelectedList&#39;: [], &#39;prodKey&#39;: &#39;460438727509020672&#39;}}, {&#39;key&#39;: &#39;instanceId&#39;, &#39;name&#39;: &#39;concurrent_session&#39;, &#39;unit&#39;: None, &#39;metric_query&#39;: {&#39;dimValues&#39;: [], &#39;query&#39;: [], &#39;dimensionsSelectedList&#39;: [], &#39;prodKey&#39;: &#39;460438727509020672&#39;}}, {&#39;key&#39;: &#39;instanceId&#39;, &#39;name&#39;: &#39;concurrent_session&#39;, &#39;unit&#39;: None, &#39;metric_query&#39;: {&#39;dimValues&#39;: [], &#39;query&#39;: [], &#39;dimensionsSelectedList&#39;: [], &#39;prodKey&#39;: &#39;460438727509020672&#39;}}, {&#39;key&#39;: &#39;instanceId&#39;, &#39;name&#39;: &#39;connections_per_second&#39;, &#39;unit&#39;: None, &#39;metric_query&#39;: {&#39;dimValues&#39;: [], &#39;query&#39;: [], &#39;dimensionsSelectedList&#39;: [], &#39;prodKey&#39;: &#39;460438727509020672&#39;}}, {&#39;key&#39;: &#39;instanceId&#39;, &#39;name&#39;: &#39;connections_per_second&#39;, &#39;unit&#39;: None, &#39;metric_query&#39;: {&#39;dimValues&#39;: [], &#39;query&#39;: [], &#39;dimensionsSelectedList&#39;: [], &#39;prodKey&#39;: &#39;460438727509020672&#39;}}, {&#39;key&#39;: &#39;instanceId&#39;, &#39;name&#39;: &#39;connections_per_second&#39;, &#39;unit&#39;: None, &#39;metric_query&#39;: {&#39;dimValues&#39;: [], &#39;query&#39;: [], &#39;dimensionsSelectedList&#39;: [], &#39;prodKey&#39;: &#39;460438727509020672&#39;}}, {&#39;key&#39;: &#39;instanceId&#39;, &#39;name&#39;: &#39;traffic_in_byte&#39;, &#39;unit&#39;: None, &#39;metric_query&#39;: {&#39;dimValues&#39;: [], &#39;query&#39;: [], &#39;dimensionsSelectedList&#39;: [], &#39;prodKey&#39;: &#39;460438727509020672&#39;}}, {&#39;key&#39;: &#39;instanceId&#39;, &#39;name&#39;: &#39;traffic_in_byte&#39;, &#39;unit&#39;: None, &#39;metric_query&#39;: {&#39;dimValues&#39;: [], &#39;query&#39;: [], &#39;dimensionsSelectedList&#39;: [], &#39;prodKey&#39;: &#39;460438727509020672&#39;}}, {&#39;key&#39;: &#39;instanceId&#39;, &#39;name&#39;: &#39;traffic_in_byte&#39;, &#39;unit&#39;: None, &#39;metric_query&#39;: {&#39;dimValues&#39;: [], &#39;query&#39;: [], &#39;dimensionsSelectedList&#39;: [], &#39;prodKey&#39;: &#39;460438727509020672&#39;}}, {&#39;key&#39;: &#39;instanceId&#39;, &#39;name&#39;: &#39;traffic_out_byte&#39;, &#39;unit&#39;: None, &#39;metric_query&#39;: {&#39;dimValues&#39;: [], &#39;query&#39;: [], &#39;dimensionsSelectedList&#39;: [], &#39;prodKey&#39;: &#39;460438727509020672&#39;}}, {&#39;key&#39;: &#39;instanceId&#39;, &#39;name&#39;: &#39;traffic_out_byte&#39;, &#39;unit&#39;: None, &#39;metric_query&#39;: {&#39;dimValues&#39;: [], &#39;query&#39;: [], &#39;dimensionsSelectedList&#39;: [], &#39;prodKey&#39;: &#39;460438727509020672&#39;}}, {&#39;key&#39;: &#39;instanceId&#39;, &#39;name&#39;: &#39;traffic_out_byte&#39;, &#39;unit&#39;: None, &#39;metric_query&#39;: {&#39;dimValues&#39;: [], &#39;query&#39;: [], &#39;dimensionsSelectedList&#39;: [], &#39;prodKey&#39;: &#39;460438727509020672&#39;}}]

</code></pre>
<pre><code class="language-python">**__init__.py**

class NaverCloudConnector(BaseConnector):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.client = None
        self.base_url = &#39;https://cw.apigw.ntruss.com&#39;

    def make_signature(self, access_key, secret_key, method, uri, timestamp):
        message = method + &quot; &quot; + uri + &quot;\n&quot; + timestamp + &quot;\n&quot; + access_key
        message = bytes(message, &#39;UTF-8&#39;)
        secret_key = bytes(secret_key, &#39;UTF-8&#39;)
        signingKey = base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())
        return signingKey.decode()

    def set_connect(self, schema, options: dict, secret_data: dict, endpoint, payload):
        self.url = f&quot;{self.base_url}{endpoint}&quot;
        self.endpoint = endpoint
        method = &#39;POST&#39;
        timestamp = str(int(time.time() * 1000))
        metric_access_key = secret_data[&#39;ncloud_access_key_id&#39;]
        metric_secret_key = secret_data[&#39;ncloud_secret_key&#39;]

        headers = {
            &#39;x-ncp-apigw-signature-v2&#39;: self.make_signature(metric_access_key, metric_secret_key, method,
                                                       endpoint,
                                                       timestamp),
            &#39;x-ncp-apigw-timestamp&#39;: timestamp,
            &#39;x-ncp-iam-access-key&#39;: metric_access_key,
            &#39;Content-Type&#39;: &#39;application/json&#39;
        }
        if options is None:
            options = {}

        self.client = requests.post(self.url, headers=headers, json=payload).json()

    def list_metrics(self, *args):        #payload가 인자
        return NaverCloudMetric(self.client, self.url).list_metrics(*args)        #init에서 metric으로 가는 부분
</code></pre>
<pre><code class="language-python">**metric.py**

class NaverCloudMetric(object):
    def __init__(self, client, url):
        self.client = client
        self.url = url

    def list_metrics(self, payload):        #cloudforet에 저장된 데이터값 형태를 최대한 따르기 위해 metric_info 딕셔너리를 생성
        metrics_info = []
        for metric in self.client[&#39;metrics&#39;]:
            metric_info = {
                &#39;key&#39;: metric.get(&#39;idDimension&#39;),
                &#39;name&#39;: metric.get(&#39;metric&#39;),
                &#39;unit&#39;: metric.get(&#39;unit&#39;),
                &#39;metric_query&#39;: {
                    &#39;dimValues&#39;: payload.get(&#39;dimValues&#39;, []),
                    &#39;query&#39;: payload.get(&#39;query&#39;, []),
                    &#39;dimensionsSelectedList&#39;: payload.get(&#39;dimensionsSelectedList&#39;, []),
                    &#39;prodKey&#39;: payload[&#39;prodKey&#39;]
                }
            }
            metrics_info.append(metric_info)
        return {&#39;metrics&#39;: metrics_info}        #이렇게 반환된 값은 다시 metric-&gt;init-&gt;test로 가서 metrics_info 형태로 저장 완료</code></pre>
<p>Reference) 
<a href="https://cloud.google.com/monitoring/api/v3/metric-model#generic-label-info">google cloud documentation</a>
[google cloud metricDescriptor api] (<a href="https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors#MetricDescriptor">https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors#MetricDescriptor</a>)
[naver cloud search metric list api] (<a href="https://api.ncloud-docs.com/docs/management-cloudinsight-searchmetriclist">https://api.ncloud-docs.com/docs/management-cloudinsight-searchmetriclist</a>)
<a href="https://github.com/cloudforet-io/plugin-google-stackdriver-mon-datasource">plugin-google-stackdriver-mon-datasource
</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TOEIC LC 단어 & 문구 정리]]></title>
            <link>https://velog.io/@mi_hyun/TOEIC-LC-%EB%8B%A8%EC%96%B4-%EB%AC%B8%EA%B5%AC-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@mi_hyun/TOEIC-LC-%EB%8B%A8%EC%96%B4-%EB%AC%B8%EA%B5%AC-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Thu, 25 Apr 2024 13:21:57 GMT</pubDate>
            <description><![CDATA[<table>
<thead>
<tr>
<th align="center">영어</th>
<th align="center">한국어</th>
</tr>
</thead>
<tbody><tr>
<td align="center">filing a complaint</td>
<td align="center">민원 제고</td>
</tr>
<tr>
<td align="center">praise</td>
<td align="center">칭찬하다</td>
</tr>
<tr>
<td align="center">appraisal</td>
<td align="center">평가, 감정</td>
</tr>
<tr>
<td align="center">file</td>
<td align="center">보관하다, (소송 등을)제기하다</td>
</tr>
<tr>
<td align="center">apprasie</td>
<td align="center">평가하다, 자세히 살펴보다</td>
</tr>
<tr>
<td align="center">landscaper</td>
<td align="center">조경사</td>
</tr>
<tr>
<td align="center">toll</td>
<td align="center">통행료</td>
</tr>
<tr>
<td align="center">road</td>
<td align="center">도로</td>
</tr>
<tr>
<td align="center">power failure</td>
<td align="center">정전</td>
</tr>
<tr>
<td align="center">ladder</td>
<td align="center">사다리</td>
</tr>
<tr>
<td align="center">rope</td>
<td align="center">밧줄</td>
</tr>
<tr>
<td align="center">step stool</td>
<td align="center">계단식 의자</td>
</tr>
<tr>
<td align="center">in a corner</td>
<td align="center">구석</td>
</tr>
<tr>
<td align="center">reach</td>
<td align="center">(손이나 팔을) 뻗다</td>
</tr>
<tr>
<td align="center">line up</td>
<td align="center">일렬로</td>
</tr>
<tr>
<td align="center">dock, pier</td>
<td align="center">부두</td>
</tr>
<tr>
<td align="center">deck</td>
<td align="center">(여러 층으로 되어 있는 배의) 갑판</td>
</tr>
<tr>
<td align="center">ceiling</td>
<td align="center">천장</td>
</tr>
<tr>
<td align="center">linen</td>
<td align="center">린넨(천)</td>
</tr>
<tr>
<td align="center">on the floor</td>
<td align="center">바닥에</td>
</tr>
<tr>
<td align="center">nightstand</td>
<td align="center">침실용 협탁</td>
</tr>
<tr>
<td align="center">locally grown</td>
<td align="center">지역에서 재배된</td>
</tr>
<tr>
<td align="center">prescription refill</td>
<td align="center">기존 처방전대로 처방하는 것</td>
</tr>
<tr>
<td align="center">shipment</td>
<td align="center">수송품</td>
</tr>
<tr>
<td align="center">storage room</td>
<td align="center">창고</td>
</tr>
<tr>
<td align="center">loudspeaker</td>
<td align="center">확성기</td>
</tr>
<tr>
<td align="center">microphone</td>
<td align="center">마이크</td>
</tr>
<tr>
<td align="center">webinar</td>
<td align="center">웹 세미나</td>
</tr>
<tr>
<td align="center">knob</td>
<td align="center">손잡이</td>
</tr>
<tr>
<td align="center">screw</td>
<td align="center">나사</td>
</tr>
<tr>
<td align="center">dine out</td>
<td align="center">식사하다</td>
</tr>
<tr>
<td align="center">estimate</td>
<td align="center">견적서</td>
</tr>
<tr>
<td align="center">got off</td>
<td align="center">(전화를) 끊다</td>
</tr>
<tr>
<td align="center">on behalf of</td>
<td align="center">~을 대표하여</td>
</tr>
<tr>
<td align="center">fortunate</td>
<td align="center">다행인, 운이 좋은</td>
</tr>
<tr>
<td align="center">seasoned</td>
<td align="center">노련한</td>
</tr>
<tr>
<td align="center">staircase</td>
<td align="center">계단</td>
</tr>
<tr>
<td align="center">bookshelf</td>
<td align="center">책장</td>
</tr>
<tr>
<td align="center">stroll</td>
<td align="center">거닐다, 산책하다</td>
</tr>
<tr>
<td align="center">walkway</td>
<td align="center">보도</td>
</tr>
<tr>
<td align="center">suitcase</td>
<td align="center">여행가방</td>
</tr>
<tr>
<td align="center">pole</td>
<td align="center">기둥, 막대기</td>
</tr>
<tr>
<td align="center">bulletin board</td>
<td align="center">게시판</td>
</tr>
<tr>
<td align="center">pot</td>
<td align="center">냄비</td>
</tr>
<tr>
<td align="center">reimburse</td>
<td align="center">환급하다, 배상하다</td>
</tr>
<tr>
<td align="center">turnout</td>
<td align="center">참가자 수</td>
</tr>
<tr>
<td align="center">hand out</td>
<td align="center">~을 나눠주다</td>
</tr>
<tr>
<td align="center">On a scale of one to ten</td>
<td align="center">1부터 10까지의 척도로</td>
</tr>
<tr>
<td align="center">fade</td>
<td align="center">(색이)바래다</td>
</tr>
<tr>
<td align="center">crack</td>
<td align="center">균열</td>
</tr>
<tr>
<td align="center">rope off</td>
<td align="center">~을 밧줄로 돌려막다</td>
</tr>
<tr>
<td align="center">roll out</td>
<td align="center">~을 시작하다</td>
</tr>
<tr>
<td align="center">down time</td>
<td align="center">가동 중단 시간</td>
</tr>
<tr>
<td align="center">malfunction</td>
<td align="center">오작동하다</td>
</tr>
<tr>
<td align="center">top-of-the-line</td>
<td align="center">최고급의</td>
</tr>
<tr>
<td align="center">outsource</td>
<td align="center">외부에 위탁하다</td>
</tr>
<tr>
<td align="center">in-house</td>
<td align="center">시내의</td>
</tr>
</tbody></table>
<hr>
<p>part 7, 8 정리 완료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TOEIC part7 단어 정리]]></title>
            <link>https://velog.io/@mi_hyun/TOEIC-part7-%EB%8B%A8%EC%96%B4-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@mi_hyun/TOEIC-part7-%EB%8B%A8%EC%96%B4-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Thu, 25 Apr 2024 12:27:43 GMT</pubDate>
            <description><![CDATA[<table>
<thead>
<tr>
<th align="center">영어</th>
<th align="center">한국어</th>
</tr>
</thead>
<tbody><tr>
<td align="center">keep A posted</td>
<td align="center">A가 정보를 계속 알도록</td>
</tr>
<tr>
<td align="center">venue</td>
<td align="center">장소</td>
</tr>
<tr>
<td align="center">receipt</td>
<td align="center">수령</td>
</tr>
<tr>
<td align="center">contact information</td>
<td align="center">연락처</td>
</tr>
<tr>
<td align="center">corporate</td>
<td align="center">기업의</td>
</tr>
<tr>
<td align="center">craft</td>
<td align="center">공들여 만들다</td>
</tr>
<tr>
<td align="center">itinerary</td>
<td align="center">여행 계획</td>
</tr>
<tr>
<td align="center">arrangement</td>
<td align="center">준비, (처리)방식, 합의</td>
</tr>
<tr>
<td align="center">conference call</td>
<td align="center">전화 회의</td>
</tr>
<tr>
<td align="center">furnish</td>
<td align="center">(가구를)비치하다</td>
</tr>
<tr>
<td align="center">be on the horizon</td>
<td align="center">본격화되다, 곧 일어날 듯 하다</td>
</tr>
<tr>
<td align="center">headquarter</td>
<td align="center">본부를 설치하다</td>
</tr>
<tr>
<td align="center">headquarters</td>
<td align="center">본사, 본사 직원들</td>
</tr>
<tr>
<td align="center">hospitality</td>
<td align="center">환영</td>
</tr>
<tr>
<td align="center">balance</td>
<td align="center">잔고</td>
</tr>
<tr>
<td align="center">locate</td>
<td align="center">~의 정확한 위치를 찾다</td>
</tr>
<tr>
<td align="center">loan</td>
<td align="center">빌리다, 대출</td>
</tr>
<tr>
<td align="center">assortment</td>
<td align="center">모음, 종합</td>
</tr>
<tr>
<td align="center">house</td>
<td align="center">소장하다</td>
</tr>
<tr>
<td align="center">venture</td>
<td align="center">모험하다</td>
</tr>
<tr>
<td align="center">complimentary</td>
<td align="center">무료의</td>
</tr>
<tr>
<td align="center">redeem</td>
<td align="center">교환하다</td>
</tr>
<tr>
<td align="center">voucher</td>
<td align="center">현금 쿠폰?</td>
</tr>
<tr>
<td align="center">rollout</td>
<td align="center">출시</td>
</tr>
<tr>
<td align="center">navigate</td>
<td align="center">돌아다니다</td>
</tr>
<tr>
<td align="center">regional carrier</td>
<td align="center">지역 항공사</td>
</tr>
<tr>
<td align="center">institute</td>
<td align="center">기관, (제도·정책 등을) 도입하다, (절차를) 시작하다</td>
</tr>
<tr>
<td align="center">parking lot</td>
<td align="center">주차장 전체</td>
</tr>
<tr>
<td align="center">lease</td>
<td align="center">임대하다, 임대차 계약</td>
</tr>
</tbody></table>
<hr>
<p>part 3만 정리 완료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[CETI Project]]></title>
            <link>https://velog.io/@mi_hyun/CETI-Project</link>
            <guid>https://velog.io/@mi_hyun/CETI-Project</guid>
            <pubDate>Thu, 18 Apr 2024 14:44:36 GMT</pubDate>
            <description><![CDATA[<p>동물이랑 인공지능 같이 할 수 있는게 없나 찾아보다가 어마어마한 걸 발견했다.
바로 CETI Project이다.
향유 고래의 언어를 머신러닝으로 풀어보자는 아이디어다.
내가 대학교 입시 당시 꿈 꿨던 동물 행동학자의 삶과 인공지능 연구가 결합된 미친 프로젝트이다. 
내가 자소서를 꾸리고 작성했던 주된 내용이 
&quot;코끼리 고양이 원숭이 등 각각 다른 동물의 시야로 세상을 바라보면 더 넓은 세상을 만날 수 있을 것이다.&quot; 
당시에는 너무 추상적이다라고 생각이 되었지만 하고 싶었고, 어떻게 할지는 몰랐었다. 
그래서 그 꿈을 멀리 하였는데..
세상에나 CETI 프로젝트가 바로 이러한 일을 하는 곳이다!!!
내가 과연 할 수 있는 일인지 차근히 기사들과 관계자들이 작성한 글을 읽었다. </p>
<ul>
<li><a href="https://ig.ft.com/ai-animals/">https://ig.ft.com/ai-animals/</a></li>
<li><a href="https://www.radcliffe.harvard.edu/news-and-ideas/episode-109-using-machine-learning-to-listen-to-whales">https://www.radcliffe.harvard.edu/news-and-ideas/episode-109-using-machine-learning-to-listen-to-whales</a></li>
<li><a href="https://drive.google.com/file/d/1IG5Wh7T2ExDgBH1rW8rOI7haVbUobQqA/view">https://drive.google.com/file/d/1IG5Wh7T2ExDgBH1rW8rOI7haVbUobQqA/view</a></li>
</ul>
<p>글을 읽을 수록 가슴이 두근두근거린다.
아래는 하나하나 차근히 읽으며 정리해 볼 기사 &amp; 논문들이다.</p>
<hr>
<ul>
<li><p><input disabled="" type="checkbox">  <a href="https://www.projectceti.org/news-research-insights#publications">https://www.projectceti.org/news-research-insights#publications</a>
이 사이트에서 세티 논문들 하나하나 다 읽어봐야 겠다.</p>
</li>
<li><p><input disabled="" type="checkbox">  <a href="https://assets-global.website-files.com/630ea9b1fcc91e6ca07956a2/64d64835900750b4b989714d_science.adg7314.pdf">https://assets-global.website-files.com/630ea9b1fcc91e6ca07956a2/64d64835900750b4b989714d_science.adg7314.pdf</a>
이건 머신러닝 사용해서 동물 언어 해석하는 기사</p>
</li>
<li><p><input disabled="" type="checkbox">  <a href="https://github.com/earthspecies/BEBE">https://github.com/earthspecies/BEBE</a>
동물 다룬 깃허브</p>
</li>
<li><p><input disabled="" type="checkbox">  그 ceti git 도 있었는데 그것도 보기<img src="https://velog.velcdn.com/images/mi_hyun/post/d8f6a5ad-3760-4492-9057-a329e35b4b9e/image.png" alt=""></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[TOEIC part 6 단어 정리]]></title>
            <link>https://velog.io/@mi_hyun/TOEIC-part-6-%EB%8B%A8%EC%96%B4-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@mi_hyun/TOEIC-part-6-%EB%8B%A8%EC%96%B4-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Thu, 18 Apr 2024 14:03:27 GMT</pubDate>
            <description><![CDATA[<table>
<thead>
<tr>
<th align="center">영어</th>
<th align="center">한국어</th>
</tr>
</thead>
<tbody><tr>
<td align="center">stakeholder</td>
<td align="center">이해관계자</td>
</tr>
<tr>
<td align="center">fiscal</td>
<td align="center">회계의</td>
</tr>
<tr>
<td align="center">affordable</td>
<td align="center">감당할 수 있는, 가격이 알맞은</td>
</tr>
<tr>
<td align="center">participating attractions</td>
<td align="center">참여 명소</td>
</tr>
<tr>
<td align="center">in the meantime</td>
<td align="center">한편으로 그동안에</td>
</tr>
<tr>
<td align="center">recipient</td>
<td align="center">수령인</td>
</tr>
<tr>
<td align="center">function as p.p</td>
<td align="center">~된 상태로 작동하다</td>
</tr>
<tr>
<td align="center">under construction</td>
<td align="center">공사 중인</td>
</tr>
<tr>
<td align="center">sustain</td>
<td align="center">(피해 등을) 입다, 유지하다</td>
</tr>
<tr>
<td align="center">botanical</td>
<td align="center">식물의</td>
</tr>
<tr>
<td align="center">turn out</td>
<td align="center">(제품을) 생산하다</td>
</tr>
<tr>
<td align="center">varietal</td>
<td align="center">변종의, 품종</td>
</tr>
<tr>
<td align="center">less than</td>
<td align="center">덜</td>
</tr>
<tr>
<td align="center">routine maintenance</td>
<td align="center">정기 관리</td>
</tr>
<tr>
<td align="center">up-to-date</td>
<td align="center">최신 정보</td>
</tr>
<tr>
<td align="center">necessary permit</td>
<td align="center">필수 허가증</td>
</tr>
<tr>
<td align="center">persistent</td>
<td align="center">고집하는, 지속적인</td>
</tr>
<tr>
<td align="center">utility stock</td>
<td align="center">공익사업 주식</td>
</tr>
<tr>
<td align="center">assistance with</td>
<td align="center">assistance in</td>
</tr>
<tr>
<td align="center">~arium</td>
<td align="center">~에 관련된 장소</td>
</tr>
<tr>
<td align="center">accountant</td>
<td align="center">회계사</td>
</tr>
<tr>
<td align="center">candid</td>
<td align="center">솔직한</td>
</tr>
<tr>
<td align="center">doorstep</td>
<td align="center">집 앞</td>
</tr>
<tr>
<td align="center">fare</td>
<td align="center">음식, 교통 요금, 택시 승객</td>
</tr>
<tr>
<td align="center">in person</td>
<td align="center">직접</td>
</tr>
<tr>
<td align="center">legal</td>
<td align="center">법률과 관련된</td>
</tr>
<tr>
<td align="center">ample</td>
<td align="center">충분한</td>
</tr>
<tr>
<td align="center">fund</td>
<td align="center">자금을 대다</td>
</tr>
<tr>
<td align="center">modular</td>
<td align="center">조립식의</td>
</tr>
<tr>
<td align="center">forthcoming</td>
<td align="center">다가오는</td>
</tr>
<tr>
<td align="center">hollow</td>
<td align="center">(속이)빈</td>
</tr>
<tr>
<td align="center">in-store</td>
<td align="center">매장 내의</td>
</tr>
<tr>
<td align="center">assemble</td>
<td align="center">모으다, 조립하다</td>
</tr>
<tr>
<td align="center">initiative</td>
<td align="center">계획, 진취성, 주도권</td>
</tr>
<tr>
<td align="center">detail</td>
<td align="center">세부사항, 상세히 알리다</td>
</tr>
<tr>
<td align="center">sales transaction</td>
<td align="center">판매 거래</td>
</tr>
<tr>
<td align="center">a fully equipped</td>
<td align="center">각종 시설을 갖춘</td>
</tr>
<tr>
<td align="center">unassuming</td>
<td align="center">겸손한, 소박한</td>
</tr>
<tr>
<td align="center">bustling</td>
<td align="center">부산한</td>
</tr>
<tr>
<td align="center">business district</td>
<td align="center">업무 지구(회사가 모인곳)</td>
</tr>
<tr>
<td align="center">refer to</td>
<td align="center">참조하다</td>
</tr>
<tr>
<td align="center">___</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">part 3 ~ 10까지 단어 정리 완료</td>
<td align="center"></td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[TOEIC part 5 단어 정리]]></title>
            <link>https://velog.io/@mi_hyun/TOEIC-part-5-%EB%8B%A8%EC%96%B4-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@mi_hyun/TOEIC-part-5-%EB%8B%A8%EC%96%B4-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Wed, 17 Apr 2024 07:07:13 GMT</pubDate>
            <description><![CDATA[<table>
<thead>
<tr>
<th align="center">영어</th>
<th align="center">한국어</th>
</tr>
</thead>
<tbody><tr>
<td align="center">expediate</td>
<td align="center">신속히 처리하다</td>
</tr>
<tr>
<td align="center">novice</td>
<td align="center">초급자</td>
</tr>
<tr>
<td align="center">expenditure</td>
<td align="center">지출</td>
</tr>
<tr>
<td align="center">expedition</td>
<td align="center">탐험</td>
</tr>
<tr>
<td align="center">pool</td>
<td align="center">웅덩이, 모으다</td>
</tr>
<tr>
<td align="center">broker</td>
<td align="center">중개인, 중개하다</td>
</tr>
<tr>
<td align="center">stove</td>
<td align="center">난로</td>
</tr>
<tr>
<td align="center">promotional flyer</td>
<td align="center">홍보 책자</td>
</tr>
<tr>
<td align="center">above all</td>
<td align="center">특히 무엇보다도</td>
</tr>
<tr>
<td align="center">share options</td>
<td align="center">스톡옵션(주식 매입권)</td>
</tr>
<tr>
<td align="center">scheduled</td>
<td align="center">예정된</td>
</tr>
<tr>
<td align="center">Compliance Department</td>
<td align="center">감사부</td>
</tr>
<tr>
<td align="center">regulatory</td>
<td align="center">규제의</td>
</tr>
<tr>
<td align="center">Reality</td>
<td align="center">부동산</td>
</tr>
<tr>
<td align="center">property</td>
<td align="center">부동산, 건물</td>
</tr>
<tr>
<td align="center">aerial</td>
<td align="center">항공의</td>
</tr>
<tr>
<td align="center">hygienist</td>
<td align="center">위생사</td>
</tr>
<tr>
<td align="center">spin</td>
<td align="center">제자리 도는 거</td>
</tr>
<tr>
<td align="center">circle</td>
<td align="center">원을 그리며 도는거</td>
</tr>
<tr>
<td align="center">roll</td>
<td align="center">굴리는 느낌</td>
</tr>
<tr>
<td align="center">patent</td>
<td align="center">특허권</td>
</tr>
<tr>
<td align="center">application</td>
<td align="center">신청</td>
</tr>
<tr>
<td align="center">appliance</td>
<td align="center">기기</td>
</tr>
<tr>
<td align="center">office supplies</td>
<td align="center">사무 용품</td>
</tr>
<tr>
<td align="center">time off</td>
<td align="center">휴가</td>
</tr>
<tr>
<td align="center">burst</td>
<td align="center">터지다</td>
</tr>
<tr>
<td align="center">fasten</td>
<td align="center">매다, 고정하다</td>
</tr>
<tr>
<td align="center">associate</td>
<td align="center">직원, 동료</td>
</tr>
<tr>
<td align="center">Revenue</td>
<td align="center">수익</td>
</tr>
<tr>
<td align="center">record profits</td>
<td align="center">기록적인 수익</td>
</tr>
<tr>
<td align="center">stock price</td>
<td align="center">주가</td>
</tr>
<tr>
<td align="center">promptly</td>
<td align="center">정확하게 제 시간에, 신속하게</td>
</tr>
<tr>
<td align="center">revise</td>
<td align="center">변경하다, 수정하다</td>
</tr>
<tr>
<td align="center">acclaim</td>
<td align="center">칭찬하다</td>
</tr>
<tr>
<td align="center">require</td>
<td align="center">요구하다, 필요로 하다</td>
</tr>
<tr>
<td align="center">acquire</td>
<td align="center">획득하다</td>
</tr>
<tr>
<td align="center">detail</td>
<td align="center">상세히 알리다</td>
</tr>
<tr>
<td align="center">vendor</td>
<td align="center">판매업체</td>
</tr>
<tr>
<td align="center">reassure</td>
<td align="center">안심시키다</td>
</tr>
<tr>
<td align="center">entrees</td>
<td align="center">메인요리</td>
</tr>
<tr>
<td align="center">instrument</td>
<td align="center">기구, 악기</td>
</tr>
<tr>
<td align="center">physician</td>
<td align="center">의사</td>
</tr>
<tr>
<td align="center">attending physician</td>
<td align="center">주치의</td>
</tr>
<tr>
<td align="center">on a regular basis</td>
<td align="center">정기적으로</td>
</tr>
<tr>
<td align="center">foggy</td>
<td align="center">안개가 낀</td>
</tr>
<tr>
<td align="center">fogger</td>
<td align="center">분무기</td>
</tr>
<tr>
<td align="center">checkup</td>
<td align="center">검사</td>
</tr>
<tr>
<td align="center">fill</td>
<td align="center">이행하다</td>
</tr>
<tr>
<td align="center">besides</td>
<td align="center">~이외에도(전치사)</td>
</tr>
<tr>
<td align="center">sensibly</td>
<td align="center">합리적으로</td>
</tr>
<tr>
<td align="center">closely</td>
<td align="center">주의 깊게</td>
</tr>
<tr>
<td align="center">commit</td>
<td align="center">약속하다, (범죄를)저지르다</td>
</tr>
<tr>
<td align="center">tutor</td>
<td align="center">가르치다</td>
</tr>
<tr>
<td align="center">ship</td>
<td align="center">운송하다</td>
</tr>
<tr>
<td align="center">until 뒤 명사는</td>
<td align="center">특정 시점</td>
</tr>
<tr>
<td align="center">loyally</td>
<td align="center">충성스럽게</td>
</tr>
<tr>
<td align="center">help의 목적격 보어</td>
<td align="center">동사원형, toV</td>
</tr>
<tr>
<td align="center">oversee</td>
<td align="center">감독하다</td>
</tr>
<tr>
<td align="center">by</td>
<td align="center">~옆에</td>
</tr>
<tr>
<td align="center">as of next week</td>
<td align="center">다음주부터</td>
</tr>
<tr>
<td align="center">procure</td>
<td align="center">구하다</td>
</tr>
<tr>
<td align="center">take over as</td>
<td align="center">~의 자리를 맡다</td>
</tr>
<tr>
<td align="center">hold</td>
<td align="center">개최하다</td>
</tr>
<tr>
<td align="center">dim</td>
<td align="center">어두워지다, 어두운</td>
</tr>
<tr>
<td align="center">extremly</td>
<td align="center">형, 부를 강조하는 부사임</td>
</tr>
<tr>
<td align="center">hard copy</td>
<td align="center">출력물</td>
</tr>
<tr>
<td align="center">soft copy</td>
<td align="center">미출력한 파일</td>
</tr>
<tr>
<td align="center">reluctantly</td>
<td align="center">마지못해</td>
</tr>
</tbody></table>
<hr>
<p>chapter 3 ~ 10 내용 완료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[토익 시험 10일 남았다.]]></title>
            <link>https://velog.io/@mi_hyun/%ED%86%A0%EC%9D%B5-%EC%8B%9C%ED%97%98-10%EC%9D%BC-%EB%82%A8%EC%95%98%EB%8B%A4</link>
            <guid>https://velog.io/@mi_hyun/%ED%86%A0%EC%9D%B5-%EC%8B%9C%ED%97%98-10%EC%9D%BC-%EB%82%A8%EC%95%98%EB%8B%A4</guid>
            <pubDate>Wed, 17 Apr 2024 06:43:02 GMT</pubDate>
            <description><![CDATA[<p>토익 시험 4월 27일로 10일 남았다.
오늘부터 공부 시작한다.</p>
<ul>
<li><p>교재 : 토익 정기시험 기출문제집3 1000 Reading</p>
</li>
<li><p>RC 계획</p>
</li>
<li><p><input checked="" disabled="" type="checkbox">  [part 5] 3회차 ~ 6회차 (120문제) 풀고 오답 정리</p>
</li>
<li><p><input checked="" disabled="" type="checkbox">  [part 5] 7회차 ~ 10회차 (120문제) 풀고 오답 정리</p>
</li>
<li><p><input disabled="" type="checkbox">  [part 6] 3회차 ~ 10회차 (128문제) 풀고 오답 정리</p>
</li>
<li><p><input disabled="" type="checkbox">  [part 7] 2회차 ~ 4회차 (162문제) 풀고 오답 정리</p>
</li>
<li><p><input disabled="" type="checkbox">  [part 7] 5회차 ~ 7회차 (162문제) 풀고 오답 정리</p>
</li>
<li><p><input disabled="" type="checkbox">  [part 7] 8회차 ~ 10회차 (162문제) 풀고 오답 정리</p>
</li>
</ul>
<hr>
<ul>
<li>LC 계획
이건 어카지 문제집을 사야겠다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[NaverCloud] metric connector구현&테스트]]></title>
            <link>https://velog.io/@mi_hyun/NaverCloud-metric-connector%EA%B5%AC%ED%98%84%ED%85%8C%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@mi_hyun/NaverCloud-metric-connector%EA%B5%AC%ED%98%84%ED%85%8C%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Wed, 10 Apr 2024 16:24:17 GMT</pubDate>
            <description><![CDATA[<p>네이버 클라우드의 insight(구 monitoring)에 있는 metric서비스를 spaceone의 멀티클라우드 플랫폼인 cloudforet에 추가하는 코드를 작성한다.</p>
<p>네이버 클라우드 서비스를 spaceone에 가져오는 형태는 connetor-&gt;manager-&gt;spaceone에 plugin 하는 단계로 구성되어 있다.
오늘은 네이버 클라우드의 api를 사용해서 metric 서비스 중 metric list와 list의 data를 connect 작업을 한다.</p>
<p>경로는 3가지가 있다.
src/spaceone/monitoring/connector/naver_cloud_connector/<strong>init</strong>.py
src/spaceone/monitoring/connector/naver_cloud_connector/metric.py
test/connector/test_naver_cloud_connector.py</p>
<p>test에서는 테스트를 하고,
init에서는 네이버 클라우드 api를 이용해서 연결하고,
metric에서는 가져오려는 데이터의 구조에 맞게 변형한다.</p>
<p>코드를 보는 순서는 test-&gt;init-&gt;metric-&gt;test 이다.</p>
<pre><code>test_connector.py

AKI = os.environ.get(&#39;NCLOUD_ACCESS_KEY_ID&#39;, None)
SK = os.environ.get(&#39;NCLOUD_SECRET_KEY&#39;, None)

class TestNaverCloudConnector(unittest.TestCase):
    secret_data = {
        &#39;ncloud_access_key_id&#39;: AKI,
        &#39;ncloud_secret_key&#39;: SK,
    }

    @classmethod
    def setUpClass(cls):
        config.init_conf(package=&#39;spaceone.inventory&#39;)
        cls.schema = &#39;naver_client_secret&#39;

        super().setUpClass()

    @classmethod
    def tearDownClass(cls) -&gt; None:
        super().tearDownClass()

    def test_list_metrics(self):
        options = {
            &quot;prodKey&quot;: &quot;460438727509020672&quot;
        }
        secret_data = self.secret_data
        endpoint = &#39;/cw_fea/real/cw/api/rule/group/metric/search&#39;

        self.metric_connector = NaverCloudConnector(secret_data=secret_data, options=options)        #init으로 가서 connect를 하게 된다.
        self.metric_connector.set_connnect({}, options, secret_data, endpoint)
        metrics_info = self.metric_connector.list_metrics(options)        #options를 통해 prod_key를 전달한다. 받을 땐 딕셔너리 형태인 **kwargs로 받는다.

    def test_get_metric_data(self):
        # end = datetime.utcnow()
        # start = end - timedelta(minutes=60*60*7*30)
        # 위와 같은 방식으로 나중에 시간 변경 다 해줘야 한다.

        options = {
            &quot;cw_key&quot;: &quot;460438727509020672&quot;,
            &quot;metric&quot;: &quot;concurrent_session&quot;,
            &quot;dimensions&quot;: {
                &quot;loadBalancerPort&quot;: &quot;80&quot;,
                &quot;layerType&quot;: &quot;APPLICATION&quot;,
                &quot;loadBalancerName&quot;: &quot;ing-spaceone-ncloudspace-1423c&quot;,
                &quot;networkType&quot;: &quot;PUBLIC&quot;
            },
            &quot;timeStart&quot;: &#39;1712759400000&#39;,
            &quot;timeEnd&quot;: &#39;1712762999000&#39;
        }

        secret_data = self.secret_data
        endpoint = &#39;/cw_fea/real/cw/api/data/query&#39;
        self.metric_connector = NaverCloudConnector(secret_data=secret_data, options=options)        #init으로 가서 connect를 하게 된다. metric_connector라는 객체 형성.
        self.metric_connector.set_connnect({}, options, secret_data, endpoint)

        metrics_info = self.metric_connector.get_metric_data(
            options.get(&#39;cw_key&#39;),
            options.get(&#39;metric&#39;),
            options.get(&#39;dimensions&#39;),
            options.get(&#39;timeStart&#39;),
            options.get(&#39;timeEnd&#39;),
        )                                         #이 5개 값이 순서대로 init의 *args에 튜플형태로 들어간다.

        print(&quot;metrics_info: &quot;, metrics_info)

if __name__ == &quot;__main__&quot;:
    unittest.main(testRunner=RichTestRunner)</code></pre><h4 id="다음은-네이버-클라우드의-api를-이용해서-직접적으로-연결되는-부분이다">다음은 네이버 클라우드의 api를 이용해서 직접적으로 연결되는 부분이다.</h4>
<pre><code>__init__.py

class NaverCloudConnector(BaseConnector):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.metric_client = None
        self.base_url = &#39;https://cw.apigw.ntruss.com&#39;

    def make_signature(self, access_key, secret_key, method, uri, timestamp):
        message = method + &quot; &quot; + uri + &quot;\n&quot; + timestamp + &quot;\n&quot; + access_key
        message = bytes(message, &#39;UTF-8&#39;)
        secret_key = bytes(secret_key, &#39;UTF-8&#39;)
        signingKey = base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())
        return signingKey.decode()

    def set_connnect(self, options: dict, secret_data: dict, endpoint):
        self.url = f&quot;{self.base_url}{endpoint}&quot;
        self.endpoint = endpoint
        method = &#39;POST&#39;
        timestamp = str(int(time.time() * 1000))
        metric_access_key = secret_data[&#39;ncloud_access_key_id&#39;]
        metric_secret_key = secret_data[&#39;ncloud_secret_key&#39;]
        headers = {
            &#39;x-ncp-apigw-signature-v2&#39;: self.make_signature(metric_access_key, metric_secret_key, method,
                                                       endpoint,
                                                       timestamp),
            &#39;x-ncp-apigw-timestamp&#39;: timestamp,
            &#39;x-ncp-iam-access-key&#39;: metric_access_key,
            &#39;Content-Type&#39;: &#39;application/json&#39;
        }

        if options is None:
            options = {}

        self.metric_client = requests.post(self.url, headers=headers, json=options).json()        
        #list_metric의 경우, client는 {&#39;metrics&#39;: [{&#39;dataType&#39;: &#39;FLOAT&#39;, &#39;desc&#39;: &#39;Concurrent Connection&#39;, &#39;dimensions&#39;: [{&#39;dim&#39;: &#39;layerType&#39;, &#39;val&#39;: &#39;APPLICATION&#39;}, {&#39;dim&#39;: &#39;loadBalancerPort&#39;, &#39;val&#39;: &#39;80&#39;}, {&#39;dim&#39;: &#39;loadBalancerName&#39;, &#39;val&#39;: &#39;ing-spaceone-ncloudspace-1423c&#39;}, {&#39;dim&#39;: &#39;networkType&#39;, &#39;val&#39;: &#39;PUBLIC&#39;}], &#39;idDimension&#39;: &#39;instanceId&#39;, &#39;metric&#39;: &#39;concurrent_session&#39;, &#39;options&#39;: {&#39;Min1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min5&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min30&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Hour2&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Day1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;]}, &#39;prodKey&#39;: &#39;460438727509020672&#39;}, {&#39;dataType&#39;: &#39;FLOAT&#39;, &#39;desc&#39;: &#39;Concurrent Connection&#39;, &#39;dimensions&#39;: [{&#39;dim&#39;: &#39;loadBalancerName&#39;, &#39;val&#39;: &#39;ingress-ngi-ingress-ngin-7e287&#39;}, {&#39;dim&#39;: &#39;layerType&#39;, &#39;val&#39;: &#39;NETWORK_PROXY&#39;}, {&#39;dim&#39;: &#39;loadBalancerPort&#39;, &#39;val&#39;: &#39;443&#39;}, {&#39;dim&#39;: &#39;networkType&#39;, &#39;val&#39;: &#39;PUBLIC&#39;}], &#39;idDimension&#39;: &#39;instanceId&#39;, &#39;metric&#39;: &#39;concurrent_session&#39;, &#39;options&#39;: {&#39;Min1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min5&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min30&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Hour2&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Day1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;]}, &#39;prodKey&#39;: &#39;460438727509020672&#39;}, {&#39;dataType&#39;: &#39;FLOAT&#39;, &#39;desc&#39;: &#39;Concurrent Connection&#39;, &#39;dimensions&#39;: [{&#39;dim&#39;: &#39;loadBalancerPort&#39;, &#39;val&#39;: &#39;80&#39;}, {&#39;dim&#39;: &#39;loadBalancerName&#39;, &#39;val&#39;: &#39;ingress-ngi-ingress-ngin-7e287&#39;}, {&#39;dim&#39;: &#39;layerType&#39;, &#39;val&#39;: &#39;NETWORK_PROXY&#39;}, {&#39;dim&#39;: &#39;networkType&#39;, &#39;val&#39;: &#39;PUBLIC&#39;}], &#39;idDimension&#39;: &#39;instanceId&#39;, &#39;metric&#39;: &#39;concurrent_session&#39;, &#39;options&#39;: {&#39;Min1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min5&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min30&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Hour2&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Day1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;]}, &#39;prodKey&#39;: &#39;460438727509020672&#39;}, {&#39;dataType&#39;: &#39;FLOAT&#39;, &#39;desc&#39;: &#39;Connection per Second&#39;, &#39;dimensions&#39;: [{&#39;dim&#39;: &#39;layerType&#39;, &#39;val&#39;: &#39;APPLICATION&#39;}, {&#39;dim&#39;: &#39;loadBalancerPort&#39;, &#39;val&#39;: &#39;80&#39;}, {&#39;dim&#39;: &#39;loadBalancerName&#39;, &#39;val&#39;: &#39;ing-spaceone-ncloudspace-1423c&#39;}, {&#39;dim&#39;: &#39;networkType&#39;, &#39;val&#39;: &#39;PUBLIC&#39;}], &#39;idDimension&#39;: &#39;instanceId&#39;, &#39;metric&#39;: &#39;connections_per_second&#39;, &#39;options&#39;: {&#39;Min1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min5&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min30&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Hour2&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Day1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;]}, &#39;prodKey&#39;: &#39;460438727509020672&#39;}, {&#39;dataType&#39;: &#39;FLOAT&#39;, &#39;desc&#39;: &#39;Connection per Second&#39;, &#39;dimensions&#39;: [{&#39;dim&#39;: &#39;loadBalancerName&#39;, &#39;val&#39;: &#39;ingress-ngi-ingress-ngin-7e287&#39;}, {&#39;dim&#39;: &#39;layerType&#39;, &#39;val&#39;: &#39;NETWORK_PROXY&#39;}, {&#39;dim&#39;: &#39;loadBalancerPort&#39;, &#39;val&#39;: &#39;443&#39;}, {&#39;dim&#39;: &#39;networkType&#39;, &#39;val&#39;: &#39;PUBLIC&#39;}], &#39;idDimension&#39;: &#39;instanceId&#39;, &#39;metric&#39;: &#39;connections_per_second&#39;, &#39;options&#39;: {&#39;Min1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min5&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min30&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Hour2&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Day1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;]}, &#39;prodKey&#39;: &#39;460438727509020672&#39;}, {&#39;dataType&#39;: &#39;FLOAT&#39;, &#39;desc&#39;: &#39;Connection per Second&#39;, &#39;dimensions&#39;: [{&#39;dim&#39;: &#39;loadBalancerPort&#39;, &#39;val&#39;: &#39;80&#39;}, {&#39;dim&#39;: &#39;loadBalancerName&#39;, &#39;val&#39;: &#39;ingress-ngi-ingress-ngin-7e287&#39;}, {&#39;dim&#39;: &#39;layerType&#39;, &#39;val&#39;: &#39;NETWORK_PROXY&#39;}, {&#39;dim&#39;: &#39;networkType&#39;, &#39;val&#39;: &#39;PUBLIC&#39;}], &#39;idDimension&#39;: &#39;instanceId&#39;, &#39;metric&#39;: &#39;connections_per_second&#39;, &#39;options&#39;: {&#39;Min1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min5&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min30&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Hour2&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Day1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;]}, &#39;prodKey&#39;: &#39;460438727509020672&#39;}, {&#39;dataType&#39;: &#39;FLOAT&#39;, &#39;dimensions&#39;: [{&#39;dim&#39;: &#39;layerType&#39;, &#39;val&#39;: &#39;APPLICATION&#39;}, {&#39;dim&#39;: &#39;loadBalancerPort&#39;, &#39;val&#39;: &#39;80&#39;}, {&#39;dim&#39;: &#39;loadBalancerName&#39;, &#39;val&#39;: &#39;ing-spaceone-ncloudspace-1423c&#39;}, {&#39;dim&#39;: &#39;networkType&#39;, &#39;val&#39;: &#39;PUBLIC&#39;}], &#39;idDimension&#39;: &#39;instanceId&#39;, &#39;metric&#39;: &#39;traffic_in_byte&#39;, &#39;options&#39;: {&#39;Min1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min5&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min30&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Hour2&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Day1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;]}, &#39;prodKey&#39;: &#39;460438727509020672&#39;}, {&#39;dataType&#39;: &#39;FLOAT&#39;, &#39;dimensions&#39;: [{&#39;dim&#39;: &#39;loadBalancerName&#39;, &#39;val&#39;: &#39;ingress-ngi-ingress-ngin-7e287&#39;}, {&#39;dim&#39;: &#39;layerType&#39;, &#39;val&#39;: &#39;NETWORK_PROXY&#39;}, {&#39;dim&#39;: &#39;loadBalancerPort&#39;, &#39;val&#39;: &#39;443&#39;}, {&#39;dim&#39;: &#39;networkType&#39;, &#39;val&#39;: &#39;PUBLIC&#39;}], &#39;idDimension&#39;: &#39;instanceId&#39;, &#39;metric&#39;: &#39;traffic_in_byte&#39;, &#39;options&#39;: {&#39;Min1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min5&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min30&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Hour2&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Day1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;]}, &#39;prodKey&#39;: &#39;460438727509020672&#39;}, {&#39;dataType&#39;: &#39;FLOAT&#39;, &#39;dimensions&#39;: [{&#39;dim&#39;: &#39;loadBalancerPort&#39;, &#39;val&#39;: &#39;80&#39;}, {&#39;dim&#39;: &#39;loadBalancerName&#39;, &#39;val&#39;: &#39;ingress-ngi-ingress-ngin-7e287&#39;}, {&#39;dim&#39;: &#39;layerType&#39;, &#39;val&#39;: &#39;NETWORK_PROXY&#39;}, {&#39;dim&#39;: &#39;networkType&#39;, &#39;val&#39;: &#39;PUBLIC&#39;}], &#39;idDimension&#39;: &#39;instanceId&#39;, &#39;metric&#39;: &#39;traffic_in_byte&#39;, &#39;options&#39;: {&#39;Min1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min5&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min30&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Hour2&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Day1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;]}, &#39;prodKey&#39;: &#39;460438727509020672&#39;}, {&#39;dataType&#39;: &#39;FLOAT&#39;, &#39;desc&#39;: &#39;Traffic Out&#39;, &#39;dimensions&#39;: [{&#39;dim&#39;: &#39;layerType&#39;, &#39;val&#39;: &#39;APPLICATION&#39;}, {&#39;dim&#39;: &#39;loadBalancerPort&#39;, &#39;val&#39;: &#39;80&#39;}, {&#39;dim&#39;: &#39;loadBalancerName&#39;, &#39;val&#39;: &#39;ing-spaceone-ncloudspace-1423c&#39;}, {&#39;dim&#39;: &#39;networkType&#39;, &#39;val&#39;: &#39;PUBLIC&#39;}], &#39;idDimension&#39;: &#39;instanceId&#39;, &#39;metric&#39;: &#39;traffic_out_byte&#39;, &#39;options&#39;: {&#39;Min1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min5&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min30&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Hour2&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Day1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;]}, &#39;prodKey&#39;: &#39;460438727509020672&#39;}, {&#39;dataType&#39;: &#39;FLOAT&#39;, &#39;desc&#39;: &#39;Traffic Out&#39;, &#39;dimensions&#39;: [{&#39;dim&#39;: &#39;loadBalancerName&#39;, &#39;val&#39;: &#39;ingress-ngi-ingress-ngin-7e287&#39;}, {&#39;dim&#39;: &#39;layerType&#39;, &#39;val&#39;: &#39;NETWORK_PROXY&#39;}, {&#39;dim&#39;: &#39;loadBalancerPort&#39;, &#39;val&#39;: &#39;443&#39;}, {&#39;dim&#39;: &#39;networkType&#39;, &#39;val&#39;: &#39;PUBLIC&#39;}], &#39;idDimension&#39;: &#39;instanceId&#39;, &#39;metric&#39;: &#39;traffic_out_byte&#39;, &#39;options&#39;: {&#39;Min1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min5&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min30&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Hour2&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Day1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;]}, &#39;prodKey&#39;: &#39;460438727509020672&#39;}, {&#39;dataType&#39;: &#39;FLOAT&#39;, &#39;desc&#39;: &#39;Traffic Out&#39;, &#39;dimensions&#39;: [{&#39;dim&#39;: &#39;loadBalancerPort&#39;, &#39;val&#39;: &#39;80&#39;}, {&#39;dim&#39;: &#39;loadBalancerName&#39;, &#39;val&#39;: &#39;ingress-ngi-ingress-ngin-7e287&#39;}, {&#39;dim&#39;: &#39;layerType&#39;, &#39;val&#39;: &#39;NETWORK_PROXY&#39;}, {&#39;dim&#39;: &#39;networkType&#39;, &#39;val&#39;: &#39;PUBLIC&#39;}], &#39;idDimension&#39;: &#39;instanceId&#39;, &#39;metric&#39;: &#39;traffic_out_byte&#39;, &#39;options&#39;: {&#39;Min1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min5&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Min30&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Hour2&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;], &#39;Day1&#39;: [&#39;COUNT&#39;, &#39;SUM&#39;, &#39;MAX&#39;, &#39;MIN&#39;, &#39;AVG&#39;]}, &#39;prodKey&#39;: &#39;460438727509020672&#39;}], &#39;prodKey&#39;: &#39;460438727509020672&#39;}
        #get_metric_data의 경우, client는 [[1712759400000, 0.0], [1712759460000, 1.0], [1712759520000, 0.0], [1712759580000, 0.0], [1712759640000, 0.0], [1712759700000, 0.0], [1712759760000, 0.0], [1712759820000, 0.0], [1712759880000, 0.0], [1712759940000, 0.0], [1712760000000, 0.0], [1712760060000, 0.0], [1712760120000, 1.0], [1712760180000, 1.0], [1712760240000, 0.0], [1712760300000, 0.0], [1712760360000, 1.0], [1712760420000, 0.0], [1712760480000, 0.0], [1712760540000, 0.0], [1712760600000, 0.0], [1712760660000, 0.0], [1712760720000, 0.0], [1712760780000, 0.0], [1712760840000, 0.0], [1712760900000, 2.0], [1712760960000, 0.0], [1712761020000, 0.0], [1712761080000, 0.0], [1712761140000, 0.0], [1712761200000, 1.0], [1712761260000, 0.0], [1712761320000, 0.0], [1712761380000, 0.0], [1712761440000, 0.0], [1712761500000, 0.0], [1712761560000, 0.0], [1712761620000, 0.0], [1712761680000, 0.0], [1712761740000, 0.0], [1712761800000, 0.0], [1712761860000, 0.0], [1712761920000, 0.0], [1712761980000, 0.0], [1712762040000, 0.0], [1712762100000, 0.0], [1712762160000, 0.0], [1712762220000, 0.0], [1712762280000, 0.0], [1712762340000, 0.0], [1712762400000, 0.0], [1712762460000, 0.0], [1712762520000, 0.0], [1712762580000, 0.0], [1712762640000, 0.0], [1712762700000, 0.0], [1712762760000, 0.0], [1712762820000, 0.0], [1712762880000, 0.0], [1712762940000, 0.0]]

    def list_metrics(self, **kwargs):    #prodkey 딕셔너리 형태
        return NaverCloudMetric(self.metric_client, self.url).list_metrics(**kwargs)

    def get_metric_data(self, *args):    #options보면 튜플 형태
        return NaverCloudMetric(self.metric_client, self.url).get_metric_data(*args)
</code></pre><h4 id="init에서-connect를-하나면-metircpy에서는-각-함수의-값들을-가져온다">init에서 connect를 하나면 metirc.py에서는 각 함수의 값들을 가져온다.</h4>
<pre><code>metric.py

class NaverCloudMetric(object):

    def __init__(self, client, url):
        self.client = client
        self.url = url

    def list_metrics(self):

        metric_lists = []
        metric_info_lists = self.client[&#39;metrics&#39;]
        for metric_info in metric_info_lists:
            metric_lists.append(metric_info.get(&#39;metric&#39;))
        return metric_lists

    def get_metric_data(self, cw_key, metric, dimensions, timeStart, timeEnd):
        metrics_data = self.client
        metric_data = []
        for data in metrics_data:
            metric_data.append(data[1])
        return metric_data</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[04.03 주현이랑 성수 간 날]]></title>
            <link>https://velog.io/@mi_hyun/04.03-%EC%A3%BC%ED%98%84%EC%9D%B4%EB%9E%91-%EC%84%B1%EC%88%98-%EA%B0%84-%EB%82%A0</link>
            <guid>https://velog.io/@mi_hyun/04.03-%EC%A3%BC%ED%98%84%EC%9D%B4%EB%9E%91-%EC%84%B1%EC%88%98-%EA%B0%84-%EB%82%A0</guid>
            <pubDate>Wed, 10 Apr 2024 09:11:33 GMT</pubDate>
            <description><![CDATA[<p>벨로그에 일상 적어도 너무 좋을 것 같아서 적으려고 한다.
주현이랑 거즘 1년만에 만나 성수에 갔다.</p>
<p><img src="https://velog.velcdn.com/images/mi_hyun/post/51a83686-4f4f-412a-aaf4-6f4c722fde2a/image.png" alt=""></p>
<p>첫 번째로 간 곳은 성수 &quot;리볼리&quot;이다.
빵전같은 느낌이다.
토마토 바질은 흔히 먹는 그 맛이고 빵은 감자전같이 진득한 전이었다.</p>
<p><img src="https://velog.velcdn.com/images/mi_hyun/post/989827dc-9c63-43a9-aab3-167bc9f352c5/image.jpeg" alt=""></p>
<p>두 번째로 간 곳은 &quot;영카이브&quot;라는 포토부스였다.
일단 하루필름이나 포토이즘처럼 너무 많이 가서 질린 곳이 아니라 신났다.
그리고 안경 소품 마음에 들었고, 공간도 특이해서 더욱 맘에 들었다.
게다가 사진이 9컷이라는 게!
<img src="https://velog.velcdn.com/images/mi_hyun/post/f67201ba-d089-4d2d-b79b-10cb59fc4b72/image.jpeg" alt="">서촌에도 있다고 하니 다음 번은 서촌이다!
<img src="https://velog.velcdn.com/images/mi_hyun/post/7267ca2a-7da0-4617-ad85-2fd58765aa9c/image.png" alt="">제일 마음에 드는 부분,,,
은색을 은근히 (아니 상당히) 좋아해서 은색 배경과 은색 책상의 조합이 심플해서 좋다.
<img src="https://velog.velcdn.com/images/mi_hyun/post/d4787522-76f9-494a-88d3-3872315786c0/image.jpeg" alt="">EQL에서는 테디베어랑 프레즐이랑 콜라보한 팝업이 열렸고,
공짜로 얻어서 기본맛으로 얻었다.</p>
<p><img src="https://velog.velcdn.com/images/mi_hyun/post/be723512-9310-4ee3-acaa-cd9c14e0880b/image.jpeg" alt="">기대 안하고 먹었는데 향이며 질감이며 너무 맛있어서 질겅징걸 씹어먹었다.</p>
<p><img src="https://velog.velcdn.com/images/mi_hyun/post/6b378959-c7fe-48bc-bf0a-70c98b5411d9/image.jpeg" alt="">저녁에는 집 뒷동산 산책했다. 
밤에는 잘 안갔는데 가보니 사람들도 많고, 야경이 되게 예쁘네,,
<img src="https://velog.velcdn.com/images/mi_hyun/post/5ed5373f-a74e-4210-a432-0071a9f249ab/image.jpeg" alt="">우리 귀여운 개방글이 머리 위에 벚꽃 하나 올려준다.
<img src="https://velog.velcdn.com/images/mi_hyun/post/01a7d61d-8727-4af6-af04-f6842161bee7/image.jpeg" alt="">그림자도 이렇게 귀여우면 어쩌자고!!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[지도 교수님과 상담]]></title>
            <link>https://velog.io/@mi_hyun/%EC%A7%80%EB%8F%84%EA%B5%90%EC%88%98%EB%8B%98%EA%B3%BC-%EC%83%81%EB%8B%B4</link>
            <guid>https://velog.io/@mi_hyun/%EC%A7%80%EB%8F%84%EA%B5%90%EC%88%98%EB%8B%98%EA%B3%BC-%EC%83%81%EB%8B%B4</guid>
            <pubDate>Wed, 10 Apr 2024 08:04:45 GMT</pubDate>
            <description><![CDATA[<p>어제 지도교수님과 1시간 가량의 상담을 했다.
별 생각 없이 들어갔고, 그간 했던 경험들와 현재 드는 많은 생각들을 나도 모르게 다 쏟아냈다. 
교수님께서는 좀 더 나이가 들고, 경험을 많이 해봤을 때 느끼는 것들을 미리 잘 경험하고 왔다고 해주셨다. </p>
<p>이른 나이에 이런 생각들을 하게 되어 좋을 수도 있지만, 안좋은 점은 현실을 너무나도 잘 간파한 나머지 오히려 앞으로의 결정에 있어서 주춤거리게 되는 것 같으니, 조금은 생각을 내려놓으라고 해주셨다. 
주변에 선배가 없어서 내가하는 고민이 맞는지, 생각만 많아졌던 요즘 교수님과의 상담은 너무나도 힘이 되었다. </p>
<p>정말이지 대학원 인턴 잘 경험하고 오셨다고 했을 때 눈물이 핑 돌았다. 
그리고 조금의 쉼을 지나 다시금 도전을 해보라 하셔서 하려고 한다. </p>
<p>같은 길을 밟아오셔서 많은 것을 이야기 하지 않았는데도 불구하고, 
대화 도중 조금조금씩 나오는 내 상황에 대한 정확한 인식과 적당한 해결책이 너무나도 좋았다. 
혼자 있을 때도 물론 생각했던 것이지만 이 상황을 알아주시는 분이 계셔서 제일 좋았던 것 같다.</p>
<p>마지막으로는 대학원이든 취업이든 가서 경험하고, 거기서 또 얻는 게 있고, 알아서 잘 할 학생이라고 확신을 주셔서 &#39;그래 이게 나지&#39; 주눅들었던 태도를 다시 자신감있게 바꿔보려고 한다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[벨로그 시작]]></title>
            <link>https://velog.io/@mi_hyun/%EB%B2%A8%EB%A1%9C%EA%B7%B8%EC%8B%9C%EC%9E%91</link>
            <guid>https://velog.io/@mi_hyun/%EB%B2%A8%EB%A1%9C%EA%B7%B8%EC%8B%9C%EC%9E%91</guid>
            <pubDate>Wed, 10 Apr 2024 07:45:55 GMT</pubDate>
            <description><![CDATA[<p>링크드인을 보다가 뼈를 얻어 맞는 문구를 발견하였다.
드라마 &#39;대장금&#39;의 한 대사라고 하였고,
생각이 많아 한 가지에 집중하지 못하는 현재의 나에게
매일 일깨워주기 좋은 글인 것이다.</p>
<blockquote>
</blockquote>
<ol>
<li>&quot;뭘해도 되는 사람들의 특징이 무엇인 줄 알아? 단순하고 열정적이야.&quot;
여러가지 목표를 잡고 전부다 잘해보려는 사람은 복잡하다. 복잡하다는 말은, 생각이 많아지고 열정도 분산되며 빠르게 식어버린다. 오래가기 어려운 사람들이 주로 그러하다. 나 역시도 너무 많은 것을 &quot;잘&quot; 해보려다가 아무것도 하지 않게 되는, &quot;게으른 완벽주의자&quot;였던 적이 있다. 그래서 요즘은, 하나만 일단 단순하게, 모든 열정을 쏟아부어 완성하고 그 다음을 그 때 생각하는 것이 낫겠다는 생각을 하게 된다.<blockquote>
</blockquote>
</li>
<li>&quot;하기 싫어도, 단 하루가 되더라도 해.&quot;
이 말은 맥락이 조금 필요하다. 조선 최초 임금의 여성 주치의관이 된 장금은, 그 자리로 인해 많은 신하들의 반대와 내의원의 스승과 동료들의 반발을 겪으며 부담을 느끼게 된다. 그래서 자리를 맡지 않고 회피하려고 했다. 그러나 스승 장덕은 하루가 되더라도 맡아서 해야한다는 말로, 회피하려는 장금을 설득한다.<blockquote>
</blockquote>
이 말은 무엇일까? 계속해서 회피하는 사람은 나아갈 수가 없다. 딱 하루만이라도 하는 것과 하지 않는 것은 큰 차이가 있다. 그것이 자신에게 맞는 길인지, 아닌지를 알 수 있는 유일한 기회이자 시간이기 때문이다. 작게나마 깨달음을 겪고 미루었던 청소를 다시 하고 멈추었던 글쓰기를 다시 시작할 수 있었다. 글을 앞으로는 자주, 간략히 써보려고 노력하겠다. 짧게 하나씩 쓰기, 다시 시작해보겠다.</li>
</ol>
]]></description>
        </item>
    </channel>
</rss>