<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>一行入魂</title>
        <link>https://velog.io/</link>
        <description>Luck favors the prepared</description>
        <lastBuildDate>Thu, 06 Apr 2023 04:58:30 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>一行入魂</title>
            <url>https://images.velog.io/images/nao_snow/profile/35546a77-2587-4cb8-ba26-97fe2e63d115/스크린샷 2021-08-27 오후 1.45.26.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 一行入魂. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/nao_snow" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Linux] SSH 보안설정]]></title>
            <link>https://velog.io/@nao_snow/Linux-SSH-%EB%B3%B4%EC%95%88%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@nao_snow/Linux-SSH-%EB%B3%B4%EC%95%88%EC%84%A4%EC%A0%95</guid>
            <pubDate>Thu, 06 Apr 2023 04:58:30 GMT</pubDate>
            <description><![CDATA[<h1 id="ssh-보안설정">SSH 보안설정</h1>
<p><img src="https://velog.velcdn.com/images/nao_snow/post/0ca9ec1f-1533-4fe5-b93d-66001cc7cf17/image.png" alt=""></p>
<p>SSH 보안을 강화시키기 위한 여러가지 설정을 정리</p>
<hr>
<h3 id="1-개요">1. 개요</h3>
<ul>
<li>리눅스를 OS로 사용하는 서버에 접속하고자 할 때 SSH를 이용
이에 SSH를 통한 해킹시도(계정탈취)를 차단하기 위한 보안설정을 정리</li>
</ul>
<ul>
<li><p>SSH 란?</p>
<ul>
<li><p>Secure Shell의 줄임말,  원격 호스트에 접속하기 위해 사용되는 네트워크 프로토콜, 컴퓨터 간의 통신을 할 때 보안적으로 안전하게 통신을 위해 암호화기능을 제공 
※ Shell : 커널과 사용자 간의 다리 역할을 하는 인터페이스</p>
<ul>
<li>Telnet을 이용한 원격접속에서 SSH를 이용한 접속으로 변경
☞ 이유는 보안강화 측면, Telnet은 암호화를 제공하지 않아 보안상 취약, 이를 보완한 것(암호화)이 SSH</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="2-보안설정">2. 보안설정</h3>
<p>　🎯 적용대상: CentOS, Rocky, Alma Linux 를 대상</p>
<p>　이하의 설정방법을 정리해두고자 함.</p>
<blockquote>
<ol>
<li>접속포트 변경</li>
<li>root 계정 원격접속 차단</li>
<li>세션 타임아웃</li>
<li>로그인 시도 횟수 제한</li>
</ol>
</blockquote>
<hr>
<h3 id="3-접속포트-변경">3. 접속포트 변경</h3>
<ul>
<li><p>이유
🤦🏻‍♂️ ssh 접속의 default 포트는 22, default 포트는 익히 알려져 많은 접속시도에 노출
포트변경을 통해 무분별한 접속시도를 회피하고자 함
☞ nmap 등의 툴을 이용하면 포트확인 가능</p>
</li>
<li><p><strong>How to</strong></p>
<pre><code>　1. ssh 설정파일 수정
  2. SELinux 설정
  3. 방화벽 설정
  4. ssh daemon 재시작
  5. 포트 open여부 확인
  6. 재접속</code></pre><ul>
<li><p>Step 1. ssh 설정 파일 수정
설정파일(sshd_config) 내의 port를 변경하고자 하는 포트번호로 변경 &amp; 저장</p>
<p>22222 포트로 변경하는 예)</p>
<pre><code># vi /etc/ssh/sshd_config</code></pre><pre><code class="language-c">#Port 22
Port 22222</code></pre>
</li>
<li><p>Step 2. SELinux 설정
SELinux를 활성화상태 내 포트 허용</p>
<pre><code># semanage port -a -t ssh_port_t -p tcp 22222</code></pre></li>
<li><p>Step 3. 방화벽 설정
방화벽 내 22222 포트 허용 및 정책 적용</p>
<pre><code># firewall-cmd --permanent --zone=public --add-port=22222/tcp
# firewall-cmd --reload</code></pre></li>
<li><p>Step 4. ssh 재실행</p>
<pre><code># systemctl restart sshd.service</code></pre></li>
<li><p>Step 5. 설정한 포트가 열려있는지 확인</p>
<pre><code>$ netstat -nap | grep 22222</code></pre></li>
<li><p>Step 6. 재접속</p>
<pre><code>$ ssh root@xxx.xxx.xxx.xxx -p 22222</code></pre></li>
</ul>
</li>
</ul>
<hr>
<h3 id="4-root-계정-원격접속-차단">4. root 계정 원격접속 차단</h3>
<ul>
<li><p>이유 및 목적
root 계정은 기본적으로 생성되는 관리자 계정
ssh 기본설정에서는 root 로그인이 허용상태이며 공격자로부터 무분별한 root 계정을 통한 ssh 접속시도 가능성 존재, 이를 방지하기 위해 root 계정을 통한 접속차단 설정  </p>
</li>
<li><p><strong>How to</strong></p>
<pre><code>　1. root 이외 접속계정 생성
  2. ssh 설정파일(sshd_config) 수정
  3. ssh daemon 재시작
  4. 확인</code></pre><ul>
<li><p>Step 1. root 이외 접속계정 생성</p>
<pre><code>$ adduser user1</code></pre></li>
<li><p>Step 2. ssh 설정파일(sshd_config) 수정</p>
<pre><code># vi /etc/ssh/sshd_config</code></pre><p>ssh-key를 이용한 로그인을 허용하는 경우: prohibit-password
root 로그인자체를 막는 경우: no</p>
<pre><code class="language-c">#PermitRootLogin prohibit-password 
PermitRootLogin prohibit-password     # ssh-key 로그인 허용</code></pre>
<pre><code class="language-c">#PermitRootLogin prohibit-password 
PermitRootLogin no                    # root 계정을 통한 원격로그인 차단</code></pre>
</li>
<li><p>Step 3. ssh daemon 재시작</p>
<pre><code># systemctl restart sshd.service</code></pre></li>
<li><p>Step 4. 확인</p>
<pre><code>$ ssh user1@xxx.xxx.xxx.xxx -p 22222</code></pre></li>
</ul>
<p>📣  <strong>참고</strong>
  rocky, alma linux의 경우, 이하의 파일 설정을 변경해야함❗️</p>
<ul>
<li><p>이하의 파일내용 확인 및 변경</p>
<pre><code class="language-bash">/etc/ssh/sshd_config.d/01-permitrootlogin.conf

[변경 전]
PermitRootLogin yes

    ↓

[변경 후]
PermitRootLogin no</code></pre>
</li>
<li><p>설정내용 확인</p>
<pre><code># sshd -T</code></pre></li>
</ul>
</li>
</ul>
<hr>
<h3 id="5-세션-타임아웃">5. 세션 타임아웃</h3>
<ul>
<li><p>이유 및 목적
ssh를 연결해 놓으면 사용자가 연결을 끊지 않는 이상, 계속 연결된 상태
연결이 유지된 상태는 보안상 위험하므로, 일정 시간이 지나면 자동으로 연결이 끊어지도록 설정해서 보안을 강화</p>
</li>
<li><p><strong>How to</strong> (ssh설정변경을 이용)</p>
<pre><code>　1. ssh 설정파일(sshd_config) 수정
 2. ssh daemon 재시작
 3. 확인</code></pre><ul>
<li>Step 1. ssh 설정파일(sshd_config) 수정<pre><code class="language-bash"># vi /etc/ssh/sshd_config
</code></pre>
</li>
</ul>
<p>sshd_config 파일 내부
[변경 전]
#ClientAliveInterval 0
#ClientAliveMax 3</p>
<pre><code>    ↓</code></pre><p>[변경 후]
ClientAliveInterval 100
ClientAliveCountMax 3</p>
<pre><code>ClientAliveInterval: 클라이언트 살아있는지 확인하는 간격
ClientAliveCountMax: 클라이언트 응답 없어도 접속 유지하는 횟수

참고) ClientAliveInterval = 100, ClientAliveCountMax = 3 이면 300초(5분) 후 접속 끊김</code></pre><p> 최대접속유지시간 = ClientAliveInterval × ClientAliveCountMax</p>
<pre><code>          = 100 × 3
          = 300 초</code></pre><pre><code>
