<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jooh.log</title>
        <link>https://velog.io/</link>
        <description>vis ta vie🌿</description>
        <lastBuildDate>Wed, 25 Jan 2023 14:32:52 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>jooh.log</title>
            <url>https://images.velog.io/images/jooh_archive/profile/ce410d40-c1ea-46c4-a35b-17ab6df56760/민증&amp;운전1.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. jooh.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jooh_archive" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[python3/ dictionary와 tuple]]></title>
            <link>https://velog.io/@jooh_archive/python3-dictionary%EC%99%80-tuple</link>
            <guid>https://velog.io/@jooh_archive/python3-dictionary%EC%99%80-tuple</guid>
            <pubDate>Wed, 25 Jan 2023 14:32:52 GMT</pubDate>
            <description><![CDATA[<h1 id="dictionary">Dictionary</h1>
<h4 id="선언">선언</h4>
<p>dict_basic.py</p>
<pre><code>wintable = {
    ‘가위’:‘보’,
    ‘바위’:‘가위,
    ‘보’:‘바위’
}
## 아래와 같이 key 값을 index처럼 접근
print(wintable[’가위‘]) # 보 출력됨</code></pre><pre><code>def rsp(mine, yours) : 
    if mine == yours : 
        return ‘draw’
    eif wintable[mine] == yours:
        return ‘win’
    else :
        return ‘lost’

result = rsp(‘가위’, ‘바위’)
print(result)

messages = {
    ‘Win’:‘이겼다!‘,
    ’draw‘:’비겼네‘,
    ’lose‘:‘졌어..’
}
print(messages[result])




            ↓ 이름표는 문자열 또는 숫자를 주로 사용하지만
dict = {     &quot;이름표&quot;    :    [1,2,3] }
                           ↑ 값은 리스트를 포함해서 무엇이든 올 수 있습니다.

print( dict[&quot;이름표&quot;] )</code></pre><h4 id="딕셔너리-수정">딕셔너리 수정</h4>
<p>추가</p>
<pre><code>dict[&#39;three&#39;] = 3
##cf. 리스트는 list.append(추가할원소)</code></pre><p>수정</p>
<pre><code>dict[&#39;one&#39;] = 11</code></pre><p>삭제</p>
<pre><code>del(dict[&#39;one&#39;])
dict.pop(&#39;two&#39;) ##지우는 값을 return 해줌</code></pre><h3 id="딕셔너리와-반복문">딕셔너리와 반복문</h3>
<pre><code>ages = {‘Tod’:35, ‘Jane’:23, ‘Paul’:62}
for key in ages.keys(){
    print(key)
}
for value in ages.values(){
    print(value)
}
for key in ages.keys(){ ## ages.keys 대신 ages만 써도 무방
    print(‘{}의 나이는 {}입니다.‘.format(key, ages[key])
}
for key, value in ages.items(){ ## items함수로 key, value둘다 리턴
    print(‘{}의 나이는 {}입니다.‘.format(key, value))
}
## 리스트와 달리 딕셔너리는 순서를 저장하지않음</code></pre><h3 id="list와-dictionary-비교">list와 dictionary 비교</h3>
<p>공통점
<img src="https://velog.velcdn.com/images/jooh_archive/post/838213e4-a9fa-4ffc-aef2-5911a1b0498f/image.png" alt=""></p>
<p>차이점
<img src="https://velog.velcdn.com/images/jooh_archive/post/3343ab50-f9d6-4226-81a4-96a7c2e0bb18/image.png" alt=""></p>
<h1 id="tuple">Tuple</h1>
<p>한번 정해진 순서를 바꿀 수 없다.</p>
<h4 id="선언-1">선언</h4>
<pre><code>tuple1 = (1, 2, 3, 4)
tuple2 = 1, 2, 3, 4 ##괄호 없이도 튜플생성 가능
mylist = [1,2,3,4]
tuple3 = tuple(mylist) ##리스트를 튜플로 만들기 가능</code></pre><h4 id="튜플-값-가져오기">튜플 값 가져오기</h4>
<pre><code>tuple3[1] #2 리턴. 인덱스로 접근 가능</code></pre><h4 id="튜플은-값의-변경과-삭제가-불가능">튜플은 값의 변경과 삭제가 불가능</h4>
<pre><code>tuple3[0] = 5 #에러.
del tuple3[0] #에러.
tuple3.pop[0] #에러.</code></pre><p>변수간의 값을 바꿀때나, 여러가지 값을 한번에 전달할때 활용됨</p>
<h3 id="튜플을-이용한-packing-unpacking">튜플을 이용한 packing, unpacking</h3>
<h4 id="packing">packing</h4>
<p>하나의 변수에 여러개의 값을 넣는 것 a, b : 1, 2 </p>
<h4 id="unpacking">unpacking</h4>
<p>패킹된 변수에서 여러개의 값을 꺼내오는 것</p>
<pre><code>c = (3, 4) 
d, e = c    # c의 값을 언패킹하여 d, e에 값을 넣었다
f = d, e    # 변수 d와 e를 f에 패킹</code></pre><p>예제</p>
<pre><code>x = 3
y = 5

position = x,y
print(&quot;x, y로 이루어진 튜플 position의 값은 {}입니다.”.format(position))
# x, y로 이루어진 튜플 position의 값은 (3, 5)입니다.</code></pre><h4 id="튜플-packing-unpacking의-활용">튜플 packing, unpacking의 활용</h4>
<p>두 변수의 값을 바꿀 때 임시변수가 필요 없다.</p>
<pre><code>x = 5
y = 10
## 보통 변수 바꿀때 임시변수 temp 활용
x = y
y = temp
y = temp
## 튜플을 이용한 변수 바꾸기
x,y = y,x</code></pre><p>함수의 리턴 값으로 여러 값을 전달할 수 있다.</p>
<pre><code>def tuple_func():
    return 1,2 //함수의 리턴값으로 튜플 이용
q,w = tuple_func()</code></pre><h3 id="튜플-리스트-딕셔너리와의-활용">튜플 리스트, 딕셔너리와의 활용</h3>
<h4 id="튜플-리스트-활용">튜플 리스트 활용</h4>
<pre><code>list = [1,2,3,4,5]
for i, v in enumerate(list): ## enumerate는 튜플로 값을 리턴
    print(‘[]번째 값: []‘.format(i,v))

for a in enumerate(list):
    print(&#39;{}번째 값: {}&#39;.format(a[0], a[1]))

for a in enumerate(list):
    print(&#39;{}번째 값: {}&#39;.format(*a)) ## 튜플을 쪼개라</code></pre><h4 id="튜플을-for-in-range로-하나씩-출력">튜플을 for in range로 하나씩 출력</h4>
<pre><code>for i in range( len(tuple1) ) :
    print(tuple1[i])</code></pre><h4 id="튜플-딕셔너리-활용">튜플 딕셔너리 활용</h4>
<pre><code>dict = {‘Tod’:35, ‘Jane’:23, ‘Paul’:62}

for key, val in dict.items():
    print(&#39;{}의 나이는:{}&#39;.format(key, val))

for a in dict.items():
    print(&#39;{}의 나이는:{}&#39;.format(a[0], a[1]))

for a in dict.items():
    print(&#39;{}의 나이는:{}&#39;.format(*a))</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Codility/ 6. Sorting - Distinct]]></title>
            <link>https://velog.io/@jooh_archive/Codility-6.-Sorting-Distinct</link>
            <guid>https://velog.io/@jooh_archive/Codility-6.-Sorting-Distinct</guid>
            <pubDate>Tue, 03 Jan 2023 14:23:54 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<ul>
<li>N개의 정수로 이루어진 배열에서 distinct values의 개수를 찾아 반환하는 문제 </li>
</ul>
<h3 id="풀이">풀이</h3>
<pre><code>package Sorting;

import java.util.HashSet;
import java.util.Set;

/**
 * Distinct
 * Compute number of distinct values in an array.
 * @author juhyunlee
 *
 */
public class Distinct {
    public int solution(int[] A) {  

        Set set = new HashSet();
        for(int i:A) {
            set.add(i);
        } 

        //System.out.println(set);
        return set.size();

    }

}</code></pre><h3 id="시간복잡도">시간복잡도</h3>
<ul>
<li>O(n) or O(N*log(N))</li>
</ul>
<h3 id="설명">설명</h3>
<p>자바 Set 컬렉션을 이용해서 풀이했다.</p>
<blockquote>
<p><strong>SET</strong>
순서의 의미가 없지만, 데이터의 중복은 허용하지 않음.
HashSet을 이용해 데이터를 추가(add)하거나 추출(next)할 수 있음.
또한 Iterator를 이용해서 추출할 수 있음 
null 값을 저장할 수 있음</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[DB INDEX란 무엇인가]]></title>
            <link>https://velog.io/@jooh_archive/DB-INDEX%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80</link>
            <guid>https://velog.io/@jooh_archive/DB-INDEX%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80</guid>
            <pubDate>Sun, 25 Dec 2022 12:01:21 GMT</pubDate>
            <description><![CDATA[<h2 id="index의-개념">Index의 개념</h2>
<p>데이터베이스 테이블에 대한 검색 성능 속도를 높여주는 자료구조.
특정 컬럼에 인덱스를 생성하면, 해당 컬럼의 데이터와 그 데이터의 실제 물리적 구조의 주소와 함께 별도 테이블에 저장된다.</p>
<p>이렇게 생성된 인덱스는 쿼리 내에 ‘인덱스가 생성된 컬럼을 where 조건으로 거는 등’의 작업을 통해 사용된다. 이는 Optimizer의 판단 하에 사용여부가 결정된다.</p>
<p><img src="https://velog.velcdn.com/images/jooh_archive/post/fb3f82a6-0224-4f20-9fc2-729ec3416483/image.png" alt=""></p>
<p> 만약 인덱스가 타게되면, 위 그림과 같이 인덱스에 저장되어 있는 데이터의 물리적 주소(Location)로 가서, 데이터를 가져오는 식으로 동작을 하여 검색 속도의 향상을 가져온다.</p>
<h2 id="index를-사용하는-이유">Index를 사용하는 이유</h2>
<p>인덱스의 가장 큰 특징은 데이터들이 정렬이 되어있다는 점이다. 이 특징으로 인해 조회라는 기능에 있어 굉장한 장점을 가진다.</p>
<h4 id="1-조건-검색-where-절의-효율성">1) 조건 검색 where 절의 효율성</h4>
<p>테이블을 만들고 안에 데이터가 쌓이게 되면, 테이블의 레코드 내에는 순서가 없이 뒤죽박죽으로 저장된다. 따라서 where 절의 특정 조건에 맞는 데이터들을 찾아 낼 때에 레코드의 처음부터 끝까지 다 읽기 때문에 Full Table Scan을 타게된다.
하지만 인덱스 테이블은 데이터들의 정렬되어 저장되어 있기 떄문에, 해당 where 조건에 맞는 데이터를 빠르게 찾아낼 수 있다.</p>
<h4 id="2-정렬-order-by-절의-효율성">2) 정렬 Order by 절의 효율성</h4>
<p>인덱스를 사용하면 order by에 의한 sort 과정을 피할 수 가 있다. order by는 1차적으로 메모리에서 정렬이 이루어지고, 메모리보다 큰 작업이 필요하다면 디스크 I/O도 추가적으로 발생되는 굉장히 부하가 많이 걸리는 작업이다. 하지만 인덱스를 사용하면 이미 정렬이 되어있기에 이러한 전반적인 자원 소모가 필요하지 않다.</p>
<h4 id="3-min-max의-효율적인-처리">3) Min, Max의 효율적인 처리</h4>
<p>이 또한 정렬되어있기에 얻을 수 있는 장점이다. min과 max값을 레코드의 시작값과 끝값 한건씩만 가져오면 되기 때문에 Full Table Scan으로 테이블 값을 다 뒤져서 작업하는 것보다 훨씬 효율적으로 찾을 수 있다.</p>
<h2 id="index의-단점">Index의 단점</h2>
<p>정렬된 상태를 계속 유지 시켜줘야 하기 때문에, 레코드 내 데이터 값이 바뀐다면 악영향을 미친다. INSERT/UPDATE/DELETE를 통해 데이터가 추가되거나 값이 바뀐다면 인덱스 테이블 내에 있는 값들도 다시 정렬을 해야하므로, 인덱스 테이블과 원본 테이블 이렇게 두군데에 데이터 수정 작업이 필요하다.</p>
<blockquote>
<p>INSERT : 새로운 데이터에 대한 인덱스를 추가한다.
DELETE : 삭제하는 데이터의 인덱스를 사용하지 않는다.
UPDATE : 기존의 인덱스를 사용하지 않음 처리하고, 갱신된 데이터에 대해 인덱스를 추가한다.</p>
</blockquote>
<p>이런 부하를 최소화하기 위해 인덱스는 데이터 삭제라는 개념에서 인덱스를 사용하지 않는다 라는 작업으로 이를 대신합니다. </p>
<p>또한 검색 시에도 인덱스가 무조건 좋은것은 아니다.테이블의 전체 데이터 중 10~15% 이하의 데이터를 처리하는 경우에만 효율적이다.(그 이상의 데이터를 처리할 때에는 인덱스를 사용하지 않는 것이 더 낫다.)</p>
<p>또한 인덱스를 관리하기 위해서는 데이터베이스의 10%에 해당하는 저장공간이 필요하다.</p>
<h2 id="index-생성-기준">Index 생성 기준</h2>
<p>생성된 인덱스를 가장 효율적으로 사용하려면 데이터의 분포도는 최대한으로 그리고 조건절에 호출 빈도는 자주 사용되는 컬럼을 인덱스로 생성하는 것이 좋다. 인덱스는 특정 컬럼을 기준으로 생성하고 기준이 된 컬럼으로 정렬된 인덱스 테이블이 생성된다. 이 기준 컬럼은 최대한 중복이 되지 않는 값이 좋다. 가장 최선은 PK로 인덱스를 거는 것이다. 중복된 값이 없는 인덱스 테이블이 최적의 효율을 발생시키겠고. 반대로 모든 값이 같은 컬럼이 인덱스 컬럼이 된다면 인덱스로써의 가치가 없다고 봐야 한다.
 </p>
<blockquote>
<ol>
<li>조건절에 자주 등장하는 컬럼</li>
<li>항상 = 으로 비교되는 컬럼</li>
<li>중복되는 데이터가 최소한인 컬럼 (분포도가 좋은) 컬럼</li>
<li>ORDER BY 절에서 자주 사용되는 컬럼</li>
<li>조인 조건으로 자주 사용되는 컬럼</li>
</ol>
</blockquote>
<p>출처 <a href="https://coding-factory.tistory.com/746">https://coding-factory.tistory.com/746</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Nodejs #1. 개발환경 구축]]></title>
            <link>https://velog.io/@jooh_archive/Nodejs-1.-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95</link>
            <guid>https://velog.io/@jooh_archive/Nodejs-1.-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95</guid>
            <pubDate>Wed, 14 Dec 2022 15:05:36 GMT</pubDate>
            <description><![CDATA[<h3 id="nodejs-설치">nodejs 설치</h3>
<p><a href="https://nodejs.org/">https://nodejs.org/</a> 에서 다운로드
설치하는 PC의 OS 종류에 따라 Windows or MacOS가 보이며,
좀 더 안정화된 버전인 LTS 버전으로 다운로드 받도록한다.
다운로드 받은 파일을 실행시키면 설치된다.
<img src="https://velog.velcdn.com/images/jooh_archive/post/aa759428-98ed-4b78-8d69-10f65670a827/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jooh_archive/post/1f13defc-3cb0-4092-9c8a-a455fb0f338c/image.png" alt="">
설치가 완료되면 설치경로가 위와 같이 표현된다.</p>
<p>설치 확인 방법 : cmd 화면에서 <strong><em>node -v</em></strong> 명령어를 통해 확인 가능하다.
<img src="https://velog.velcdn.com/images/jooh_archive/post/a5ba22e3-2976-4efb-b48a-a5f360941fda/image.png" alt=""></p>
<h3 id="nodejs-실행-테스트">nodejs 실행 테스트</h3>
<p>js파일 하나를 만들어 저장한다. (인코딩: UTF-8)
<img src="https://velog.velcdn.com/images/jooh_archive/post/38bd7e8c-6d6b-4791-a8bd-90ec232dde0a/image.png" alt=""></p>
<p>cmd 창에서 js파일이 저장된 위치로 이동해, <em><strong>node</strong></em> 명령어를 통해 js파일을 실행한다.
<img src="https://velog.velcdn.com/images/jooh_archive/post/77885342-683e-4c17-a09f-369f26c0f8ce/image.png" alt=""></p>
<h3 id="nodeclipse-사용하기">nodeclipse 사용하기</h3>
<ul>
<li>java 1.8 (java.sun.com)</li>
<li>eclipse : Java EE Developers (<a href="http://www.eclipse.org/home">www.eclipse.org/home</a>)</li>
</ul>
<p>이클립스 내에서 nodejs 개발을 할 수 있는 환경을 구축한다.
2018년도까지는 <em><strong>nodeclipse</strong></em> 라는 plugin명으로 검색하여 설치해 사용했지만, 그 이후부터는 버전업이 되어 <strong><em>Enide</em></strong> 라는 이름으로 배포되고 있다.</p>
<p>Help &gt; Eclipse Marketplace
<img src="https://velog.velcdn.com/images/jooh_archive/post/864ff842-349b-44e0-b94e-f7eddacd8b5b/image.png" alt="">
첫번째 항목인 <strong><em>Enide (Studio) 2015</em></strong> 을 Install 하면 된다.</p>
<p>경고메세지는 무시한 채 계속 설치하고, 설치가 완료되면 _Installed _라고 표시된다.</p>
<p>설치가 완료되면, Open Perspective 버튼을 클릭하여 Nodejs 개발을 할 수 있는 perspective로 이동해준다. </p>
]]></description>
        </item>
    </channel>
</rss>