* Step 2. ssh daemon 재시작</code></pre><h1 id="systemctl-restart-sshdservice">systemctl restart sshd.service</h1>
<pre><code>
* Step 3. 확인</code></pre><h1 id="cat-etcsshsshd_config--grep-client">cat /etc/ssh/sshd_config | grep Client</h1>
<p>``` </p>
</li>
<li><p>💡 참고) 다른방법: profile 내 세션 타임아웃을 설정(10초)
profile 내 세션타임(10초)을 설정</p>
<pre><code># vi /etc/profile
export TMOUT=10</code></pre><p>profile을 적용</p>
<pre><code># source /etc/profile</code></pre></li>
</ul>
<hr>
<h3 id="6-로그인-시도-횟수-제한">6. 로그인 시도 횟수 제한</h3>
<ul>
<li><p>이유 및 목적
로그인 시도횟수를 제한함으로써 보안성 강화</p>
</li>
<li><p><strong>How to</strong></p>
<pre><code>　1. ssh 설정파일(sshd_config) 수정
 2. ssh daemon 재시작
 3. 확인</code></pre><ul>
<li>Step 1. ssh 설정파일(sshd_config) 수정<pre><code class="language-bash"># vi /etc/ssh/sshd_config
</code></pre>
</li>
</ul>
<p>sshd_config 파일 내부
[변경 전]
#MaxAuthTries 6</p>
<pre><code>    ↓</code></pre><p>[변경 후]
MaxAuthTries 3</p>
<pre><code>
 * Step 2. ssh daemon 재시작</code></pre><h1 id="systemctl-restart-sshdservice-1">systemctl restart sshd.service</h1>
<pre><code>
 * Step 3. 확인</code></pre><h1 id="cat-etcsshsshd_config--grep-maxauthtries">cat /etc/ssh/sshd_config | grep MaxAuthTries</h1>
<pre><code></code></pre></li>
</ul>
<hr>
<h3 id="7-references">7. References</h3>
<ul>
<li><a href="https://jolly-sally.tistory.com/40">[Linux] 방화벽 또는 포트 열려있는지 확인</a></li>
<li><a href="https://zzokma.tistory.com/1701">Rocky linux SSH 접속가능 / 포트 변경하는 방법</a></li>
<li><a href="https://servermon.tistory.com/457">[Linux] SSH 보안설정 #1 (SSH root접속 제한, SSH 포트 변경)</a></li>
<li><a href="https://docs.3rdeyesys.com/compute/ncloud_compute_server_ssh_security_setting.html">리눅스서버 SSH 접속 보안 설정하기
</a></li>
<li><a href="https://iamjjanga.tistory.com/28">[Linux] SSH timeout Configuration</a></li>
<li><a href="https://www.lesstif.com/lpt/ssh-ssh-connection-timeout-100205209.html">ssh 연결 타임 아웃 지정(ssh connection timeout)</a></li>
<li><a href="https://steady-snail.tistory.com/92">ssh Connection Timeout 설정</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Web] REST, REST API?]]></title>
            <link>https://velog.io/@nao_snow/Web-REST-REST-API</link>
            <guid>https://velog.io/@nao_snow/Web-REST-REST-API</guid>
            <pubDate>Thu, 23 Mar 2023 00:31:13 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/nao_snow/post/65ac35b8-4e21-4900-b5e7-136643d07ff4/image.png" alt=""></p>
<hr>
<h1 id="rest">REST</h1>
<h3 id="1-개념">1. 개념</h3>
<blockquote>
<p>REpresentational State Transfer 의 약자</p>
<ul>
<li>WEB과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식, 
  리소스 지향 아키텍처</li>
<li>자원을 이름(자원의 표현)으로 구분해 해당 자원의 상태(정보)를 주고 받는 모든 것<ul>
<li>자원(resource)의 표현(representation)에 의한 상태 전달을 뜻함</li>
</ul>
</li>
</ul>
</blockquote>
<p>　</p>
<ul>
<li><p>웹에 존재하는 모든 자원(이미지, 동영상, DB자원)에 고유한 URI를 부여해 활용하는 것으로, 자원에 대한 주소를 지정하는 방법론을 의미</p>
</li>
<li><p>REST 형식을 따르는 시스템을 RESTful 하다고 함</p>
<pre><code>※ RESTful 이란
 REST API의 설계 규칙을 올바르게 지킨 시스템을 RESTful 하다고 할 수 있음
 모든 CRUD 기능을 POST로 처리하는 API 혹은 URI 규칙을 올바르게 지키지 않는 API는
 REST API를 사용하였지만 RESTful 하지 못한 시스템이라 할 수 있다</code></pre></li>
<li><p>HTTP URI (Uniform Resource Identifier)를 통해 자원 (Resource)을 명시하고 HTTP Method (POST, GET, PUT, DELETE, PATCH 등)를 통해 해당 자원 (URI)에 대한 CRUD Operation 을 적용하는 것을 의미</p>
<pre><code>※ CRUD operation 이란
CRUD는 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 
Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말로 
REST에서의 CRUD Operation 동작 예시는 이하와 같음

  Create : 데이터 생성(POST)
  Read   : 데이터 조회(GET)
  Update : 데이터 수정(PUT, PATCH)
  Delete : 데이터 삭제(DELETE)</code></pre></li>
</ul>
<h3 id="2-rest-의-구성요소">2. REST 의 구성요소</h3>
<p>REST는 다음의 3가지로 구성</p>
<ol>
<li><p>자원 (Resource) - URI</p>
<ul>
<li>모든 자원에는 고유한 ID가 존재, 이 자원은 Server에 존재</li>
<li>자원의 식별은 HTTP URI</li>
</ul>
</li>
<li><p>자원에 대한 행위 (Verb) - HTTP Method</p>
<ul>
<li><h2 id="http-method를-통해-crud-적용">HTTP Method를 통해 CRUD 적용</h2>
<table>
<tr>
  <td>HTTP Method</td>
  <td>Operation</td>
  <td>설명</td>
</tr>
<tr>
  <td>POST</td>
  <td>Create</td>        
  <td>데이터 조회, URI가 가진 정보를 검색하기 위해 서버에 요청</td>
</tr>
<tr>
  <td>GET</td>
  <td>Read</td>
  <td>데이터 생성, 클라이언트에서 서버로 전달하려는 정보를 보냄</td>
</tr>
<tr>
  <td>PUT</td>
  <td>Update</td>
  <td>데이터 수정, 데이터 전체를 수정</td>
</tr>
<tr>
  <td>PATCH</td>
  <td>Update</td>
  <td>데이터 수정, 데이터 일부만 수정</td>
</tr>
<tr>
  <td>DELETE</td>
  <td>Delete</td>
  <td>데이터 삭제, (안전성 문제로 대부분 서버에서 비활성화)</td>
</tr>
</table>
</li>
</ul>
</li>
<li><p>표현 (Representation of Resource)</p>
<ul>
<li>Client와 Server 간의 데이터를 주고받는 형태로 JSON, XML, TEXT 등 HTTP 헤더에 지정된 Content-Type 중의 하나</li>
</ul>
</li>
</ol>
<h3 id="3-rest-의-특징">3. REST 의 특징</h3>
<ol>
<li><p>Server-Client 구조</p>
<ul>
<li>Server는 API 제공, 비즈니스 로직 처리 및 저장에 대한 책임</li>
<li>Client는 사용자 인증이나 컨텍스트(세션, 로그인 정보)등을 직접 관리하는 책임</li>
<li>각각의 역할이 확실히 구분되기 때문에 클라이언트와 서버에서 개발해야 할 내용이 명확해지고 서로간 의존성이 줄어들게 됨</li>
</ul>
</li>
<li><p>무상태(Stateless)</p>
<ul>
<li>HTTP는 Stateless 프로토콜, REST 역시 무상태성을 가짐, 
클라이언트의 Context를 서버에 저장하지 않음 → 작업을 위한 상태정보를 따로 저장 &amp; 관리하지 않음</li>
<li>세션 및 쿠키를 별도로 저장하고 관리하지 않기 때문에 API 서버는 들어오는 요청만을 단순히 처리하면 됨, 이에 서비스의 자유도가 높아지고 서버에서 불필요한 정보를 관리하지 않음으로써 단순한 구현이 가능</li>
</ul>
</li>
<li><p>캐시 처리 가능(Cachealble)</p>
<ul>
<li>HTTP 프로토콜을 그대로 사용하므로, WEB에서 사용하는 기존의 인프라를 그대로 활용 가능 → HTTP가 갖는 캐싱 기능 적용가능</li>
<li>대량의 요청을 효율적으로 처리가능</li>
</ul>
</li>
<li><p>계층화(Layered System)</p>
<ul>
<li>API 서버는 순수 비즈니스 로직을 수행하고 그 앞단에 사용자 인증, 암호화, 
로드밸런싱 등을 수행하는 계층을 추가하여 구조상의 유연성을 가짐</li>
<li>Proxy, Gateway와 같은 네트워크 기반의 중간매체를 사용할 수 있음</li>
<li>Client는 Server와 직접 통신하는지, 중간 서버와 통신하는지는 알 수 없음</li>
</ul>
</li>
<li><p>인터페이스 일관성(Uniform Interface)</p>
<ul>
<li>URI로 지정한 자원에 대한 조작을 통일되고 한정적인 인터페이스로 수행 
HTTP 표준에만 따른다면 모든 플랫폼에 사용가능, 느슨한 결함 형태를 가짐
→ 특정언어나 기술에 종속되지 않음</li>
</ul>
</li>
<li><p>자체 표현 구조</p>
<ul>
<li>동사(Method) + 명사(URI)로 이루어져있으며 어떤 메소드에 무슨 행위를 하는지 알 수 있으며 
REST API 자체가 매우 쉬워서 API 메세지 자체만 보고도 API 이해가능</li>
</ul>
</li>
</ol>
<h3 id="4-rest-의-장점-및-단점">4. REST 의 장점 및 단점</h3>
<ul>
<li><p>장점</p>
<ul>
<li>쉬운 사용<ul>
<li>HTTP 프로토콜 인프라를 그대로 사용하므로 별도의 인프라를 구축할 필요가 없음</li>
</ul>
</li>
<li>클라이언트-서버 역할의 명확한 분리<ul>
<li>REST의 특징이 Stateless에 따라 서버는 클라이언트의 Context를 유지할 필요가 없음</li>
</ul>
</li>
<li>특정 데이터 표현 사용가능<ul>
<li>헤더 부분에 URI 처리 메소드를 명시하고 필요한 실제 데이터를 ‘Body’에 표현할 수 있도록 분리, 이에 JSON, XML 등 원하는 Representation 언어로 사용 가능</li>
</ul>
</li>
</ul>
</li>
<li><p>단점</p>
<ul>
<li>표준 자체가 존재하지 않음<ul>
<li>REST는 설계 가이드일 뿐 표준 자체가 존재하지 않음, 정의가 필요</li>
</ul>
</li>
<li>HTTP Method의 한계<ul>
<li>HTTP Method 형태가 제한적</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h1 id="rest-api">REST API</h1>
<p> REST API 란? REST의 원리를 따르는 API를 의미
 REST API 를 올바르게 설계하기 위해서는 지켜야 하는 몇가지 규칙이 있음, 이하 규칙을 소개</p>
<p> 참고) API (Application Programming Interface) 란?
    애플리케이션 소프트웨어를 구축하고 통합하기 위한 정의 및 프로토콜 세트</p>
<p> REST API 설계 예시</p>
<ol>
<li><p>URI 는 동사보다 명사를, 대문자보다는 소문자를 사용
(×) <a href="http://example.com/Running/">http://example.com/Running/</a>
(○) <a href="http://example.com/run/">http://example.com/run/</a></p>
</li>
<li><p>마지막에 슬래시(/)를 포함하지 않음
(×) <a href="http://example.com/Running/">http://example.com/Running/</a>
(○) <a href="http://example.com/run/">http://example.com/run/</a></p>
</li>
<li><p>언더바 대신 하이픈을 사용
(×) <a href="http://example.com/test_blog">http://example.com/test_blog</a>
(○) <a href="http://example.com/test-blog">http://example.com/test-blog</a></p>
</li>
<li><p>파일확장자는 URI 에 포함하지 않음
(×) <a href="http://example.com/photo.jpg">http://example.com/photo.jpg</a>
(○) <a href="http://example.com/photo">http://example.com/photo</a></p>
</li>
<li><p>행위를 포함하지 않음
(×) <a href="http://example.com/delete-post/1">http://example.com/delete-post/1</a>
(○) <a href="http://example.com/post/1">http://example.com/post/1</a></p>
</li>
</ol>
<hr>
<h1 id="reference">Reference</h1>
<ul>
<li><a href="https://meetup.nhncloud.com/posts/92">https://meetup.nhncloud.com/posts/92</a></li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Flutter] Splash screen 구현]]></title>
            <link>https://velog.io/@nao_snow/Flutter-Splash-screen-%EA%B5%AC%ED%98%84</link>
            <guid>https://velog.io/@nao_snow/Flutter-Splash-screen-%EA%B5%AC%ED%98%84</guid>
            <pubDate>Thu, 19 Jan 2023 07:27:33 GMT</pubDate>
            <description><![CDATA[<p>Flutter 에서의 splash screen 구현</p>
<h1 id="0-내용">0. 내용</h1>
<ul>
<li>Splash screen 구현<ol>
<li>flutter_native_splash 이용</li>
<li>직접 구현</li>
</ol>
</li>
</ul>
<hr>
<h1 id="1-splash-screen-구현">1. Splash screen 구현</h1>
<h3 id="1-flutter_native_splash-이용">1. flutter_native_splash 이용</h3>
<p> 구체적으로는 <a href="https://pub.dev/packages/flutter_native_splash">pub.dev</a>에 기재된 내용임, 간단한 순서로는
 ① package 다운로드
 ② 설정파일(pubspec.yaml) 수정 및 이미지 적용
 ③ run the package</p>
<ol>
<li><p>package 다운로드</p>
<ul>
<li>Run this command<pre><code class="language-bash">$ flutter pub add flutter_native_splash</code></pre>
</li>
<li>pubspec.yaml 내의 dependencies 확인<pre><code class="language-bash"># pubspec.yaml 내 dependencies    
dependencies:
 flutter_native_splash: ^2.2.17</code></pre>
</li>
</ul>
</li>
<li><p>설정파일(pubspec.yaml) 수정 및 이미지 적용</p>
<ul>
<li><p>pubspec.yaml 내용수정
　※ flutter_native_splash.yaml 를 만들어서 설정하는 것도 가능</p>
<pre><code class="language-yaml"># pubspec.yaml 설정을 추가 
flutter_native_splash:
 fullscreen: true
 image: assets/flutter_logo.png
 color: &#39;#FFFFFF&#39;
 android: true
 ios: true
 web: false

 android_12:
   color: &#39;#000000&#39;
   image: assets/flutter_logo.png</code></pre>
</li>
<li><p>로고 이미지 생성 및 추가</p>
<ul>
<li>assets 생성 및 하위에 이미지 추가</li>
<li>pubspec.yaml 내 assets 설정수정</li>
</ul>
<pre><code class="language-yaml"># pubspec.yaml 내 assets설정 수정 
flutter:
 assets:
   - assets/</code></pre>
<p>※ <a href="https://flutter.dev/brand">flutter.dev</a> 내의 이미지를 이용</p>
<pre>
<img style="float:left;" src= "https://velog.velcdn.com/images/nao_snow/post/957856f8-3a3b-4edd-a8c1-4c3ee9342a33/image.png">
</pre>
</li>
</ul>
<ol start="3">
<li><p>실행 및 확인</p>
<ul>
<li>pubspec.yaml 설정의 경우<pre><code class="language-bash">$ flutter pub run flutter_native_splash:create</code></pre>
</li>
<li>flutter_native_splash.yaml 을 신규작성한 경우<pre><code class="language-bash">$ flutter pub run flutter_native_splash:create -- path=&quot;flutter_native_splash.yaml 경로&quot;</code></pre>
</li>
<li>확인 (좌: API Lv.28, 우: API Lv.33)</li>
</ul>
<table width="100%" style="border:0px solid black !important;">
<tr>
  <td><img src="https://velog.velcdn.com/images/nao_snow/post/3d6c2fa3-2ac8-47c9-8907-6129548453fc/image.gif"></td>
  <td><img style="margin-top:-10px;" src="https://velog.velcdn.com/images/nao_snow/post/48820e47-1392-47c6-a32b-4da7c6c51c8f/image.gif"></td>
</tr>
</table>

<ul>
<li>이슈사항</li>
<li>Android 12 에서 발생하는 이슈사항으로 패키지 적용후 
처음 App기동시에는 이미지가 보이지 않으나, 그 이후부터는 제대로 표시됨.
<a href="https://github.com/jonbhanson/flutter_native_splash/issues/482">github repository 내의 issues 확인</a>
→ API Lv.31~32에서는 이슈사항과 동일함 확인, But Lv.33에는 제대로 동작</li>
</ul>
</li>
</ol>
</li>
</ol>
<h3 id="2-직접-코드로-구현">2. 직접 코드로 구현</h3>
<ol>
<li><p>splash_screen 화면 작성</p>
<pre><code class="language-dart">// lib/splash_screen.dart
class SplashScreen extends StatefullWidget {
@override
state&lt;SplashScreen&gt; createState() =&gt; _SplashScreenState();
}

class _SplashScreenState extends State&lt;SplashScreen&gt; {
@override
void initState() {
 super.initState();

 Timer(const Duration(milliseconds: 3000), () =&gt;
   Navigator.pushReplacement(context, 
     MaterialPageRoute(builder: (context) =&gt; 
       const MyHomePage(title: &#39;Flutter Demo Home Page&#39;)
     )
   )
 );  // Timer
}

@override
Widget build(BuildContext context) {
 // Building the splash screen here 
return const Scaffold(
  appBar: null,
  body: Center(
    child: Text(&#39;Splash Screen&#39;)
  )
);
}
}</code></pre>
</li>
<li><p>main.dart 내의 내용 수정</p>
<pre><code class="language-dart">// lib/main.dart

class MyApp extends StatelessWidget {
@override
Widget Build(BuildContext context) {
 return MaterialApp(
   title: &#39;Flutter Demo&#39;,
   theme: ThemeData(
     primarySwatch: Colors.blue,
   ),
   home: const SplashScreen()
 );
}
}</code></pre>
</li>
<li><p>이슈사항</p>
<ul>
<li>android 시작화면이 flutter가 그리는 첫화면보다 먼저나오는 현상</li>
</ul>
</li>
</ol>
<hr>
<h1 id="2-references">2. References</h1>
<ul>
<li><a href="https://pub.dev/packages/flutter_native_splash">flutter_native_splash in pub.dev</a></li>
<li><a href="https://pub.dev/packages/animated_splash_screen">animated_splash_screen in pub.dev</a></li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[서버 모니터링 도입 with Zabbix]]></title>
            <link>https://velog.io/@nao_snow/%EC%84%9C%EB%B2%84-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81</link>
            <guid>https://velog.io/@nao_snow/%EC%84%9C%EB%B2%84-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81</guid>
            <pubDate>Fri, 05 Nov 2021 08:47:03 GMT</pubDate>
            <description><![CDATA[<h1 id="1-설치환경-체크">1. 설치환경 체크</h1>
<ul>
<li>(실제) 설치환경
<img src="https://images.velog.io/images/nao_snow/post/dbcb6392-2afb-4e2f-8bf2-0e84d7a9680c/installed_platform.png" alt=""><ul>
<li>zabbix version: 5.0.16</li>
<li>OS: CentOS 7.9.xx</li>
<li>DB: 10.6.4-MariaDB</li>
<li>Web Server: Nginx 1.20.1</li>
</ul>
</li>
</ul>
<hr>
<h1 id="2-zabbix-server-설치-및-설정">2. Zabbix Server 설치 및 설정</h1>
<ol>
<li><p>Install Zabbix repository
 ※ RPM repository : zabbix-release-5.0-1.el7.noarch.rpm</p>
<pre><code class="language-bash">＃ rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/{RPM_repository}
＃ yum clean all</code></pre>
</li>
<li><p>Install Zabbix server and agent</p>
<pre><code class="language-bash">＃ yum install zabbix-server-mysql zabbix-agent</code></pre>
</li>
<li><p>Install Zabbix frontend</p>
<pre><code class="language-bash">＃ yum install centos-release-scl
＃ yum install zabbix-web-mysql-scl zabbix-nginx-conf-scl</code></pre>
<pre style="background:#EFEFEF; margin:0 5% 0 5%;">  /etc/yum.repos.d/zabbix.repo

[zabbix-frontend]
...
enabled=1
...
</pre></li>
<li><p>DB 설정</p>
<ul>
<li>DB 초기화<pre style="background:#EFEFEF; margin:0 1% 0 1%;">
＃ mysql -uroot -p password
mysql> create database zabbix character set utf8  collate utf8_bin;
mysql> create user zabbix@localhost identified by 'password';
mysql> grant all privileges on zabbix.* to zabbix@localhost;
mysql> quit;
</pre>
<br></li>
<li>Schema 적용<pre style="background:#EFEFEF; margin:0 1% 0 1%;">
＃ zcat /usr/share/doc/zabbix-server-my*/create.sql.gz | mysql -uzabbix -p zabbix
</pre><br/></li>
<li>DB설정(zabbix server)<pre style="background:#EFEFEF; margin:0 1% 0 1%;">
/etc/zabbix/zabbix_server.conf 내의 편집 (Line: 125)

</li>
</ul>
<p>DBPassword=<span style="color:red;">password</span> ← 설정한 패스워드
</pre></p>
</li>
<li><p>PHP 설정</p>
<ul>
<li>주석제거 및 서버명 설정<pre style="background:#EFEFEF; margin:2% 1% 2% 1%;">
/etc/opt/rh/rh-nginx116/nginx/conf.d/zabbix.conf 내의 편집

</li>
</ul>
<h1 id="listen-80">listen 80;</h1>
<h1 id="server_name-examplecom">server_name example.com;</h1>
<p></pre></p>
<ul>
<li>acl_users 내 apache, nginx 추가<pre style="background:#EFEFEF; margin:2% 1% 2% 1%;">
/etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf 내의 편집

</li>
</ul>
<p>listen.acl_users = apache,nginx
</pre></p>
<ul>
<li>timezone 변경 → Asia/Seoul<pre style="background:#EFEFEF; margin:2% 1% 2% 1%;">
/etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf 내의 편집

</li>
</ul>
<p>; php_value[date.timezone] = Europe/Riga
<span style="color:red;">→ </span>php_value[date.timezone] = Asia/Seoul
</pre></p>
</li>
<li><p>Zabbix Server 및 Agent 기동</p>
<ul>
<li>서비스 기동 및 등록<pre style="background:#EFEFEF; margin:2% 1% 2% 1%;">
# systemctl restart zabbix-server zabbix-agent rh-nginx116-nginx rh-php72-php-fpm
# systemctl enable zabbix-server zabbix-agent rh-nginx116-nginx rh-php72-php-fpm
</pre>
</li>
</ul>
</li>
<li><p>Done!</p>
</li>
</ol>
<hr>
<h1 id="3-zabbix-agent-설치-및-설정">3. Zabbix Agent 설치 및 설정</h1>
<ol>
<li>CentOS 7 - Zabbix Agent 설치 (감시대상 서버)<ul>
<li>RPM 패키지 설치 From <a href="http://repo.zabbix.com/zabbix/">Zabbix repository</a><pre style="background:#EFEFEF; margin:2% 1% 2% 1%;">
# rpm -ivh {repo path}/zabbix-agent-5.0.17-1.el7.x86_64.rpm
</pre>
※ Repository PATH: <a href="http://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64">http://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64</a><br/></li>
</ul>
</li>
<li>Zabbix Agent 설정<ul>
<li>/etc/zabbix/zabbix_agentd.conf 편집<pre style="background:#EFEFEF; margin:2% 1% 2% 1%;">
Server=xxx.xxx.xxx.xxx <span style="color:red;"> → </span> zabbix server IP
#ServerActive=xxx.xxx.xxx.xxx <span style="color:red;"> → </span> zabbix server IP
Hostname=xxx.xxx.xxx.xxx <span style="color:red;"> → </span> zabbix agent server IP
</pre><br/></li>
</ul>
</li>
<li>Zabbix Agent 서비스 구동 및 등록<ul>
<li>서비스 기동 및 등록<pre style="background:#EFEFEF; margin:2% 1% 2% 1%;">
# systemctl start zabbix-agent
# systemctl enable zabbix-agent
</pre><br/></li>
</ul>
</li>
<li>방화벽 포트설정<ul>
<li>/etc/firewalld/zones/public.xml 내 추가<pre style="background:#EFEFEF; margin:2% 1% 2% 1%;">
＜port protocol="tcp" port="10050"/＞
</pre></li>
<li>방화벽 설정적용 및 확인<pre style="background:#EFEFEF; margin:2% 1% 2% 1%;">
＃ firewall-cmd --reload
＃ firewall-cmd --list-ports
</pre><br/></li>
</ul>
</li>
<li>Done!</li>
</ol>
<hr>
<h1 id="4-references">4. References</h1>
<ul>
<li><a href="https://www.zabbix.com/download?zabbix=5.0&amp;os_distribution=centos&amp;os_version=7&amp;db=mysql&amp;ws=nginx">zabbix.com</a></li>
<li><a href="https://rainofpainki.github.io/zabbix_agent_for_centos/">Zabbix 설치 for CentOS6</a></li>
<li><a href="https://foxydog.tistory.com/16">Installing Zabbix Agent on CentOS</a></li>
<li><a href="https://growingsaja.tistory.com/119">Installing Zabbix Agent on Win10</a></li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python 소개 및 Anaconda 설치]]></title>
            <link>https://velog.io/@nao_snow/Anaconda-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@nao_snow/Anaconda-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Thu, 07 Oct 2021 06:31:00 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/nao_snow/post/b9ab0e53-936d-4c5d-bb67-ac64202bc952/image.png" alt=""><img src="https://images.velog.io/images/nao_snow/post/c832ffac-9af6-42ac-8f15-b74e12397fb9/image.png" width="480px" /></p>
<h1 id="1-python-소개">1. Python 소개</h1>
<ul>
<li><p>파이썬이란?</p>
<blockquote>
<p><a href="ko.wikipedia.org/wiki/%ED%8C%8C%EC%9D%B4%EC%8D%AC">파이썬 in Wikipedia</a></p>
<p>1991년 귀도 반 로섬이 발표한 고급 프로그래밍 언어
플랫폼에 독립적이며 인터프리터식, 객체지향적, 동적 타이핑(dynamically typed) 대화형 언어
데이터 분석 영역에서 가장 많이 사용하고 있는 언어</p>
</blockquote>
</li>
<li><p>특징</p>
<ul>
<li>오픈소스 → 누구나 무료로 사용가능</li>
<li>기능 업그레이드중이며, 패키지를 통해 고급기능 사용가능</li>
<li>동적 타이핑(dynamically typed)</li>
<li>모듈, 클래스, 객체와 같은 언어의 요소가 내부에서 접근가능</li>
</ul>
</li>
</ul>
<hr>
<h1 id="2-anaconda-소개">2. Anaconda 소개</h1>
<ul>
<li>아나콘다(Anaconda)란?<blockquote>
</blockquote>
머신러닝이나 데이터 분석 등에 사용하는 많은 패키지가 기본적으로 포함된 파이썬 배포판
위에 언급한 분야를 파이썬으로 접근하고자 할 때 세팅이 매우 용이</li>
</ul>
<h1 id="3-anaconda-설치">3. Anaconda 설치</h1>
<ul>
<li><p>Download the graphical macOS Installer (<a href="https://www.anaconda.com/">anaconda.com</a>)</p>
<img src="https://images.velog.io/images/nao_snow/post/8afb5b0c-3814-48a4-ae97-ac30ae2a6fd2/anaconda.com.png" />
<img src="https://images.velog.io/images/nao_snow/post/1b05d0bb-66d8-4b0c-aa6d-c2da72049ccf/anaconda_individual_edition.png"/>
</li>
<li><p>Steps for installing anaconda</p>
<ul>
<li><img src="https://images.velog.io/images/nao_snow/post/5dbb872a-83ab-4924-b28f-72a0772f11ca/image.png" alt=""></li>
<li><img src="https://images.velog.io/images/nao_snow/post/8e43a9f0-2de2-4760-9fb0-6ed9db8bd83f/image.png" alt=""></li>
<li><img src="https://images.velog.io/images/nao_snow/post/f9c2aa10-a7e9-44ad-a0f2-3193f95a0485/image.png" alt=""></li>
<li><img src="https://images.velog.io/images/nao_snow/post/a7feb110-5f77-494f-a9dc-67bff6210d23/image.png" alt=""></li>
</ul>
</li>
</ul>
<hr>
<h1 id="4-jupyter-notebook-실행">4. Jupyter Notebook 실행</h1>
<ul>
<li><p>Launch a Jupyter notebook</p>
<pre><code>$ [Anaconda 설치 path]/bin/jupyter-notebook</code></pre><p><img src="https://images.velog.io/images/nao_snow/post/93605539-152e-4b0f-af34-37547944c53d/executed.png" alt=""></p>
<ul>
<li>Initial Page
<img src="https://images.velog.io/images/nao_snow/post/354f938e-42d2-492b-9b4b-4e9446057edf/jupyter.png" alt=""></li>
</ul>
</li>
<li><p>Done</p>
</li>
</ul>
<hr>
<h1 id="5-references">5. References</h1>
<ul>
<li><a href="https://www.anaconda.com">Anaconda.com</a></li>
<li><a href="https://greeksharifa.github.io/references/2019/01/26/Jupyter-usage/">Jupyter Notebook 사용법</a></li>
</ul>
<hr>
]]></description>
        </item>
    </channel>
</rss>